前几天遇到一个需求,需要把一个有几万行有规则数据的excel文件拆分成N个excel文件,例如以下excel表格中包括以张三,李四,王五的各科考试成绩,每个学生的学号是唯一的,现在要求把每个人的成绩数据分开来生成独立的表格数据,并以学号作为文件名。
思路: 使用HashMap,用每个工作表作为值,用学号作为键。遍历原始工作表中的每一行,以学号为键去HashMap对象中取工作表,如果不存在,那么主新建一个工作表,写入此行数据并保存工作表在HashMap对象中。如果以当前行的学号作为键可以取到工作表,则取出工作表,并将当前行写入工作表,并重新保存工作表到HashMap对象中。最后遍历HashMap对象,重新生成Excel文件。
以下为实现代码
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.FileInputStream; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFDataFormat; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelSplit { public static void main(String[] args){ try { System.out.println("开始拆分....."); Map<String, XSSFWorkbook> map=getSplitMap("D:/xxxx.xlsx");//得到拆分后的子文件存储对象 createSplitXSSFWorkbook(map, "D:/splitdone/201404", "2014.04");//遍历对象生成的拆分文件 System.out.println("拆分结束,文件被拆分为"+map.size()+"个文件."); } catch (Exception e) { e.printStackTrace(); } } //将第一列的值作为键值,将一个文件拆分为多个文件 public static Map<String,XSSFWorkbook> getSplitMap(String fileName) throws Exception{ Map<String,XSSFWorkbook> map=new HashMap<String,XSSFWorkbook>(); InputStream is = new FileInputStream(new File(fileName)); //根据输入流创建Workbook对象 Workbook wb = WorkbookFactory.create(is); //get到Sheet对象 Sheet sheet = wb.getSheetAt(0); Row titleRow=null; //这个必须用接口 int i=0; for(Row row : sheet){//遍历每一行 if(i==0){ titleRow=row;//得到标题行 }else{ Cell keyCell=row.getCell(0); String key=keyCell.getRichStringCellValue().toString(); XSSFWorkbook tempWorkbook=map.get(key); if(tempWorkbook==null){//如果以当前行第一列值作为键值取不到工作表 tempWorkbook= new XSSFWorkbook(); Sheet tempSheet=tempWorkbook.createSheet(); Row firstRow=tempSheet.createRow(0); for(short k=0;k<titleRow.getLastCellNum();k++){//为每个子文件创建标题 Cell c=titleRow.getCell(k); Cell newcell=firstRow.createCell(k); newcell.setCellValue(c.getStringCellValue()); } map.put(key,tempWorkbook); } Sheet secSheet=tempWorkbook.getSheetAt(0); Row secRow=secSheet.createRow(secSheet.getLastRowNum()+1); for(short m=0;m<row.getLastCellNum();m++){ Cell newcell=secRow.createCell(m); setCellValue(newcell,row.getCell(m),tempWorkbook); } map.put(key,tempWorkbook); } i=i+1;//行数加一 } return map; } //创建文件 public static void createSplitXSSFWorkbook(Map<String, XSSFWorkbook> map,String savePath,String month) throws IOException { Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); String key = (String) entry.getKey(); XSSFWorkbook val = (XSSFWorkbook) entry.getValue(); File filePath=new File(savePath); if(!filePath.exists()){ System.out.println("存放目录不存在,自动为您创建存放目录."); filePath.mkdir(); } if(!filePath.isDirectory()){ System.out.println("无效文件目录"); return ; } File file=new File(savePath+"/"+key+"_"+month+".xlsx"); FileOutputStream fOut;// 新建输出文件流 try { fOut = new FileOutputStream(file); val.write(fOut); // 把相应的Excel工作薄存盘 fOut.flush(); fOut.close(); // 操作结束,关闭文件 } catch (FileNotFoundException e) { System.out.println("找不到文件"); } } } //将一个单元格的值赋给另一个单元格 public static void setCellValue(Cell newCell,Cell cell,XSSFWorkbook wb){ if(cell==null){ return; } switch(cell.getCellType()){ case Cell.CELL_TYPE_BOOLEAN: newCell.setCellValue(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_NUMERIC: if(DateUtil.isCellDateFormatted(cell)){ XSSFCellStyle cellStyle =wb.createCellStyle(); XSSFDataFormat format= wb.createDataFormat(); cellStyle.setDataFormat(format.getFormat("yyyy/m/d")); newCell.setCellStyle(cellStyle); newCell.setCellValue(cell.getDateCellValue()); }else{ //读取数字 newCell.setCellValue(cell.getNumericCellValue()); } break; case Cell.CELL_TYPE_FORMULA: newCell.setCellValue(cell.getCellFormula()); break; case Cell.CELL_TYPE_STRING: newCell.setCellValue(cell.getStringCellValue()); break; } } }
有任何问题请联系qq 359709421
如果您觉得我的文章给了您帮助,请为我买一杯饮料吧!以下是我的支付宝,意思一下我将非常感激!
相关推荐
拆分Excel表格通常是为了将数据分成多个逻辑部分。在POI中,我们可以通过查找空行并创建新的Sheet来实现这个功能。以下是实现步骤: 1. 遍历所有行:从Sheet的第一行开始,使用RowIterator遍历每一行。 2. 检测...
本文将深入探讨Java编程语言中如何使用Apache POI库和JExcelAPI(JXL)来读取、写入及操作Excel文件,同时也包括设置列宽以及处理合并或拆分的单元格内容。 首先,Apache POI是Apache软件基金会的一个开源项目,专...
Apache POI 是一个开源项目,专门用于处理微软的Office文档格式,如Word(.doc、.docx)、Excel(.xls、.xlsx)、PowerPoint(.ppt、.pptx)等。版本3.7是该项目的一个历史版本,发布于2010年10月29日。这个版本的...
Apache POI是一个流行的Java库,它允许开发者创建、修改和显示Microsoft Office格式的文件,包括Excel。本项目“poi多线程大数据导出excel文件”提供了一个解决方案,利用多线程来提高Excel的大数据导出效率。 ...
标题中的“POI单元格的合并、数据行的分组以及Excel窗口的冻结”涉及到Apache POI库在处理Microsoft Excel文档时的一些高级功能。Apache POI是一个流行的Java库,它允许程序员创建、修改和显示MS Office格式的文件,...
综上所述,Java导入Excel文件涉及的关键技术包括Apache POI库的使用,对HSSF和XSSF的理解,以及对CSV文件处理的技巧。通过熟练掌握这些知识,你可以编写出高效且健壮的文件导入程序,满足各种需求。
6. **生成Excel文件**:虽然CSV文件可以直接在Excel中打开,但如果你想生成真正的Excel文件(.xlsx),需要使用库如Apache POI。这个库允许你在Java中创建、修改和处理Microsoft Office格式的文件,包括Excel。创建...
Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Word(.doc, .docx)、Excel(.xls, .xlsx)和PowerPoint(.ppt, .pptx)。这个压缩包包含了Apache POI的最新版本3.17的所有jar包,这使得...
Apache POI 是一个开源项目,专门用于处理微软的Office文档格式,如Excel、Word和PowerPoint。POI 提供了 Java API,使得开发者能够在 Java 应用程序中创建、修改和读取这些文档。在标题和描述中提到的 "poi4" 和 ...
Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,如Word(.doc, .docx)、Excel(.xls, .xlsx)和PowerPoint(.ppt, .pptx)。这个库允许开发者在Java应用程序中创建、读取和修改这些文件,...
在Java开发中,Apache POI库是一个非常实用的工具,用于读取、写入和修改Microsoft Office格式的文件,如Word、Excel和PowerPoint。在处理大量文档时,有时我们需要替换文档中的特定文本或图片,这正是Apache POI库...
Apache POI是一个流行的开源库,主要用来处理Microsoft Office格式的文件,如Word(.doc/.docx)、Excel(.xls/.xlsx)和PowerPoint(.ppt/.pptx)。 首先,让我们深入理解Apache POI库。它是Java平台上的一个API,...
Apache POI允许Java程序读取和写入Word、Excel文件,使Lucene能够提取其中的文本进行索引。以下是一般步骤: 1. **读取Word文档**:使用Apache POI的HWPFDocument类打开DOC文件,XWPFDocument类打开DOCX文件。然后...
首先,`jxls2`是一个强大的Java库,它扩展了Apache POI库的功能,使得开发者能够以声明式的方式来定义Excel模板,并将Java对象的数据填充到模板中,生成动态的Excel报表。这种工作方式极大地简化了Excel导出的编程...
Java语言在处理电子表格时,通常使用Apache POI库,这是一个强大的开源库,专门用于读取、创建和修改Microsoft Office格式的文件,包括Excel电子表格。在这个场景中,描述提到的任务是读取9列数据,然后重新组合为7...
- **Apache POI**:这是一个广泛使用的Java库,用于读写Microsoft Office格式的文件,包括Excel。在多线程环境下,可以利用POI的API处理工作簿、工作表和单元格,确保线程安全地读写数据。 - **OpenCSV**:虽然...
对于与Excel的交互,我们可以利用Apache POI库,这是一个强大的API,用于读取、写入和修改Microsoft Office格式的文件,包括Excel。以下是步骤: 1. 创建一个`HSSFWorkbook`对象来表示一个新的Excel工作簿。 2. ...
- 文档中指出了使用XSSFWorkbook来创建.xlsx格式的Excel表格。创建表格后,还需创建行(Row)与单元格(Cell),并最终写入数据。 3. **后端数据处理** - 后端代码首先创建了一个Excel工作簿(Workbook),然后创建了一...
在这个场景中,我们将深入探讨如何使用POI进行单元格的合并、数据行的分组以及Excel窗口的冻结,同时也会涉及如何设计和实现表格数据统计。 ### 1. 单元格的合并 单元格合并是在Excel中常见的需求,特别是在报表和...