1. 程式人生 > >NPOI自適應寬度不支援中文解決方案

NPOI自適應寬度不支援中文解決方案

    最近一個專案中涉及報表匯出為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才能得到正確的值。