近期開發Excel報表供用戶管理配貨數量,使用到許多Excel 365的新函數,如:FILTER、LAMBDA、XLOOKUP等等,尤其是前兩者的搭配使用,讓我把公式(formula)進行完美瘦身、可讀性提升了不少~
因為要將資料庫匯出成Excel給用戶使用,考量效能和無須授權等優點所以我選擇使用EPPlus 4.5.3來為用戶產生Excel報表。
搭配ChatGPT開發都還算順暢,除了一些版本差異和特殊功能需要試錯,如:群組(大綱,OutlineLevel)、條件式格式設定(ConditionalFormatting)、資料驗證(DataValidations)。但當我編譯都沒問題,拿到.xlsx檔時,Excel竟然回覆我公式有錯誤:我們發現 XXX.xlsx 的部分內容有問題。您要我們盡可能嘗試復原嗎? 如果您信任此活頁簿的來源,請按一下 [是]。
按下 [是] 以後被告知公式已經自動修復...公式都被刪光光啦!!!!
開發老半天,要死也要知道怎麼死的吧XD抱持著debug的精神,我把被消失的公式直接放在Excel並儲存卻是可以正常運作的。所以這兩者到底有什麼不一樣呢???那又要怎麼看出它們不一樣??
於是我回歸Google抽絲剝繭來找尋真相,也補充了過去所不知道的小常識:
Excel文件(.xlsx,.xlsm,.xlsb等)實際上是壓縮檔案。Excel其實是使用了一種稱為OpenXML格式的標準來將所有的檔案資訊、數據和樣式等壓縮成一個zip檔案。也就是說,我們可以將.xlsx當作壓縮檔來進行解壓縮,檢視、修改裡面的內容。
在這裡我使用了7-Zip開啟壓縮檔的方式,會得到以下內容:
在XXX.xlsx\xl\worksheets底下,找到了我們的主角—活頁簿(sheet)。
原來EPPlus產檔的欄位:
LAMBDA(x,y,FILTER(x-y,x>y))(FILTER(3:3,($2:$2="安全量")),FILTER(3:3,($2:$2="現有庫存")*($1:$1<>"總倉")))
用Excel儲存的欄位:
_xlfn.LAMBDA(_xlpm.x,_xlpm.y,_xlfn._xlws.FILTER(_xlpm.x-_xlpm.y,_xlpm.x>_xlpm.y))(_xlfn._xlws.FILTER(3:3,($2:$2="安全量")),_xlfn._xlws.FILTER(3:3,($2:$2="現有庫存")*($1:$1<>"總倉")))
由此發現Excel的新函數(FILTER、LAMBDA)在正常情況下直接儲存時,都會有_xlfn.
、_xlpm.
、_xlws.
此類前綴,果然,回到C#程式碼中增加這些前綴後,便解決了公式無法正常開啟的問題。
後記
後來試了更細一點,只有FILTER需要加上_xlws.
前綴就可以run了。但這是否跟我所使用的Office版本有關係就不得而知了,持續更新...
沒有留言:
張貼留言