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

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

我正在用Apache POI使用SXSSFWorkbook和SXSSFSheet对象写出一个Excel“xlsx”文件。 该文件创build没有问题,并在LibreOffice打开罚款,但是,Excel抱怨打开文件时。

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

当select“是”时

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

已删除的function:从/xl/styles.xml部分格式(样式)

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

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

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

我解决了这个问题,我很尴尬,以前没有发现这个问题。 如果您查看“writeRowToWorkbook”方法,您将看到它为包含date的单元格创build了一个CellStyle。 显然,每当写一行时,在工作表中添加一个CellStyle并不是一个好主意。 将dateCellStyle的创build移出工作簿方法解决了此问题。