簡體   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