easyexcel在使用模板填充的方式时,有些文字比较长,需要设置自动换行显示,文档中并没有在此处说明如何设置,翻到前面的写excel中有设置自定义样式的方式,照着搬过来即可:
-
// 内容的策略
-
WriteCellStyle contentWriteCellStyle =
new WriteCellStyle();
-
// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
-
contentWriteCellStyle.setWrapped(
true);
-
// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
-
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
-
new HorizontalCellStyleStrategy(
null, contentWriteCellStyle);
-
-
ExcelWriter excelWriter = EasyExcel.write(fileName).registerWriteHandler(horizontalCellStyleStrategy).withTemplate(templateFileName).build();
-
WriteSheet writeSheet = EasyExcel.writerSheet().build();
-
// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
-
// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
-
// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
-
// 如果数据量大 list不是最后一行 参照下一个
-
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
核心就是在构造ExcelWriter时设置样式策略。我在这样设置后,一直有问题,第一行显示正常,但第二行的样式上虽然已经有了自动换行但打开文件后,内容却显示的不全,所以有更硬核的修改方式,我直接改了源码中的ExcelWriteFillExecutor类,在该类的doFill方法中加入如下代码,强行锁定行高,最终修改成功。
-
private void doFill(List<AnalysisCell> analysisCellList, Object oneRowData, FillConfig fillConfig,
-
Integer relativeRowIndex) {
-
Map dataMap;
-
if (oneRowData
instanceof Map) {
-
dataMap = (Map)oneRowData;
-
}
else {
-
dataMap = BeanMap.create(oneRowData);
-
}
-
WriteSheetHolder writeSheetHolder = writeContext.writeSheetHolder();
-
Map<String, ExcelContentProperty> fieldNameContentPropertyMap =
-
writeContext.currentWriteHolder().excelWriteHeadProperty().getFieldNameContentPropertyMap();
-
-
for (AnalysisCell analysisCell : analysisCellList) {
-
Cell cell = getOneCell(analysisCell, fillConfig);
-
if (analysisCell.getOnlyOneVariable()) {
-
String variable = analysisCell.getVariableList().get(
0);
-
if (writeContext.currentWriteHolder().ignore(variable, analysisCell.getColumnIndex())) {
-
continue;
-
}
-
if (!dataMap.containsKey(variable)) {
-
continue;
-
}
-
Object value = dataMap.get(variable);
-
CellData cellData = converterAndSet(writeSheetHolder, value ==
null ?
null : value.getClass(), cell,
-
value, fieldNameContentPropertyMap.get(variable));
-
-
-
//这是我添加的代码-------开始
-
CellStyle cellStyle = cell.getCellStyle();
-
cellStyle.setWrapText(
true);
-
-
String stringValue = cellData.getStringValue();
-
//如果内容比较多,前面已经设置了自动换行,但是,行高依然会有bug,这里可以手动进行设置
-
if (stringValue.length()>
10) {
-
Row row = cell.getRow();
-
row.setHeight((
short)
820);
-
}
-
//这是我添加的代码-------结束
-
WriteHandlerUtils.afterCellDispose(writeContext, cellData, cell,
null, relativeRowIndex, Boolean.FALSE);
-
}
else {
-
StringBuilder cellValueBuild =
new StringBuilder();
-
int index =
0;
-
List<CellData> cellDataList =
new ArrayList<CellData>();
-
for (String variable : analysisCell.getVariableList()) {
-
cellValueBuild.append(analysisCell.getPrepareDataList().get(index++));
-
if (writeContext.currentWriteHolder().ignore(variable, analysisCell.getColumnIndex())) {
-
continue;
-
}
-
if (!dataMap.containsKey(variable)) {
-
continue;
-
}
-
Object value = dataMap.get(variable);
-
CellData cellData = convert(writeSheetHolder, value ==
null ?
null : value.getClass(), cell, value,
-
fieldNameContentPropertyMap.get(variable));
-
cellDataList.add(cellData);
-
CellDataTypeEnum type = cellData.getType();
-
if (type !=
null) {
-
switch (type) {
-
case STRING:
-
cellValueBuild.append(cellData.getStringValue());
-
break;
-
case BOOLEAN:
-
cellValueBuild.append(cellData.getBooleanValue());
-
break;
-
case NUMBER:
-
cellValueBuild.append(cellData.getNumberValue());
-
break;
-
default:
-
break;
-
}
-
}
-
}
-
cellValueBuild.append(analysisCell.getPrepareDataList().get(index));
-
String s = cellValueBuild.toString();
-
if (s.length() >
10) {
-
System.out.println(s);
-
s = s.substring(
0,
10) +
"\n" + s.substring(
10, s.length());
-
}
-
cell.setCellValue(s);
-
-
CellStyle cellStyle = cell.getCellStyle();
-
cellStyle.setWrapText(
true);
-
-
WriteHandlerUtils.afterCellDispose(writeContext, cellDataList, cell,
null, relativeRowIndex,
-
Boolean.FALSE);
-
}
-
}
-
}
但这玩意,我后面发现bug消失了,只设置最开始说的内容就完美了。
记录一下,over!
转载:https://blog.csdn.net/m0_37609579/article/details/104448374
查看评论