EasyExcel 实现冻结行和列

矫情吗;* 2022-10-15 04:50 350阅读 0赞

1 Maven依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>easyexcel</artifactId>
  4. <version>2.2.8</version>
  5. </dependency>
  6. <!--hutool工具包-->
  7. <dependency>
  8. <groupId>cn.hutool</groupId>
  9. <artifactId>hutool-all</artifactId>
  10. <version>5.5.1</version>
  11. </dependency>

2 CustomFreezeRowColHandler(自定义冻结行和列处理器)

  1. package com.easyexcel;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.alibaba.excel.write.handler.SheetWriteHandler;
  4. import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
  5. import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
  6. import org.apache.poi.ss.usermodel.Sheet;
  7. import java.util.ArrayList;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. import java.util.stream.Collectors;
  12. /**
  13. * 自定义冻结行和列处理器
  14. */
  15. public class CustomFreezeRowColHandler implements SheetWriteHandler {
  16. /**
  17. * sheet名称KEY
  18. */
  19. public static final String SHEETNAME_NAME = "sheetName";
  20. /**
  21. * 显示行号key
  22. */
  23. public static final String DISPLAYROWINDEX_NAME = "displayRowIndex";
  24. /**
  25. * 显示列号key
  26. */
  27. public static final String DISPLAYCOLINDEX_NAME = "displayColIndex";
  28. /**
  29. * 冻结列数key
  30. */
  31. public static final String FREEZECOLNUM_NAME = "freezeColNum";
  32. /**
  33. * 冻结行数key
  34. */
  35. public static final String FREEZEROWNUM_NAME = "freezeRowNum";
  36. /**
  37. * sheet页名称列表
  38. */
  39. private List<String> sheetNameList;
  40. /**
  41. * 冻结行和列信息
  42. */
  43. private List<Map<String, String>> freezeList = new ArrayList<>();
  44. /**
  45. * 创建冻结行列信息
  46. *
  47. * @param sheetName sheet页名称
  48. * @param freezeRowNum 冻结行数
  49. * @param freezeColNum 冻结列数
  50. * @return
  51. */
  52. public static Map<String, String> createFreezeMap(String sheetName, int freezeRowNum, int freezeColNum) {
  53. return createFreezeMap(sheetName, freezeRowNum, freezeColNum, 0, 0);
  54. }
  55. /**
  56. * 创建冻结行列信息
  57. *
  58. * @param sheetName sheet页名称
  59. * @param displayRowIndex 显示行号
  60. * @param displayColIndex 显示列号
  61. * @param freezeRowNum 冻结行数
  62. * @param freezeColNum 冻结列数
  63. * @return
  64. */
  65. public static Map<String, String> createFreezeMap(String sheetName, int freezeRowNum, int freezeColNum
  66. , int displayRowIndex, int displayColIndex) {
  67. Map<String, String> map = new HashMap<>();
  68. //sheet页名称
  69. map.put(SHEETNAME_NAME, sheetName);
  70. //显示行号
  71. map.put(DISPLAYROWINDEX_NAME, displayRowIndex + "");
  72. //显示列号
  73. map.put(DISPLAYCOLINDEX_NAME, displayColIndex + "");
  74. //冻结行数
  75. map.put(FREEZEROWNUM_NAME, freezeRowNum + "");
  76. //冻结列数
  77. map.put(FREEZECOLNUM_NAME, freezeColNum + "");
  78. return map;
  79. }
  80. public CustomFreezeRowColHandler(List<Map<String, String>> freezeList) {
  81. if (freezeList == null || freezeList.size() <= 0) {
  82. return;
  83. }
  84. freezeList = freezeList.stream().filter(x ->
  85. //判断sheet名称KEY是否存在
  86. x.keySet().contains(SHEETNAME_NAME) == true && x.get(SHEETNAME_NAME) != null
  87. && StrUtil.isNotBlank(x.get(SHEETNAME_NAME).toString())
  88. //判断显示行号KEY是否存在
  89. && x.keySet().contains(DISPLAYROWINDEX_NAME) == true && x.get(DISPLAYROWINDEX_NAME) != null
  90. && StrUtil.isNotBlank(x.get(DISPLAYROWINDEX_NAME).toString())
  91. //判断显示列号KEY是否存在
  92. && x.keySet().contains(DISPLAYCOLINDEX_NAME) == true && x.get(DISPLAYCOLINDEX_NAME) != null
  93. && StrUtil.isNotBlank(x.get(DISPLAYCOLINDEX_NAME).toString())
  94. //判断冻结列数KEY是否存在
  95. && x.keySet().contains(FREEZECOLNUM_NAME) == true && x.get(FREEZECOLNUM_NAME) != null
  96. && StrUtil.isNotBlank(x.get(FREEZECOLNUM_NAME).toString())
  97. //判断冻结行数KEY是否存在
  98. && x.keySet().contains(FREEZEROWNUM_NAME) == true && x.get(FREEZEROWNUM_NAME) != null
  99. && StrUtil.isNotBlank(x.get(FREEZEROWNUM_NAME).toString()))
  100. .collect(Collectors.toList());
  101. this.freezeList = freezeList;
  102. sheetNameList = this.freezeList.stream().map(x -> x.get(SHEETNAME_NAME).toString()).collect(Collectors.toList());
  103. }
  104. @Override
  105. public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
  106. }
  107. /**
  108. * sheet页创建之后调用
  109. *
  110. * @param writeWorkbookHolder
  111. * @param writeSheetHolder
  112. */
  113. @Override
  114. public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
  115. Sheet sheet = writeSheetHolder.getSheet();
  116. //不需要冻结行列,或者当前sheet页不需要冻结行列
  117. if (freezeList == null || freezeList.size() <= 0 || sheetNameList.contains(sheet.getSheetName()) == false) {
  118. return;
  119. }
  120. //获取当前sheet的冻结行列
  121. List<Map<String, String>> sheetMapList = freezeList.stream().filter(x ->
  122. StrUtil.equals(x.get(SHEETNAME_NAME).toString(), sheet.getSheetName())
  123. && StrUtil.equals(x.get(SHEETNAME_NAME).toString(), sheet.getSheetName())
  124. ).collect(Collectors.toList());
  125. //当前sheet页不需要冻结行列
  126. if (sheetMapList == null || sheetMapList.size() <= 0) {
  127. return;
  128. }
  129. for (Map<String, String> map : sheetMapList) {
  130. //显示行号
  131. int displayRowIndex = Integer.parseInt(map.get(DISPLAYROWINDEX_NAME));
  132. //显示列号
  133. int displayColIndex = Integer.parseInt(map.get(DISPLAYCOLINDEX_NAME));
  134. //冻结行数
  135. int freezeRowNum = Integer.parseInt(map.get(FREEZEROWNUM_NAME));
  136. //冻结列数
  137. int freezeColNum = Integer.parseInt(map.get(FREEZECOLNUM_NAME));
  138. sheet.createFreezePane(freezeColNum, freezeRowNum, displayColIndex, displayRowIndex);
  139. }
  140. }
  141. }

