EasyExcel碰到问题记录

作者:京东工业 孙磊

1、富文本中文字设置不同颜色和字体不生效

1 String stringCellValue = cell.getStringCellValue(); 2 if (StringUtils.isNotBlank(stringCellValue) && stringCellValue.contains(startIndex) && stringCellValue.contains(endIndex)) { 3 RichTextString richStringCellValue = cell.getRichStringCellValue(); 4 Font redFont = workbook.createFont(); 5 redFont.setColor(IndexedColors.RED.getIndex()); 6 7 if (richStringCellValue instanceof XSSFRichTextString) { 8 XSSFRichTextString xssfRichTextString = new XSSFRichTextString(cell.getStringCellValue()); 9 xssfRichTextString.applyFont(stringCellValue.indexOf(startIndex),stringCellValue.indexOf(endIndex) +endIndex.length() ,redFont); 10 cell.setCellValue(xssfRichTextString); 11 } else if (richStringCellValue instanceof HSSFRichTextString) { 12 HSSFRichTextString hssfRichTextString = new HSSFRichTextString(cell.getStringCellValue()); 13 hssfRichTextString.applyFont(stringCellValue.indexOf(startIndex),stringCellValue.indexOf(endIndex) +endIndex.length() ,redFont); 14 cell.setCellValue(hssfRichTextString); 15 } 16 cellStyle.setFont(redFont); 17 } else { 18 // 清空样式 19 cell.setCellStyle(cellStyle); 20 }

上面代码设置了富文本指定范围的文字设置新的字体,但是生成的文件还是不生效。

1EasyExcelFactory.write(new File(pathName)).head(titleList()) 2 .inMemory(Boolean.TRUE) // 指定这个属性为true,才支持富文本和注释 3 .registerWriteHandler(new HeadRowWriteHandler()).sheet(0).doWrite(Lists.newArrayList());

原因:

在 EasyExcel 中,inMemory 方法用于设置是否在内存中生成 Excel 文件。默认情况下,EasyExcel 会在磁盘上创建一个缓存文件,然后将数据写入这个缓存文件,最后再将缓存文件写入到 Excel 文件中。

如果你调用 inMemory(true),EasyExcel 将会在内存中生成 Excel 文件,而不是使用缓存文件。这意味着:

1.更快的写入速度:因为不需要频繁地读写磁盘,内存模式下的写入速度通常会更快。

2.支持 Comment 和 RichTextString:如果你需要在单元格中添加注释或使用富文本字符串,这些功能只能在内存模式下使用。

3.限制大文件写入:内存模式下,所有的数据都会被加载到内存中,这可能会导致内存溢出问题,特别是当你处理大型数据集时。

使用内存模式的主要优点是它可以支持更复杂的单元格操作,如添加注释或使用富文本字符串。然而,如果你的数据量很大,可能需要避免使用内存模式以防止内存问题。



2、冻结单元格

可以通过sheet.createFreezePane(column,row);方法指定冻结的列和行索引。

1import com.alibaba.excel.write.handler.SheetWriteHandler; 2import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; 3import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder; 4import org.apache.poi.ss.usermodel.Sheet; 5 6import java.util.Objects; 7 8/** 9 * 冻结单元格 10 **/ 11public class FreezePaneWriteHandler implements SheetWriteHandler { 12 13 private int column; 14 15 private int row; 16 17 public FreezePaneWriteHandler(Integer column, Integer row) { 18 this.column = column; 19 this.row = row; 20 } 21 22 @Override 23 public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) { 24 Sheet sheet = writeSheetHolder.getSheet(); 25 if (Objects.nonNull(sheet)) { 26 sheet.createFreezePane(column,row); 27 } 28 } 29}

3、不合并单元格

Easyexcel使用中,生成多行表头模版时,同一行如果多个列内容一样,会被自动合并单元格,要避免这个问题,需要通过特殊处理。

