首页 文章

SXSSF无法创建Font和DateFormat

提问于
浏览
1

Question

在SXSSF工作簿中:

我该如何设置字体?

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


Context

我需要编写一个带有大量行和列的excel .xlsx文件(400,000行,每行50个字段),所以我使用的是apache poi,SXSSF工作簿 . 我用这么多的虚拟文本创建了一个测试文件,但是它可以工作,但是我希望单元格有自定义字体:所以如果文本以某种方式表示时间单元格类型应该设置为“日期”(允许我按日期轻松过滤行) .

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

(我已经有了一个工作函数(XSSF),它创建了一个带有自定义字体和不同数据类型的excel "date",它只是't generate large excel files due to GC overhead, that'为什么我必须切换到SXSSF)


Error

我得到这种编译错误 .

错误不兼容类型;找到:org.apache.poi.ss.usermodel.Font,必需:org.apache.poi.xssf.usermodel.XSSFFont第235行(235:40)不兼容的类型;找到:org.apache.poi .ss.usermodel.DataFormat,required:org.apache.poi.xssf.usermodel.XSSFDataFormat第271行(271:54)不兼容的类型;找到:org.apache.poi.ss.usermodel.DataFormat,必需:org.apache第308行(308:54)的.poi.xssf.usermodel.XSSFDataFormat不兼容的类型;找到:org.apache.poi.ss.usermodel.DataFormat,必需:第335行的org.apache.poi.xssf.usermodel.XSSFDataFormat( 335:54)不兼容的类型;找到:org.apache.poi.ss.usermodel.DataFormat,必需:org.apache.poi.xssf.usermodel.XSSFDataFormat第375行(375:66)

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

DataFormat也是如此 .

但我仍然在代码中找到类型问题 .

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

也试过上面的代码,但它不起作用,我明白了

ClassCastException错误


Code

//[...]
            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);

1 回答

  • 0

    在这里,我使用 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

相关问题