当前位置:   article > 正文

easyexcel基于模板的数据导出及自定义表头_easyexcel导出自定义表头

easyexcel导出自定义表头

需求背景:需要将数据导出成excel格式,但是表头信息不确定和表头格式复杂,基于代码也可以实现,但是代码实现复杂,且后续需要改动时成本较大,所以选择依赖模板的形式进行数据导出,将提前准备好的模板放置在指定路径下,数据导出的时候依赖指定模板即可

依赖包导入:此处使用的版本是2.2.3,相关版本可以根据具体的项目要求进行依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>easyexcel</artifactId>
  4. <version>2.2.3</version>
  5. </dependency>

具体实现:模板中需要设置一些数据导出的时候需要替换的文字

(1)依赖模板单sheet数据导出

代码实现:

  1. import java.io.ByteArrayInputStream;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  10. import org.springframework.stereotype.Component;
  11. import com.alibaba.excel.EasyExcel;
  12. import com.alibaba.excel.ExcelWriter;
  13. import com.alibaba.excel.write.metadata.WriteSheet;
  14. /**
  15. * @author:xhwang
  16. * @date:2022年12月9日
  17. * @description:依赖模板数据导出,单个sheet页面
  18. * @version:1.0
  19. * @param:sheetName:每个sheet页面名称 data:每个sheet页面填充的数据 templatePath:模板路径 filePath:生成文件路径 map:替换模板中的正则表达式 fileName:文件名称
  20. */
  21. public static void export(List<List<Object>> data,String templatePath,String filePath,Map<String, Object> map,String fileName){
  22. ExcelWriter excelWriter = null;
  23. try{
  24. excelWriter = EasyExcel.write(filePath).withTemplate(templatePath).registerWriteHandler(new ColumnStyle()).build();
  25.     //map中存储需要替换模板中item的数据,例如表格表头需要显示2013级,那么map中需要传入的数据为("item",2013)
  26. WriteSheet writeSheet = EasyExcel.writerSheet(0,map.get("item") != null ? map.get("item").toString(): fileName).build();
  27. excelWriter.write(data, writeSheet);
  28. excelWriter.fill(map, writeSheet);
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. }finally{
  32. excelWriter.finish();
  33. }
  34. }

(2)依赖多模板的多sheet页面数据导出,具体的需求为,导出的数据中有50家单位的数据,需要将每家单位的数据导出为一个sheet页,其中一家单位的表头和其余49家单位的表头不一样,所以我们的模板需要设置两个sheet,两个sheet的表头不一样,第一家使用模板的第一个sheet,其余49家使用第二个sheet,所以在数据导出的时候就需要对模板中第二个sheet进行拷贝

模板中第一个sheet如下:

第二个sheet如下:

代码实现:

  1. /**
  2. * @author:xhwang
  3. * @date:2022年12月9日
  4. * @description: 利用模板导入多个Sheet,需要克隆模板Sheet,此处为特殊需求,模板中有两个sheet,导出的excel有很多sheet,导出的excel第一个sheet用模板里面第一个sheet,其余的sheet用模板里面第二个sheet
  5. * @version:1.0
  6. * @param:sheetName:每个sheet页面名称 data:每个sheet页面填充的数据 templatePath:模板路径 filePath:生成文件路径
  7. */
  8. public static void exportMoreSheet(List<String> sheetName,List<List<List<Object>>> data,String templatePath,String filePath){
  9. FileInputStream fileInputStream= null;ExcelWriter excelWriter = null;ByteArrayOutputStream bos = new ByteArrayOutputStream();
  10. try {
  11. fileInputStream = new FileInputStream(templatePath);
  12. XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
  13. for (int i = 0; i < sheetName.size(); i++) {
  14. if(i<=1){
  15. workbook.setSheetName(i, sheetName.get(i));
  16. }else{
  17. workbook.cloneSheet(1, sheetName.get(i));//导出的文件自第二个sheet页开始使用模板中的第二个sheet,需要按照数据对模板中的第二个sheet进行制定长度的克隆
  18. }
  19. }
  20. //写到流里
  21. workbook.write(bos);
  22. byte[] bArray = bos.toByteArray();
  23. InputStream is = new ByteArrayInputStream(bArray);
  24. //输出文件路径
  25. excelWriter = EasyExcel.write(filePath).withTemplate(is).build();
  26. Map<String,Object> map = new HashMap<String, Object>();
  27. for (int i = 0; i < sheetName.size(); i++) {
  28. WriteSheet writeSheet = EasyExcel.writerSheet(i,sheetName.get(i)).registerWriteHandler(new MoreSheetStyle()).build();
  29. excelWriter.write(data.get(i), writeSheet);
  30. map.put("item", sheetName.get(i));
  31. excelWriter.fill(map, writeSheet);
  32. }
  33. } catch (IOException e) {
  34. e.printStackTrace();
  35. }finally{
  36. try {
  37. fileInputStream.close();
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. excelWriter.finish();
  42. }
  43. }

代码中涉及到的CloumnStyle.java和MoreSheetStyle.java两个类都是对导出数据样式的一些自定义细微调整,可以根据自己的实际需要进行设置

  1. import java.util.List;
  2. import org.apache.poi.ss.usermodel.BorderStyle;
  3. import org.apache.poi.ss.usermodel.Cell;
  4. import org.apache.poi.ss.usermodel.CellStyle;
  5. import org.apache.poi.ss.usermodel.Font;
  6. import org.apache.poi.ss.usermodel.HorizontalAlignment;
  7. import org.apache.poi.ss.usermodel.Row;
  8. import org.apache.poi.ss.usermodel.VerticalAlignment;
  9. import org.apache.poi.ss.usermodel.Workbook;
  10. import com.alibaba.excel.metadata.CellData;
  11. import com.alibaba.excel.metadata.Head;
  12. import com.alibaba.excel.write.handler.CellWriteHandler;
  13. import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
  14. import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
  15. @SuppressWarnings("rawtypes")
  16. public class ColumnStyle implements CellWriteHandler {
  17. @Override
  18. public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {
  19. }
  20. @Override
  21. public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {
  22. }
  23. @Override
  24. public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
  25. List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
  26. Workbook workbook = writeSheetHolder.getSheet().getWorkbook();
  27. CellStyle cellStyle = workbook.createCellStyle();
  28. Font font = workbook.createFont();
  29. cellStyle.setBorderBottom(BorderStyle.THIN);
  30. cellStyle.setBorderLeft(BorderStyle.THIN);
  31. cellStyle.setBorderRight(BorderStyle.THIN);
  32. cellStyle.setBorderTop(BorderStyle.THIN);
  33. cell.setCellStyle(cellStyle);
  34. font.setFontHeightInPoints((short) 16);
  35. font.setFontName("宋体");
  36. font.setBold(true);
  37. cellStyle.setFont(font);
  38. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  39. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  40. }
  41. @Override
  42. public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
  43. CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
  44. }
  45. }

easyexcel做的比较灵活,可以根据自己实际要进行数据导出

官网地址:https://easyexcel.opensource.alibaba.com/docs/current/

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号