2017-01-16 4 views
1

스트리밍 된 통합 문서 (SXSSFWorkbook)에서 Excel 테이블을 만들려고합니다. API에 의해 직접 지원되지는 않지만 기본 XSSFWorkbook (workbook.getXSSFWorkbook)에 액세스하여 성공했습니다.Excel 테이블이있는 SXSSF

Excel (2007)에서 파일을 열 때 "Excel에서"test.xlsx "의 읽을 수없는 콘텐츠를 찾았습니다.이 통합 문서의 내용을 복구 하시겠습니까?"라는 메시지가 나타납니다. 예를 클릭하면 통합 문서를 성공적으로 복구하고 올바른 결과를 얻습니다.

로그에 "복구 된 레코드 : /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); 
      } 
     } 
    } 
} 

답변

3

셀 값은 열 이름과 일치해야 아래

는 일례이다.

main 방법 이름에 대한 여러분의 코드 열 Column0 ... Column4하지만 fillSheet 방법에있는 당신의 코드가 "셀-0"... "셀-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