NPOI自适应宽度不支持中文解决方案

来源:互联网 发布:unity3d 与apk 编辑:程序博客网 时间:2024/06/05 07:03

       最近一个项目中涉及报表导出为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/。