【问题标题】:Opening File Created with SXSSFWorkbook in Excel: "Unreadable Content Found"在 Excel 中打开使用 SXSSFWorkbook 创建的文件:“找到不可读的内容”
【发布时间】:2013-10-08 14:54:51
【问题描述】:

有几个相关的问题,但我找不到一个能反映我的情况的问题。

我正在使用 SXSSFWorkbook 和 SXSSFSheet 对象用 Apache POI 编写 Excel“xlsx”文件。该文件的创建没有问题,并且在 LibreOffice 中可以正常打开,但是 Excel 在打开文件时会报错。

Excel 在“test-file.xlsx”中发现了不可读的内容。是否要恢复工作簿的内容?如果您信任此工作簿的来源,请单击“是”。

选择“是”...

Excel 能够通过修复或删除不可读的内容来打开文件。

删除的功能:格式来自 /xl/styles.xml 部分(样式)

修复的记录:来自 /xl/worksheets/sheet1.xml 部分的单元格信息

创建这个工作簿的代码很无聊,我没有设置任何样式或任何有趣的东西。我创建工作簿和一张工作表,然后将数据写入其中。

private Workbook createWorkbook(final String sheetName, final String[] headers) {

    // create a new workbook and sheet
    final SXSSFWorkbook workbook = new SXSSFWorkbook(500);
    final SXSSFSheet sheet = (SXSSFSheet) workbook.createSheet(sheetName);

    // create and fill our header row
    final Row row = sheet.createRow(0);
    for (int index = 0; index < headers.length; index++) {
        row.createCell(index).setCellValue(headers[index]);
    }

    return workbook;
}

写数据同样无趣。

private void exportPersonWorkbook(final Workbook workbook, final String sheetName, final PersonExport personExport) {

    // list of data for this new row
    final List rowValues = new ArrayList();

    // person id
    rowValues.add(personExport.getContactId());

    // dec region number
    rowValues.add(personExport.getRegion());

    // birth date
    rowValues.add(personExport.getBirthDate());

    // day phone
    rowValues.add(personExport.getMailingContactInfoBusinessPhone());

    ...and so on...

    writeRowToWorkbook(workbook, sheetName, rowValues);
}

private void writeRowToWorkbook(final Workbook workbook, final String sheetName, final List values) {

    // helper and our date format
    final CreationHelper creationHelper = workbook.getCreationHelper();
    final CellStyle dateStyle = workbook.createCellStyle();
    dateStyle.setDataFormat(creationHelper.createDataFormat().getFormat(
            PesticidesDomainConstants.DEFAULT_DATE_PATTERN));

    // get a handle on our worksheet
    final Sheet sheet = workbook.getSheet(sheetName);

    // create our new row
    final Row row = sheet.createRow(sheet.getLastRowNum() + 1);

    // write all of our data to the row
    int column = 0;
    final Iterator iterator = values.iterator();
    while (iterator.hasNext()) {

        final Object value = iterator.next();
        if (value != null) {

            // create our new cell
            final Cell cell = row.createCell(column);

            // Excel cells can only handle certain data types
            if (value instanceof String) {
                cell.setCellValue((String) value);
            } else if (value instanceof Integer) {
                cell.setCellValue((Integer) value);
            } else if (value instanceof Double) {
                cell.setCellValue((Double) value);
            } else if (value instanceof Date) {
                cell.setCellValue((Date) value);

                // set the cell format for dates
                cell.setCellStyle(dateStyle);
            } else {

                // last ditch effort to populate cell
                cell.setCellValue(value.toString());
            }
        }

        // increment our column counter
        column++;
    }
}

文件在打开时看起来几乎正确,我看不出有什么不同。有人使用 Apache POI 看到过这个问题吗?我希望有一些简单的东西,比如一个额外的标志或设置来完成这项工作。任何帮助将不胜感激!

【问题讨论】:

    标签: excel apache-poi openxml


    【解决方案1】:

    我解决了这个问题,但很遗憾我没有早点发现这个问题。如果您查看“writeRowToWorkbook”方法,您会发现它为包含日期的单元格创建了 CellStyle。显然,每次写入一行时向工作表添加一个 CellStyle 并不是一个好主意。将日期 CellStyle 的创建移到工作簿方法中解决了这个问题。

    【讨论】:

    • 听起来您超出了工作簿中的最大样式数。样式是工作簿范围的,因此您发现应该创建一次并重复使用!
    • @Miles 您能否详细说明您的解决方案。如果可能,请提供代码。我也面临着类似的问题。
    • @KaushikLele 如果您查看问题中的代码,在“writeRowToWorkbook(...)”方法中,第三行代码向下,我正在创建一个名为“dateStyle”的 CellStyle,然后设置作为包含日期的单元格的样式。问题是我正在为电子表格中的每一行创建一个新的“dateStyle”实例,这就是问题所在。需要在工作簿范围内创建一个“dateStyle”实例,然后由需要它的每一行引用;也就是说,我们只想要 一个 由所有行共享的“dateStyle”实例。
    • @Miles 我遇到了与 SXSSF 工作簿类似的问题。您能否分享一些有关您如何找到/调试创建样式是问题的问题的详细信息,以便我可以在我的应用程序中验证相同的问题。谢谢。
    • 我不确定我还能添加什么...我的问题是将行写入电子表格的方法还为日期列创建了一个新的 CellStyle。这意味着为每一行创建了一个新的 CellStyle,这导致了错误:文件中的 CellStyle 实例太多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多