3 调试代码

  1. /**
  2. * 导出(冻结行和列)
  3. *
  4. * @param response
  5. */
  6. @GetMapping("/exportFreezeRowCol")
  7. public void exportFreezeRowCol(HttpServletResponse response) {
  8. try {
  9. //生成表格数据
  10. List<List<Object>> dataList = new ArrayList<>();
  11. dataList.add(new ArrayList<>(Arrays.asList(new Object[]{"表头11", "表头2", "表头3", "表头4"})));
  12. dataList.add(new ArrayList<>(Arrays.asList(new Object[]{"表头1", "表头2", "表头3", "表头4"})));
  13. dataList.add(new ArrayList<>(Arrays.asList(new Object[]{"表头31", "表头2", "表头3", "表头4"})));
  14. List<Map<String,String>> freezeList=new ArrayList<>();
  15. //导出文件
  16. String fileName = new String("文件名称.xls".getBytes(), "UTF-8");
  17. freezeList.add(CustomFreezeRowColHandler.createFreezeMap("模板",1,2));
  18. response.addHeader("Content-Disposition", "filename=" + fileName);
  19. //设置类型,扩展名为.xls
  20. response.setContentType("application/vnd.ms-excel");
  21. ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).registerWriteHandler(new CustomFreezeRowColHandler(freezeList)).build();
  22. WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
  23. WriteSheet writeSheet2 = EasyExcel.writerSheet("模板2").build();
  24. excelWriter.write(dataList, writeSheet);
  25. excelWriter.write(dataList, writeSheet2);
  26. // 千万别忘记finish 会帮忙关闭流
  27. excelWriter.finish();
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. }

4 调试结果

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4OTc0NjM4_size_16_color_FFFFFF_t_70

发表评论

表情:
评论列表 (有 0 条评论,350人围观)

还没有评论,来说两句吧...

相关阅读