首页 文章

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

提问于
浏览
4

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

我正在使用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看到这个问题?我希望有一些简单的东西,比如一个额外的标志或设置来使这项工作 . 任何帮助将不胜感激!

1 回答

  • 5

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

相关问题