發表文章

目前顯示的是有「Apache POI」標籤的文章

190322 Apache POI Continued

昨天試了 org.apache.poi.xssf.usermodel.helpers.XSSFColumnShifter https://poi.apache.org/apidocs/dev/org/apache/poi/xssf/usermodel/helpers/XSSFColumnShifter.html 先呼叫 shiftColumns,再呼叫 shiftMergedRegions。 以 Excel 開啟程式改過的 .xlsx 檔,會出現以下訊息。  ——————————————————————————— 已移除的記錄: /xl/worksheets/sheet4.xml 部分的 公式 已移除的記錄: /xl/worksheets/sheet4.xml 部分的 共用公式 已移除的記錄: /xl/calcChain.xml 部分的 公式 (計算內容) ——————————————————————————— 1. 原先多行中有用到公式 SUM,公式都不見了,只有值被留下來。 2. 如果呼叫 shiftMergedRegions 時,我的需求為插入一行,含有 firstShiftColumnIndex 的 Merged Regions會無法成功新增一行。 用 /xl/calcChain.xml 為關鍵字找到以下文章 Excel Error 2010 /xl/calcChain.xml http://sogeeky.blogspot.com/2015/10/excel-error-2010-xlcalcchainxml.html 如依上面的文章,把 /xl/calcChain.xml 刪除,再用 Excel 開啟,就會變成檔案已毁損。 這樣看起來 XSSFColumnShifter 所引起的 Side Effects 比較嚴重。 所以回到最早的方式。 1. 將隱藏行設為顯示;並記錄其行號。 2. 移除 sheet 中所有的合併儲存格;並保留合併儲存格資訊。此處需注意 index 的問題。 3. 插入一行。

190321 Apache POI

因要插入一行,在 shiftColumns 時會影響到 Merged Regions 而 XSSFSheet 針對 Merged Regions 所提供的方法只有 addMergedRegion, getMergedRegion, getMergedRegions, removeMergedRegion, removeMergedRegions 上面除了 addMergedRegion 給的是 CellRangeAddress 外,其餘的方法使用的都是 CellRangeAddress 的索引值。 但吊詭的是,當呼叫 removeMergedRegion 後,某些 CellRangeAddress 在整份 XSSFSheet 裡的索引值就變了。 這可傷腦筯了。 目前想到的方式如下 1. 用 getMergedRegions 取得所有 CellRangeAddress 2. 用 removeMergedRegion 依索引值由大至小移除 CellRangeAddress 3. shiftColumns 4. 修改 1. 中被影響到的 CellRangeAddress 5. addMergedRegion 希望上面的方法可行。 ----------------------------------------------------------------------------------------------- 目前 1., 2. 執行沒有問題 但在 3. shiftColumns 後,在 Excel 中開啟程式處理後的檔案時,會出現修復警告。 修復後,可以發現,插入的那行沒有框線(原檔案有設框線)。 而且,如果有隱藏的行,也會影響到之後的格式。 先來解決隱藏行的問題。 * 從 0 開始到 max last col 如果為隱藏,則改為顯示。 shift 完後,再將原本的 Column 隱藏 (記得原本的 Column Index 要加 Shift 行數後再進行隱藏) 這樣做目前已無大礙。 再來處理 Excel 出現修復的問題。 目前處理方向是在向右 shift 後,進行 column 的 create。