[C#]NPOI匯出Excel遇到資料換行的問題

[C#]NPOI匯出Excel遇到資料換行的問題

最近看了好幾篇NPOI的分享,感覺挺有意思的,有興趣可以參考小朱跟Hunterpo寫的文章:
在 Server 端存取 Excel 檔案的利器:NPOI Library
利用 NPOI Library 合併多個 Excel 檔

晚上在小舖的時候剛好看到有人問了這個問題:使用NPOI匯出Excel遇到資料換行時,我必須要點進那個cell才會看到換行的效果,這邊的換行指的並不是自動換行wrap的效果,而是\n這一種的資料,在匯出時就要一併做出換行的效果,我們可以看以下的範例:

我先把Northwind的Orders資料表的第一筆資料中的ShipName加上換行


我在程式中把這筆資料抓出來,發現這個欄位值確實是有換行符號\n:
image

我們接著看一下Excel檔,發現ShipName欄位值是一行顯示,沒有被換行:
image 

但就在我將focus點進該Cell打算做編輯時卻發現他又換行了(來打我啊,笨蛋!!):
image 

OK,這就是原發問者的問題,為什麼它不會在匯出時就自動做好換行效果,這一點我自己沒有找到很有利的佐證資料,但我自己推斷是因為它並沒有幫每個欄位設定好格式,所以愈設每個Row都是一樣的高度、寬度,如果要修改的話,應該要朝向他的CellStyle去下手,我找到一篇Java使用POI的參考資料:
Busy Developers' Guide to HSSF and XSSF Features

看了一下應該很符合需求,我就大概把它改成NPOI的寫法(下面這段參考自修改Codeplex上小朱大的原始碼):


                {
                    dataRow.CreateCell(column.Ordinal).SetCellValue(row[column].ToString());

                    if (row[column].ToString().Contains("\n"))
                    {
                        //將目前欄位的CellStyle設定為自動換行
                        HSSFCellStyle cs = workbook.CreateCellStyle();
                        cs.WrapText = true;
                        dataRow.GetCell(column.Ordinal).CellStyle = cs;

                        //因為換行所以愈設幫他Row的高度變成兩倍
                        dataRow.HeightInPoints = 2 * sheet.DefaultRowHeight / 20;
                    }

                }


抓到有換行符號我就直接假設它只換一行,而且內容在兩行內可以被完整呈現(有點偷懶),再執行一次看看結果如何,ShipName總算是被正常的換行囉,謝天謝地,不知道有沒有其他更簡單的方法,說不定是我笨了。
image


參考資料:
在 Server 端存取 Excel 檔案的利器:NPOI Library
利用 NPOI Library 合併多個 Excel 檔
Busy Developers' Guide to HSSF and XSSF Features

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。