NPOI自適應寬度不支援中文解決方案
阿新 • • 發佈:2019-02-20
最近一個專案中涉及報表匯出為excel功能需求。我最開始使用微軟自身的excel COM元件呼叫的方式進行匯出,發現當需要匯出的內容增大到一定程度時,速度十分緩慢,而且呼叫COM元件需要在伺服器端安裝excel客戶端,新增伺服器對COM元件的呼叫許可權,比較繁瑣,後來在網上找了下相關資訊,發現一個基於excel的操作元件NPOI,試了一下,匯出速度比較理想,縮短1/5左右。
不過在處理中文時,需要表格列寬自動調整寬度時遇到問題,NPOI的自帶函式AutoSizeColumn(int 列號)只能支援英文和數字,好吧,吐槽下,身為國人,中文確實給我帶來很大困擾,為什麼計算機不是中國人發明的:) 吐槽完問題還是需要解決,分析下主要的問題是不支援中文,英文和數字沒有問題,那就先用AutoSizeColumn(int
列號)處理一下,然後單獨解決中文,NPOI自身自帶為列寬指定寬度函式SetColumnWidth(int 列號,int寬度),只需要遍歷一下每一列的文字,求出文字的寬度,算出這一列的最大值,重新設定本列的寬度即可。
下面是具體程式碼:
//列寬自適應,只對英文和數字有效 for (int i = 0; i <= maxColumn; i++) { sheet.AutoSizeColumn(i); } //獲取當前列的寬度,然後對比本列的長度,取最大值 for (int columnNum = 0; columnNum <= maxColumn; columnNum++) { int columnWidth = sheet.GetColumnWidth(columnNum) / 256; for (int rowNum = 1; rowNum <= sheet.LastRowNum; rowNum++) { IRow currentRow; //當前行未被使用過 if (sheet.GetRow(rowNum) == null) { currentRow = sheet.CreateRow(rowNum); } else { currentRow = sheet.GetRow(rowNum); } if(currentRow.GetCell(columnNum) != null) { ICell currentCell = currentRow.GetCell(columnNum); int length = Encoding.Default.GetBytes(currentCell.ToString()).Length; if (columnWidth < length) { columnWidth = length; } } } sheet.SetColumnWidth(columnNum, columnWidth * 256); }
需要注意的是列的寬度為 列寬*256,所以獲得的寬度需要處以256得到真實的寬度,同樣再設定的時候需要再乘上256才能得到正確的值。