4

関連する質問がいくつかありますが、私の状況を反映した質問が見つかりません。

SXSSFWorkbook および SXSSFSheet オブジェクトを使用して、Apache POI で Excel の「xlsx」ファイルを書き出しています。ファイルは問題なく作成され、LibreOffice で正常に開きますが、ファイルを開くと Excel でエラーが発生します。

Excel は、'test-file.xlsx' に判読できないコンテンツを検出しました。ブックの内容を回復しますか? このブックの発行元が信頼できる場合は、[はい] をクリックします。

「はい」を選択すると…

Excel は、読み取れないコンテンツを修復または削除することにより、ファイルを開くことができました。

削除された機能: /xl/styles.xml 部分からの書式設定 (スタイル)

修復されたレコード: /xl/worksheets/sheet1.xml 部分のセル情報

このワークブックを作成するコードは非常に退屈です。スタイルや興味深いものは何も設定していません。ワークブックと 1 つのシートを作成し、データを書き込みます。

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 を使用してこの問題を見た人はいますか? これを機能させるための追加のフラグや設定など、単純なものを望んでいます。どんな助けでも大歓迎です!

4

1 に答える 1