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才能得到正确的值。

       我用的NPOI的版本是1.2.4,中文官方网站地址:http://tonyqus.sinaapp.com/。

转载于:https://www.cnblogs.com/archor/archive/2011/11/22/3199373.html

你可能感兴趣的:(NPOI自适应宽度不支持中文解决方案)