1import com.alibaba.excel.constant.OrderConstant; 2import com.alibaba.excel.write.handler.RowWriteHandler; 3import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; 4import com.alibaba.excel.write.metadata.holder.WriteTableHolder; 5import org.apache.commons.collections4.CollectionUtils; 6import org.apache.poi.ss.usermodel.Row; 7import org.apache.poi.ss.usermodel.Sheet; 8import org.apache.poi.ss.util.CellRangeAddress; 9 10import java.util.Set; 11 12/** 13 * 表头不合并策略 14 * @author sunlei61 15 * @date 2024/8/17 16 **/ 17public class HeadNoMergeWriteHandler implements RowWriteHandler { 18 /** 19 * 指定哪些行需要合并单元格 20 */ 21 private Set<Integer> rowNum; 22 /** 23 * 排除哪些不合并单元格的行 24 */ 25 private Set<Integer> excludeRowNum; 26 27 @Override 28 public int order() { 29 return OrderConstant.FILL_STYLE + 3; 30 } 31 32 public HeadNoMergeWriteHandler(){} 33 34 public HeadNoMergeWriteHandler(Set<Integer> rowNum){ 35 this.rowNum = rowNum; 36 } 37 38 public HeadNoMergeWriteHandler(Set<Integer> rowNum, Set<Integer> excludeRowNum){ 39 this.rowNum = rowNum; 40 this.excludeRowNum = excludeRowNum; 41 } 42 43 @Override 44 public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { 45 if (!isHead){ 46 return; 47 } 48 49 if (CollectionUtils.isEmpty(rowNum) || rowNum.contains(row.getRowNum())) { 50 // 如果是表头,取消合并 51 Sheet sheet = writeSheetHolder.getSheet(); 52 int totalMergedRegions = sheet.getNumMergedRegions(); 53 for (int i = totalMergedRegions - 1; i >= 0; i--) { 54 CellRangeAddress mergedRegion = sheet.getMergedRegion(i); 55 if (CollectionUtils.isEmpty(excludeRowNum) || !excludeRowNum.contains(mergedRegion.getFirstRow())) { 56 sheet.removeMergedRegion(i); 57 } 58 } 59 } 60 } 61}

4、列宽自适应宽度

生成表格列比较多,制定特定的宽度会让表格很长,即使单元格内容一个字,也会很宽,不是很友好,可以通过设置sheet的自适应宽度来设置。

1import com.alibaba.excel.write.handler.RowWriteHandler; 2import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; 3import com.alibaba.excel.write.metadata.holder.WriteTableHolder; 4import org.apache.commons.collections4.CollectionUtils; 5import org.apache.poi.ss.usermodel.Row; 6import org.apache.poi.ss.usermodel.Sheet; 7 8import java.util.Set; 9 10/** 11 * 列宽度自动适应 12 * @author sunlei61 13 * @date 2024/9/26 14 **/ 15public class AutoSizeColumnWriterHandler implements RowWriteHandler { 16 /**不需要自动适用宽度的列集合*/ 17 private Set<Integer> excludeColumns; 18 19 public AutoSizeColumnWriterHandler(){ 20 } 21 22 public AutoSizeColumnWriterHandler(Set<Integer> excludeColumns) { 23 this.excludeColumns = excludeColumns; 24 } 25 26 @Override 27 public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { 28 Integer sheetNo = writeSheetHolder.getSheetNo(); 29 if (sheetNo == 0 ) { 30 Sheet sheet = writeSheetHolder.getSheet(); 31 int columns = row.getPhysicalNumberOfCells(); 32 for (int i = 0; i < columns; i++) { 33 if (CollectionUtils.isNotEmpty(excludeColumns) && excludeColumns.contains(i)) { 34 continue; 35 } 36 sheet.autoSizeColumn(i); 37 } 38 } 39 } 40}
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

一篇文章带你了解CSS 文本样式

大家好,我是IT共享者,人称皮皮。这篇文章我们来讲讲CSS的文本样式。一、文本颜色Color颜色属性被用来设置文字的颜色。颜色是通过CSS最经常的指定:十六进制值如"#FF0000"。一个RGB值"RGB(255,0,0)"。颜色的名称如"红"。一个网页的文本颜色是指在主体内的选择:

mysql设置时区

mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0

设计模式-策略模式

作者:京东工业孙磊一、概念策略模式(StrategyPattern)也称为(PolicyParttern)。它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变换,不会影响到使用算法的客户。策略模式属性行为模式。策略模式结构图\二、实际