当前位置: 首页 > 知识库问答 >
问题:

在Excel中打开使用SXSSFWorkbook创建的文件:“找到不可读的内容”

郁权
2023-03-14

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

我正在使用SXSSFWorkbook和SXSSFSheet对象编写一个带有ApachePOI的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++;
    }
}

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

共有1个答案

冯阳云
2023-03-14

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

 类似资料:
  • 问题内容: 我正在使用以下查询来创建CSV文件 但是当我通过filezilla搜索时,无法在任何地方找到mydata.csv文件。 知道该文件的存储位置吗? 查询成功运行,没有任何错误!有帮助吗? 问题答案: 例如,MySQL可能正在将文件写入其自己的数据目录。要指定路径,请使用完整路径。 但是,该目录必须是运行MySQL服务器守护程序的用户帐户可写的目录。因此,我将经常使用: 指定要写入的路径,

  • 记事本++能够毫无问题地打开文件。我做错了什么? 更新:在JD的回答后,我尝试了以下内容: 仍然没有运气--现在我也可以在Excel中看到BOM(作为grabage)--我也尝试使用unicodecsv和其他一些选项,但再次没有成功:(

  • 使用SXSSFWorkbook读取Excel,1W行数据,188列(测试时只有前16列有数据) 读取操作完成后,JVM中存在大量的org.apache.xmlbeans.impl.store.Xobj$AttrXobj org.apache.xmlbeans.impl.store.Xobj$ElementXob类的实例,很长时间内不会被GC 我尝试过使用SAX事件驱动解析Excel、Streami

  • 我试着用protage软件打开它。会打开的。但是,里面没有类可以看到。为了在Protage中查看我生成的本体,我需要在这段代码中更改哪些内容?

  • 场景: 1)使用SXSSFWorkbook将csv文件转换为excel文件。2)如果再次从csv文件读取数据并使用XSSFWorkbook将数据写入上述生成的excel文件,则字符串数据在libre office中不可见,但如果在联机excel查看器中打开excel文件,则数据是可见的(一些excel查看器提到文件已损坏,数据可以恢复)。 使用SXSSFWorkbook创建单元格: Cell Ce

  • 我新安装了Excel 2016,它讨厌CSV文件。它以一栏旗杆风格打开它们,沿着A栏向下,可以看到逗号和语音标记。 突出点: > 我可以在笔记本电脑上创建CSV文件,保存这些文件,然后在笔记本电脑上再次打开它们,一切正常。 即使在记事本中打开它,保存下来,希望某种文件格式正常化,但仍然没有什么好处。 我比较了区域设置和Excel中几乎所有的设置。 我尝试将文件重命名为TXT,它打开了文本文件转换对