Java 设置XSSFSheet的顶行和左列

Java 设置XSSFSheet的顶行和左列,java,apache-poi,xssf,Java,Apache Poi,Xssf,我试图确保文件打开时XLSX工作表位于左上角 XSSFSheet有a和a方法,但没有setter 不起作用,但仅当窗格冻结或拆分时才起作用 PaneInformation pane = sheet.getPaneInformation(); if (pane == null) { // FIXME doesn't work when there is no pane sheet.showInPane(CellAddress.A1.getRow(),

我试图确保文件打开时XLSX工作表位于左上角

XSSFSheet
有a和a方法,但没有setter

不起作用,但仅当窗格冻结或拆分时才起作用

    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类访问的内容,但所有底层方法都是私有的


有人知道将图纸视图重置为左上角单元格的方法吗?

似乎没有直接针对
POI
对象的设置。但是可以使用
ctworker

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

...
<sheetViews>
 <sheetView workbookViewId="0" tabSelected="true" topLeftCell="D10"/>
</sheetViews>
...
。。。
...
要在此基础上添加更多背景信息:

如果您查看的各个实现,它们都是从
CTSheetView
的实例中获取值的(通过两种不同的方式,我想这不是完全有意的)

相反,它基于
CTPane
,该数据结构位于
CTSheetView
下一层。根据(第3904页),这样的
CTPane
是可选的(即,您不必对
CTSheetView
应用“拆分”)

然而,我仍然怀疑的是:
showInPane()。然后在这个新窗格上调用
setTopLeftCell()
——根据ECMA-376(第1657页),它只适用于右下窗格。新窗格的默认类型为左上角(有关可用窗格的列表,请参见该规范第2460页)

这意味着:

  • 在那个怪异的ECMA-376规范中可能有一个错误。因此,对于所有窗格类型,设置左上角的单元格实际上都是可能的
  • POI可能在
    getPane()
    -方法的某个地方包含一个bug,该bug阻止POI将新窗格实际插入到工作表视图中

。。。然而,要想找到一个务实的解决方案,你应该坚持阿克塞尔·里希特的答案。这将直接在
CTSheetView
上设置可见单元格,这很可能就是您要查看的内容。

很抱歉,出现了耽搁。因此,如果我在这里总结一下,您的建议是自己编辑XML?对我来说太糟糕了:我选择POI是希望避免这种情况@Chop:不,我提供了一个代码行,用于为
XSSFSheet
设置
TopLeftCell
。我的建议是查看
XML
,这应该会告诉您如何获取可能的信息。我甚至不知道为什么我会错过这一点。我通过探索资料来源找到了这种方法,但我确信它是私有的。谢谢(这是我觉得可笑的时候之一)。
...
<sheetViews>
 <sheetView workbookViewId="0" tabSelected="true" topLeftCell="D10"/>
</sheetViews>
...