有几个相关问题,但我找不到反映我情况的问题。
我正在使用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看到这个问题?我希望有一些简单的东西,比如一个额外的标志或设置来使这项工作。任何帮助将不胜感激!
答案 0 :(得分:5)
我解决了这个问题,我很尴尬,我之前没有发现这个问题。如果查看“writeRowToWorkbook”方法,您将看到它为包含日期的单元格创建了CellStyle。显然,每次写入一行时都会将CellStyle添加到工作表中并不是一个好主意。将CellStyle日期的创建移到工作簿方法中解决了这个问题。