![](/img/trans.png)
[英]XSSFSheet removeRow(row) method throws ConcurrentModificationException
[英]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
,后者是一種數據結構,位於CTSheetView
下CTSheetView
。 根據ECMA-376 (第3904頁),這樣的CTPane
是可選的(即,您不必將“ split”應用於CTSheetView
)。
但是,對我來說仍然值得懷疑的是: showInPane()
(通過getPane()
)確實會嘗試創建一個新窗格(如果還沒有)。 然后在此新窗格上調用setTopLeftCell()
-根據ECMA-376(第1657頁),該方法僅適用於右下窗格 。 不過,新窗格的默認類型為左上方 (有關可用窗格的列表,請參見該規格的第2460頁)。
這意味着:
getPane()
方法周圍某個地方包含一個錯誤,該錯誤會阻止POI將新窗格實際插入到工作表視圖中。 ...對於一個務實的解決方案如何解決這個問題,您應該遵循Axel Richter的回答。 這將直接在CTSheetView
上設置可見單元格,這很可能是您所追求的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.