SXSSF 无法创建 Font 和 DateFormat

SXSSF can't create Font and DateFormat

问题

在 SXSSF 工作簿中:

如何设置字体?

如何设置细胞类型为日期?


上下文

我需要编写一个包含大量行和列(400.000 行,每行 50 个字段)的 excel.xlsx 文件,所以我使用的是 apache poi,SXSSF 工作簿。我用这个数量的虚拟文本创建了一个测试文件并且它有效但我希望单元格具有自定义字体:所以如果文本以某种方式表示时间单元格类型应该设置为 "date" (允许我按日期过滤行容易地)。

我写了一个函数,它允许我创建一个单元格,根据我传递给函数的 textType 值检查和修改它的文本类型(货币、字符串、数据)。当我检查数据时,文本类型被正确识别。货币和文本已正确修改,但当我尝试设置字体和数据类型时,它根本不起作用。

(我已经有了一个工作函数 (XSSF),它创建了一个包含自定义字体和不同数据类型的 excel "date",它只是不能生成大的 excel 文件由于 GC 开销,这就是为什么我不得不切换到 SXSSF)


错误

我遇到了这种编译错误。

Errors incompatible types;found : org.apache.poi.ss.usermodel.Font,required: org.apache.poi.xssf.usermodel.XSSFFont at line 235 (235:40) incompatible types;found : org.apache.poi.ss.usermodel.DataFormat,required: org.apache.poi.xssf.usermodel.XSSFDataFormat at line 271 (271:54) incompatible types;found : org.apache.poi.ss.usermodel.DataFormat,required: org.apache.poi.xssf.usermodel.XSSFDataFormat at line 308 (308:54) incompatible types;found : org.apache.poi.ss.usermodel.DataFormat,required: org.apache.poi.xssf.usermodel.XSSFDataFormat at line 335 (335:54) incompatible types;found : org.apache.poi.ss.usermodel.DataFormat,required: org.apache.poi.xssf.usermodel.XSSFDataFormat at line 375 (375:66)

由于 SXSSFFont 不存在,我试图通过创建一个 Font 对象然后使用它而不是 XSSFFont 来修复它。

数据格式相同。

但我仍然在代码中发现类型问题。

XSSFFont font = (XSSFFont) workbook.createFont();
XSSFDataFormat df = (XSSFFont) workbook.createDataFormat();

也试过上面的代码但它不起作用,我得到

ClassCastException error


代码

            //[...]
            SXSSFWorkbook workbook = new SXSSFWorkbook(100);
            Sheet sheet;
            Row row;
            Cell cell;
            //[...]
            XSSFFont font = workbook.createFont();
            font.setBold(fontBold);
            font.setItalic(fontItalic);
            font.setFontHeightInPoints( (short) fontSize);
            if (!fontUnderline) {
              font.setUnderline(FontUnderline.NONE);
            }
            else {
              font.setUnderline(FontUnderline.SINGLE);
            }
            font.setColor(fontColor);

            CellStyle style = workbook.createCellStyle();

            style.setFont(font);


            //[...]

            if (textType == 'T') {

               XSSFDataFormat df = workbook.createDataFormat();
               style.setDataFormat(df.getFormat("d-mmm-yyyy hh:mi:ss"));
               Calendar c = Calendar.getInstance();
               c.set(year, month, day, hour, minute,second);
               cell.setCellValue(c.getTime());
            }

            //in the end I set cell value and style

           cell.setCellStyle(style);
           cell.setCellValue(text);

我在这里创建了一个简短示例,使用 SXSSFWorkbook 并在 1 个单元格中填充日期并应用正确的 format 以及 font.

SXSSFWorkbook s = new SXSSFWorkbook();
Font font = s.createFont();
font.setBold(true);
font.setItalic(true);
short dateStyle = s.createDataFormat().getFormat("mm/dd/yy;@");
CellStyle dateCellFormat = s.createCellStyle();
dateCellFormat.setDataFormat(dateStyle);
dateCellFormat.setFont(font);
SXSSFSheet sheet = s.createSheet("Test");
Row r = sheet.createRow(0);
Cell c = r.createCell(0);
c.setCellValue(new Date());
c.setCellStyle(dateCellFormat);
s.write(Files.newOutputStream(Paths.get("D:/test.xlsx"), StandardOpenOption.CREATE_NEW));
s.close();

您将不得不进行一些调整,但我希望您能理解(使用适当的 Interface