SXSSF Workbook设置字体与日期类型报错问题求助
在SXSSF Workbook中正确设置自定义字体与日期单元格类型
你遇到的问题根源在于SXSSF是基于XSSF的流式实现,它的API更偏向于使用通用的SS(Spreadsheet)接口,而非XSSF的具体实现类。直接使用XSSFFont和XSSFDataFormat会导致类型不兼容,强转又会因为SXSSF的包装机制抛出异常。下面是具体的解决方法:
一、自定义字体的正确实现
SXSSF没有自己的SXSSFFont类,它直接复用XSSF的字体实现,但通过SXSSFWorkbook.createFont()返回的是通用的Font接口。你只需要把代码中的XSSFFont替换为org.apache.poi.ss.usermodel.Font即可,所有字体设置方法都能通过这个接口调用:
SXSSFWorkbook workbook = new SXSSFWorkbook(100); Sheet sheet = workbook.createSheet(); // ... // 使用通用Font接口,避免依赖XSSFFont具体类 Font font = workbook.createFont(); font.setBold(fontBold); font.setItalic(fontItalic); font.setFontHeightInPoints((short) fontSize); font.setUnderline(fontUnderline ? FontUnderline.SINGLE : FontUnderline.NONE); font.setColor(fontColor); // 这里可以用IndexedColors的索引,比如IndexedColors.BLUE.getIndex() CellStyle style = workbook.createCellStyle(); style.setFont(font); // CellStyle接受Font接口,无需强转
如果需要设置自定义RGB颜色这类XSSF特有的功能,可以通过SXSSFWorkbook获取底层的XSSFWorkbook来创建XSSFFont:
// 获取底层XSSFWorkbook实例 XSSFWorkbook xssfWorkbook = workbook.getXSSFWorkbook(); XSSFFont xssfFont = xssfWorkbook.createFont(); // 设置自定义RGB颜色 xssfFont.setColor(new XSSFColor(new java.awt.Color(123, 45, 67), new DefaultIndexedColorMap())); // 同样可以将XSSFFont设置到CellStyle中(因为XSSFFont实现了Font接口) style.setFont(xssfFont);
二、日期单元格类型的正确设置
同样,日期格式需要使用通用的DataFormat接口,而非XSSFDataFormat。SXSSF会自动处理底层的XSSF格式逻辑:
if (textType == 'T') { // 使用通用DataFormat接口 DataFormat df = workbook.createDataFormat(); // 获取自定义日期格式的索引 short dateFormatIdx = df.getFormat("d-mmm-yyyy hh:mi:ss"); style.setDataFormat(dateFormatIdx); // 设置日期值(确保单元格是日期类型) Calendar c = Calendar.getInstance(); c.set(year, month, day, hour, minute, second); cell.setCellValue(c.getTime()); // 直接传入Date对象 } // 最后绑定样式到单元格 cell.setCellStyle(style);
额外注意事项
- 复用单元格样式:XLSX格式对单元格样式数量有限制(最多65535个),大数据量生成时一定要复用样式,避免为每个单元格创建新样式,否则会抛出异常。
- 临时文件清理:SXSSF会将超出内存行数的内容写入临时文件,使用完后记得调用
workbook.dispose()清理临时文件,避免磁盘空间占用。
内容的提问来源于stack exchange,提问作者mbianchidev
相关产品推荐
相关产品推荐

