2017-08-09 494 views
0

我想在使用apache poi的excel文件中設置頁面佈局。我正在使用以下代碼:Apache poi爲XSSFSheet設置頁面佈局

FileInputStream fs = new FileInputStream("Test.xlsx"); 
    xssfWorkbook = new XSSFWorkbook(fs); 
    XSSFSheet sheet = xssfWorkbook.getSheetAt(0); 
    CTSheetView view = sheet.getCTWorksheet().getSheetViews().getSheetViewArray(0); 
    view.setView(STSheetViewType.PAGE_LAYOUT); 

它工作正常,如果我創建一個新工作表並調用該函數。但是,如果我打開一個現有的Excel文件並嘗試在頁面佈局中設置所有工作表,它會得到異常。因爲sheet.getCTWorksheet()。getSheetViews()在這種情況下返回null。如何實現現有的Excel文件的頁面佈局?我將不勝感激任何幫助。提前致謝。

+1

這很奇怪。每張表應該有工作表視圖設置。但是你可以檢查你是否得到'null',然後使用適當的'addNew ...'方法。 [CTWorksheet.addNewSheetViews](http://grepcode.com/file/repo1.maven.org/maven2/org.apache.poi/ooxml-schemas/1.1/org/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorksheet。 java#CTWorksheet.addNewSheetViews%28%29)和[CTSheetViews.addNewSheetView](http://grepcode.com/file/repo1.maven.org/maven2/org.apache.poi/ooxml-schemas/1.1/org/openxmlformats /schemas/spreadsheetml/x2006/main/CTSheetViews.java#CTSheetViews.addNewSheetView%28%29)。 –

+0

@AxelRichter根據你的建議,現在我添加了'if(sheet.getCTWorksheet()。getSheetViews()== null){sheet.getCTWorksheet()。addNewSheetViews()。addNewSheetView();在訪問'CTSheetView'之前。現在,如果我通過調用'xssfWorkbook.write(outputStream)'來保存新的excel文件,則文件已損壞。有什麼建議麼? – Masum

+0

如上所述,奇怪的是表單沒有表單視圖。 Test.xlsx來自哪裏?你解壓縮了它,看看'/ xl/worksheets/sheet1.xml'嗎?如何在那裏看到'XML'的頂部?請從''。 –

回答

0

基本上,如果不存在,則需要添加CTSheetView,並且還要設置WorkbookViewId。修改後的代碼如下:

CTSheetView view; 
    if(sheet.getCTWorksheet().getSheetViews() == null){ 
     sheet.getCTWorksheet().addNewSheetViews().addNewSheetView(); 
     view = sheet.getCTWorksheet().getSheetViews().getSheetViewArray(0); 
     view.setWorkbookViewId((long)0); 
    } 
    else { 
     view = sheet.getCTWorksheet().getSheetViews().getSheetViewArray(0); 
    } 
    view.setView(STSheetViewType.PAGE_LAYOUT); 

謝謝阿克塞爾里克特的幫助。