2017-01-16 33 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

関連する問題