SXSSF与Excel表

我正在尝试在stream式工作簿(SXSSFWorkbook)中创build一个Excel表。 它不直接支持API,但是通过访问底层的XSSFWorkbook(workbook.getXSSFWorkbook)已经取得了一些成功。

当我在Excel(2007)中打开文件时,它会显示“Excel在”test.xlsx“中发现了不可读的内容。是否要恢复此工作簿的内容?” 点击是成功修复工作簿,我得到正确的结果。

日志说:“修复logging:从/xl/tables/table1.xml部分(表)”表。

任何人都有我如何可以避免Excel错误的想法?

下面是一个例子:

public class SXSSFTest { private static final int NB_ROWS = 5; private static final int NB_COLS = 5; public static void main(String[] args) throws Exception { try (SXSSFWorkbook workbook = new SXSSFWorkbook(); FileOutputStream outputStream = new FileOutputStream("C:\\test.xlsx")) { SXSSFSheet sheet = workbook.createSheet(); fillSheet(sheet); String dataRange = new AreaReference( new CellReference(0, 0), new CellReference(NB_ROWS - 1, NB_COLS - 1)) .formatAsString(); CTTable cttable = workbook.getXSSFWorkbook() .getSheetAt(0) .createTable() .getCTTable(); CTTableStyleInfo tableStyle = cttable.addNewTableStyleInfo(); tableStyle.setName("TableStyleMedium17"); cttable.setRef(dataRange); cttable.setDisplayName("TABLE"); cttable.setName("TABLE"); cttable.setId(1L); CTTableColumns columns = cttable.addNewTableColumns(); columns.setCount(NB_COLS); for (int c = 0; c < NB_COLS; c++) { CTTableColumn column = columns.addNewTableColumn(); column.setName("Column" + c); column.setId(c + 1L); } cttable.setAutoFilter(CTAutoFilter.Factory.newInstance()); workbook.write(outputStream); } } private static void fillSheet(SXSSFSheet sheet) { for (int rowNb = 0; rowNb < NB_ROWS; rowNb++) { SXSSFRow row = sheet.createRow(rowNb); for (int colNb = 0; colNb < NB_COLS; colNb++) { SXSSFCell cell = row.createCell(colNb); cell.setCellValue("Cell-" + colNb); } } } } 

表格第一行中的单元格值必须与列名称对应。

您在main方法中的代码将列Column0Column4fillSheet方法中的代码将“Cell-0”…“Cell-4”写入第一行的单元格中。 这不匹配。

你可以像这样改变fillSheet方法:

 ... private static void fillSheet(SXSSFSheet sheet) { for (int rowNb = 0; rowNb < NB_ROWS; rowNb++) { SXSSFRow row = sheet.createRow(rowNb); for (int colNb = 0; colNb < NB_COLS; colNb++) { SXSSFCell cell = row.createCell(colNb); if (rowNb==0) cell.setCellValue("Column" + colNb); //first row are column names else cell.setCellValue("Cell-" + colNb); } } } ...