EasyExcel与Apache Poi快速掌握

Posted 慢跑中的小薛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EasyExcel与Apache Poi快速掌握相关的知识,希望对你有一定的参考价值。

1. 引言

   在工作中我经常要使用Excel进行批量导入与导出,只要是有关于Excel表格的都可以用得到poiEasyExcel下面就详细的介绍下其使用规则。

2. 注意事项

/**
* Excel的写入有分03版和07
* 区别: 03版写入是先写到缓存,在从缓存写到临时文件 最后写入速度相对快
* 03版最多写入65536行数据,07可以写入无限行数
* 07版是一次性全部写入 速度相对慢
*/


3. 由Excel分析到如何写代码

 

如图可知,一个完整的Excel组成应该有 1-4部分,那么我们在编写代码的时候也是一样的。

4. 由Excel映射到代码

 /** * 03版的Excel测试 * @throws Exception */ @Test public void ExcelWrite03() throws Exception{ //1.创建工作簿 Workbook workbook = new HSSFWorkbook();//HSSFWorkbook为03版的Excel //2.创建工作页 Sheet sheet = workbook.createSheet("03版测试Excel.xls"); //3.创建行 Row row = sheet.createRow(0); //4.创建列 Cell cell = row.createCell(0); //那么这里就可以确定为 第一行的第一列了 //5.设置值 cell.setCellValue("0_0"); //生成Excel try ( FileOutputStream outputStream = new FileOutputStream(PATH+"03版测试Excel.xls")){ workbook.write(outputStream); } }
/** * 07版的Excel测试 * @throws Exception */ @Test public void ExcelWrite07() throws Exception{ //1.创建工作簿 Workbook workbook = new XSSFWorkbook();//HSSFWorkbook为03版的Excel //2.创建工作页 Sheet sheet = workbook.createSheet("03版测试Excel.xls"); //3.创建行 Row row = sheet.createRow(0); //4.创建列 Cell cell = row.createCell(0); //那么这里就可以确定为 第一行的第一列了 //5.设置值 cell.setCellValue("0_0"); //生成Excel try ( FileOutputStream outputStream = new FileOutputStream(PATH+"03版测试Excel.xlsx")){ workbook.write(outputStream); } }

注意事项:03版的Excel最大支持的行数65536超过就会抛出异常

 /** * 03版大数据量的插入 */ @Test public void ExcelWriteBigData03() throws Exception{ //1.创建工作簿 Workbook workbook = new HSSFWorkbook();//HSSFWorkbook为03版的Excel //2.创建工作页 Sheet sheet = workbook.createSheet("03版测试Excel.xls");
for(int i=0;i<65536;i++){ Row row = sheet.createRow(i); for(int j=0;j<10;j++){ Cell cell = row.createCell(j); cell.setCellValue(j); } } try ( FileOutputStream outputStream = new FileOutputStream(PATH+"03大数据版测试Excel.xls")){ workbook.write(outputStream); }
}

异常如下

一个完整的Excel输出

/** * 判断Excel的不同类型,打印出不同类型之后输出 * @throws Exception */ @Test public void ExcelTypeRead() { try (FileInputStream in = new FileInputStream(PATH + "07大数据版测试Excel.xls");) { List<String> sheetList = new ArrayList<>(); Workbook workbook=new XSSFWorkbook(in); Sheet sheet = workbook.getSheetAt(0); Row rowTitle = sheet.getRow(0); if(rowTitle!=null) { //获取当前行下不为空的总列数 int cellCount = rowTitle.getPhysicalNumberOfCells(); for (int i = 0; i < cellCount; i++) { //获取每一列 Cell cell = rowTitle.getCell(i); if(null!=cell){ //获取数据类型 CellType cellType = cell.getCellType(); String cellValue = cell.getStringCellValue(); System.out.print(cellValue+"|"+cellType); } } } //获取总行数 int rowCount = sheet.getPhysicalNumberOfRows(); //第0行为标题行 不摄入统计 for(int row =1;row<rowCount;row++){ Row rowData = sheet.getRow(row); if(rowData!=null){ int cellCount = rowData.getPhysicalNumberOfCells(); for(int cell =0 ;cell<cellCount;cell++){ Cell cellData = rowData.getCell(cell); if(cellData!=null){ //获得一个枚举类 CellType cellType = cellData.getCellType(); switch (cellType){ case _NONE: break; case BLANK: break; case ERROR: break; case STRING: sheetList.add(cellData.getStringCellValue()); break; case BOOLEAN: sheetList.add(String.valueOf(cellData.getBooleanCellValue())); break; case FORMULA: //代表是一个Excel公式 sheetList.add(cellData.getCellFormula()); break; case NUMERIC: if(DateUtil.isCellDateFormatted(cellData)){ sheetList.add( new DateTime(cellData.getDateCellValue()).toString("yyyy-MM-dd")); break; }else{ sheetList.add(String.valueOf(cellData.getNumericCellValue())); break; } } } } } } System.out.println("数据"+sheetList); }catch (Exception e){ e.getMessage(); } }

EasyExcel的使用

 //关键代码 final static String PATH= "D:\\dev_workhome\\studyPoi\\test\\";
/** * EasyExcel的写操作 */ @Test public void easyExcelWrite() throws IOException { ForkJoinPool forkJoinPool = new ForkJoinPool(); ListUtils listUtils = new ListUtils(0,1000); List<User> listUsers = (List<User>) forkJoinPool.invoke(listUtils);// EasyExcel.write(PATH+"easyExcelTest.xlsx", User.class).sheet("sheet1").doWrite(listUsers); //写法二 一般用在重复多次写入一个Excel中 String fileName = PATH+ "easyExcelTest" + System.currentTimeMillis() + ".xlsx"; ExcelWriter excelWriter = EasyExcel.write(fileName, User.class).build(); WriteSheet writeSheet = EasyExcel.writerSheet("模板").build(); for (int i = 0; i <2; i++) { // 分页去数据库查询数据 这里可以去数据库查询每一页的数据 List<User> data = listUsers;//data() 数据库中查询的数据; excelWriter.write(data, writeSheet); } excelWriter.finish(); }
@Test public void easyExcelRead(){ String fileName = PATH+"easyExcelTest.xlsx"; EasyExcel.read(fileName,User.class,new UserDataListener()).sheet().doRead(); }


以上代码为关键代码,已将完整代码托管到git上

https://github.com/xhyou/poiAndEasyExcel

以上是关于EasyExcel与Apache Poi快速掌握的主要内容,如果未能解决你的问题,请参考以下文章

POI和EasyExcel

EasyExcel快速入门

EasyExcel快速入门

使用EasyExcel报错NoClassDefFoundError: org/apache/poi/util/TempFileCreationStrategy,并不Easy

easyexcel快速入门

POI和easyExcel