2017-08-09 495 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); 

谢谢阿克塞尔里克特的帮助。