小言_互联网的博客

使用easyexcel导出时行高不自动调整的解决

960人阅读  评论(0)

easyexcel在使用模板填充的方式时,有些文字比较长,需要设置自动换行显示,文档中并没有在此处说明如何设置,翻到前面的写excel中有设置自定义样式的方式,照着搬过来即可:


  
  1. // 内容的策略
  2. WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
  3. // 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
  4. contentWriteCellStyle.setWrapped( true);
  5. // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
  6. HorizontalCellStyleStrategy horizontalCellStyleStrategy =
  7. new HorizontalCellStyleStrategy( null, contentWriteCellStyle);
  8. ExcelWriter excelWriter = EasyExcel.write(fileName).registerWriteHandler(horizontalCellStyleStrategy).withTemplate(templateFileName).build();
  9. WriteSheet writeSheet = EasyExcel.writerSheet().build();
  10. // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
  11. // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
  12. // 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
  13. // 如果数据量大 list不是最后一行 参照下一个
  14. FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();

核心就是在构造ExcelWriter时设置样式策略。我在这样设置后,一直有问题,第一行显示正常,但第二行的样式上虽然已经有了自动换行但打开文件后,内容却显示的不全,所以有更硬核的修改方式,我直接改了源码中的ExcelWriteFillExecutor类,在该类的doFill方法中加入如下代码,强行锁定行高,最终修改成功。


  
  1. private void doFill(List<AnalysisCell> analysisCellList, Object oneRowData, FillConfig fillConfig,
  2. Integer relativeRowIndex) {
  3. Map dataMap;
  4. if (oneRowData instanceof Map) {
  5. dataMap = (Map)oneRowData;
  6. } else {
  7. dataMap = BeanMap.create(oneRowData);
  8. }
  9. WriteSheetHolder writeSheetHolder = writeContext.writeSheetHolder();
  10. Map<String, ExcelContentProperty> fieldNameContentPropertyMap =
  11. writeContext.currentWriteHolder().excelWriteHeadProperty().getFieldNameContentPropertyMap();
  12. for (AnalysisCell analysisCell : analysisCellList) {
  13. Cell cell = getOneCell(analysisCell, fillConfig);
  14. if (analysisCell.getOnlyOneVariable()) {
  15. String variable = analysisCell.getVariableList().get( 0);
  16. if (writeContext.currentWriteHolder().ignore(variable, analysisCell.getColumnIndex())) {
  17. continue;
  18. }
  19. if (!dataMap.containsKey(variable)) {
  20. continue;
  21. }
  22. Object value = dataMap.get(variable);
  23. CellData cellData = converterAndSet(writeSheetHolder, value == null ? null : value.getClass(), cell,
  24. value, fieldNameContentPropertyMap.get(variable));
  25. //这是我添加的代码-------开始
  26. CellStyle cellStyle = cell.getCellStyle();
  27. cellStyle.setWrapText( true);
  28. String stringValue = cellData.getStringValue();
  29. //如果内容比较多,前面已经设置了自动换行,但是,行高依然会有bug,这里可以手动进行设置
  30. if (stringValue.length()> 10) {
  31. Row row = cell.getRow();
  32. row.setHeight(( short) 820);
  33. }
  34. //这是我添加的代码-------结束
  35. WriteHandlerUtils.afterCellDispose(writeContext, cellData, cell, null, relativeRowIndex, Boolean.FALSE);
  36. } else {
  37. StringBuilder cellValueBuild = new StringBuilder();
  38. int index = 0;
  39. List<CellData> cellDataList = new ArrayList<CellData>();
  40. for (String variable : analysisCell.getVariableList()) {
  41. cellValueBuild.append(analysisCell.getPrepareDataList().get(index++));
  42. if (writeContext.currentWriteHolder().ignore(variable, analysisCell.getColumnIndex())) {
  43. continue;
  44. }
  45. if (!dataMap.containsKey(variable)) {
  46. continue;
  47. }
  48. Object value = dataMap.get(variable);
  49. CellData cellData = convert(writeSheetHolder, value == null ? null : value.getClass(), cell, value,
  50. fieldNameContentPropertyMap.get(variable));
  51. cellDataList.add(cellData);
  52. CellDataTypeEnum type = cellData.getType();
  53. if (type != null) {
  54. switch (type) {
  55. case STRING:
  56. cellValueBuild.append(cellData.getStringValue());
  57. break;
  58. case BOOLEAN:
  59. cellValueBuild.append(cellData.getBooleanValue());
  60. break;
  61. case NUMBER:
  62. cellValueBuild.append(cellData.getNumberValue());
  63. break;
  64. default:
  65. break;
  66. }
  67. }
  68. }
  69. cellValueBuild.append(analysisCell.getPrepareDataList().get(index));
  70. String s = cellValueBuild.toString();
  71. if (s.length() > 10) {
  72. System.out.println(s);
  73. s = s.substring( 0, 10) + "\n" + s.substring( 10, s.length());
  74. }
  75. cell.setCellValue(s);
  76. CellStyle cellStyle = cell.getCellStyle();
  77. cellStyle.setWrapText( true);
  78. WriteHandlerUtils.afterCellDispose(writeContext, cellDataList, cell, null, relativeRowIndex,
  79. Boolean.FALSE);
  80. }
  81. }
  82. }

但这玩意,我后面发现bug消失了,只设置最开始说的内容就完美了。

记录一下,over!


转载:https://blog.csdn.net/m0_37609579/article/details/104448374
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场