2017-01-16 11 views
1

Я пытаюсь создать таблицу Excel в потоковой книге (SXSSFWorkbook). Он напрямую не поддерживается API, но я получил некоторый успех, обратившись к базовому XSSFWorkbook (workbook.getXSSFWorkbook).SXSSF с таблицей Excel

Когда я открываю файл в Excel (2007), он говорит: «Excel нашел нечитаемый контент в« test.xlsx ». Вы хотите восстановить содержимое этой книги?». Нажатие «да» успешно восстанавливает рабочую книгу, и я получаю правильный результат.

Журнал «Отремонтированные записи: таблица из /xl/tables/table1.xml part (Table)».

У кого-нибудь есть идея, как я мог избежать ошибки 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); 
      } 
     } 
    } 
} 

ответ

3

Значения ячеек в первой строке таблицы должны соответствовать именам столбцов.

Ваш код в main имена методов столбцы Column0 ... Column4 но ваш код в fillSheet методе пишет «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); 
      } 
     } 
    } 
... 
+0

Я не знал, что имя должно было соответствовать. Удивительно, спасибо! – user280767