设置XSSFSheet的顶行和左列

时间:2016-01-24 10:43:08

标签: java apache-poi xssf

我正在尝试确保文件打开时XLSX表位于左上角。

XSSFSheetgetTopCol()getLeftCol()种方法,但没有制定者。

XSSFSheet.showInPane(int, int)确实有效,但前提是冻结或拆分窗格。

    PaneInformation pane = sheet.getPaneInformation();
    if (pane == null) {
        // FIXME doesn't work when there is no pane
        sheet.showInPane(CellAddress.A1.getRow(), CellAddress.A1.getColumn());
    } else {
        // OK
        sheet.showInPane(pane.getHorizontalSplitPosition(), pane.getVerticalSplitPosition());
    }

我试图查看可以从XSSFSheet类访问的内容,但所有底层方法都是私有的。

有人知道如何将工作表视图重置到左上角的单元格吗?

2 个答案:

答案 0 :(得分:1)

似乎没有直接使用POI对象进行此类设置。但是CTWorksheet可以实现。 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.poi/ooxml-schemas/1.1/org/openxmlformats/schemas/spreadsheetml/x2006/main/CTWorksheet.java#CTWorksheet

...
((XSSFSheet)sheet).getCTWorksheet().getSheetViews().getSheetViewArray(0).setTopLeftCell("D10");
...

获得此类信息的最佳可能性是直接使用Excel创建一个简单文件。然后将其另存为*.xlsx。然后解压缩此文件并查看/xl/worksheets/sheet1.xml。在那里你找到:

...
<sheetViews>
 <sheetView workbookViewId="0" tabSelected="true" topLeftCell="D10"/>
</sheetViews>
...

答案 1 :(得分:0)

在此添加更多背景资料:

如果你查看getTopRow()getLeftCol()各自的实现,他们都会从CTSheetView的实例中获取它们的值(通过两种不同的方式,我认为这些方式并非完全是故意的)。

相比之下,showInPane()基于CTPane,这是一个比CTSheetView低一级的数据结构。根据{{​​3}}(第3904页),这样的CTPane是可选的(即您不必对您的CTSheetView应用&#34;拆分&#34;)

然而,对我来说仍然可疑的是:showInPane()(通过ECMA-376)实际上,如果没有,则尝试创建一个新窗格。在这个新窗格中,它会调用setTopLeftCell() - 根据ECMA-376(第1657页),它仅适用于右下方窗格。但是,新窗格的默认类型是左上角(有关可用窗格列表,请参阅该规范的第2460页)。

这意味着:

  • 可怕的ECMA-376规格中可能存在错误。因此,实际上可以为所有窗格类型设置左上角的单元格。
  • POI可能包含getPane() - 方法周围的某个错误,该错误会阻止它实际将新窗格插入到工作表视图中。

...如果能够解决这个问题的实用解决方案,你应该坚持使用Axel Richter的答案。这会将可见单元格直接设置在CTSheetView上,这很可能就是您所追求的。