繁体   English   中英

设置XSSFSheet的顶行和左列

[英]Set top row and left column for an XSSFSheet

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

XSSFSheet具有getTopCol()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类访问的内容,但是所有基础方法都是私有的。

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

似乎没有直接与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>
...

要为此添加更多背景:

如果查看getTopRow()getLeftCol()各自的实现,它们都将从CTSheetView实例获取值(我想这是通过两种不同的方式,我认为这不是完全有意的)。

相反, showInPane()基于CTPane ,后者是一种数据结构,位于CTSheetViewCTSheetView 根据ECMA-376 (第3904页),这样的CTPane是可选的(即,您不必将“ split”应用于CTSheetView )。

但是,对我来说仍然值得怀疑的是: showInPane() (通过getPane() )确实会尝试创建一个新窗格(如果还没有)。 然后在此新窗格上调用setTopLeftCell() -根据ECMA-376(第1657页),该方法仅适用于右下窗格 不过,新窗格的默认类型为左上方 (有关可用窗格的列表,请参见该规格的第2460页)。

这意味着:

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

...对于一个务实的解决方案如何解决这个问题,您应该遵循Axel Richter的回答。 这将直接在CTSheetView上设置可见单元格,这很可能是您所追求的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM