npoi workbook 的 cellstyle 创建不能超过4000的解决方法

利用NPOI进行Excel的工作表(Sheet)复制时,如果复制的工作表(Sheet)较多(100个左右),会报告 workbook 的 cellstyle 创建不能超过4000 的错误.

代码如下:

public static void CopySheet(ISheet fromSheet, ISheet toSheet, bool copyValueFlag)
        {
            //合并区域处理
            MergerRegion(fromSheet, toSheet);
            System.Collections.IEnumerator rows = fromSheet.GetRowEnumerator();
            while (rows.MoveNext())
            {

                IRow row = null;
                if (fromSheet.Workbook is HSSFWorkbook)
                    row = rows.Current as HSSFRow;
                else
                    row = rows.Current as HSSFRow;
                IRow newRow = toSheet.CreateRow(row.RowNum);
                CopyRow(fromSheet.Workbook, toSheet.Workbook, row, newRow, copyValueFlag);

            }
        }
public static void CopyRow(IWorkbook fromWb, IWorkbook toWb, IRow fromRow, IRow toRow, bool copyValueFlag)
        {
            System.Collections.IEnumerator cells = fromRow.GetEnumerator(); //.GetRowEnumerator();
            toRow.Height = fromRow.Height;

            while (cells.MoveNext())
            {

                ICell cell = null;
                //ICell cell = (wb is HSSFWorkbook) ? cells.Current as HSSFCell : cells.Current as NPOI.XSSF.UserModel.XSSFCell;
                if (toWb is HSSFWorkbook)
                    cell = cells.Current as HSSFCell;
                else
                    cell = cells.Current as HSSFCell;
                ICell newCell = toRow.CreateCell(cell.ColumnIndex);
                CopyCell(fromWb, toWb, cell, newCell, copyValueFlag);

            }
        }
public static void CopyCell(IWorkbook fromWb,IWorkbook toWb, ICell srcCell, ICell distCell, bool copyValueFlag)
        {
            ICellStyle newstyle = toWb.CreateCellStyle(); 
            //复制样式
            newstyle.CloneStyleFrom(srcCell.CellStyle);
            //样式
            distCell.CellStyle = newstyle;
            //评论
            if (srcCell.CellComment != null)
            {
                distCell.CellComment = srcCell.CellComment;
            }
            // 不同数据类型处理
            CellType srcCellType = srcCell.CellType;
            distCell.SetCellType(srcCellType);
            if (copyValueFlag)
            {
                if (srcCellType == CellType.Numeric)
                {
                    if (HSSFDateUtil.IsCellDateFormatted(srcCell))
                    {
                        distCell.SetCellValue(srcCell.DateCellValue);
                    }
                    else
                    {
                        distCell.SetCellValue(srcCell.NumericCellValue);
                    }
                }
                else if (srcCellType == CellType.String)
                {
                    distCell.SetCellValue(srcCell.RichStringCellValue);
                }
                else if (srcCellType == CellType.Blank)
                {
                    // nothing21
                }
                else if (srcCellType == CellType.Boolean)
                {
                    distCell.SetCellValue(srcCell.BooleanCellValue);
                }
                else if (srcCellType == CellType.Error)
                {
                    distCell.SetCellErrorValue(srcCell.ErrorCellValue);
                }
                else if (srcCellType == CellType.Formula)
                {
                    distCell.SetCellFormula(srcCell.CellFormula);
                }
                else
                {
                    // nothing29
                }
            }
        }

网上有方法说要把CreateCellStyle放在循环外面,这个方法不适用于复制的工作表(Sheet)较多(100个左右)的场景,且不是解决问题的根本方法.

为了最大限度的复用CellStyle,且控制在4000个之内.构造了一个缓存对象.来缓存创建的CellStyle,所有的CellStyle获取,先通过从缓存取,如果不存在再创建.代码如下:

public class CellStyleCache:ArrayList
    {
        public ICellStyle this[ICellStyle fromStyle]
        {
            get
            {
                foreach (object o in this)
                {
                    ICellStyle toStyle = o as ICellStyle;
                    if
                        (
                            toStyle.Alignment == fromStyle.Alignment
                            //边框和边框颜色
                            && toStyle.BorderBottom == fromStyle.BorderBottom
                            && toStyle.BorderLeft == fromStyle.BorderLeft
                            && toStyle.BorderRight == fromStyle.BorderRight
                            && toStyle.BorderTop == fromStyle.BorderTop
                            && toStyle.TopBorderColor == fromStyle.TopBorderColor
                            && toStyle.BottomBorderColor == fromStyle.BottomBorderColor
                            && toStyle.RightBorderColor == fromStyle.RightBorderColor
                            && toStyle.LeftBorderColor == fromStyle.LeftBorderColor
                            //背景和前景
                            && toStyle.FillBackgroundColor == fromStyle.FillBackgroundColor
                            && toStyle.FillForegroundColor == fromStyle.FillForegroundColor
                            //&& toStyle.DataFormat == fromStyle.DataFormat
                            //&& toStyle.FillPattern == fromStyle.FillPattern
                            && toStyle.IsHidden == fromStyle.IsHidden
                            //&& toStyle.Indention == fromStyle.Indention//首行缩进
                            //&& toStyle.IsLocked == fromStyle.IsLocked
                            //&& toStyle.Rotation == fromStyle.Rotation//旋转
                            && toStyle.VerticalAlignment == fromStyle.VerticalAlignment
                            //&& toStyle.WrapText == fromStyle.WrapText
                        )
                    {
                        return toStyle;
                    }

                }
                return null;
            }
            set
            {
                this.Add(fromStyle);
            }
        }
    }
 public static void CopyCell(IWorkbook fromWb,IWorkbook toWb, ICell srcCell, ICell distCell, bool copyValueFlag)
        {
            //ICellStyle newstyle = toWb.CreateCellStyle();
            ICellStyle newstyle = CreateCellStyle(toWb, srcCell.CellStyle);
            //复制样式
            newstyle.CloneStyleFrom(srcCell.CellStyle);
            //样式
            distCell.CellStyle = newstyle;
            //评论
            if (srcCell.CellComment != null)
            {
                distCell.CellComment = srcCell.CellComment;
            }
            // 不同数据类型处理
            CellType srcCellType = srcCell.CellType;
            distCell.SetCellType(srcCellType);
            if (copyValueFlag)
            {
                if (srcCellType == CellType.Numeric)
                {
                    if (HSSFDateUtil.IsCellDateFormatted(srcCell))
                    {
                        distCell.SetCellValue(srcCell.DateCellValue);
                    }
                    else
                    {
                        distCell.SetCellValue(srcCell.NumericCellValue);
                    }
                }
                else if (srcCellType == CellType.String)
                {
                    distCell.SetCellValue(srcCell.RichStringCellValue);
                }
                else if (srcCellType == CellType.Blank)
                {
                    // nothing21
                }
                else if (srcCellType == CellType.Boolean)
                {
                    distCell.SetCellValue(srcCell.BooleanCellValue);
                }
                else if (srcCellType == CellType.Error)
                {
                    distCell.SetCellErrorValue(srcCell.ErrorCellValue);
                }
                else if (srcCellType == CellType.Formula)
                {
                    distCell.SetCellFormula(srcCell.CellFormula);
                }
                else
                {
                    // nothing29
                }
            }
        }
private static CellStyleCache styleCache = new CellStyleCache();
        public static ICellStyle CreateCellStyle(IWorkbook wb,ICellStyle fromStyle)
        {
            ICellStyle newStyle = styleCache[fromStyle];
            if (newStyle == null)
            {
                newStyle = wb.CreateCellStyle();
            }
            return newStyle;
        }

测试通过.

时间: 2024-10-06 05:42:33

npoi workbook 的 cellstyle 创建不能超过4000的解决方法的相关文章

VirtualBox创建com对象失败,解决方法。

右键VirtualBox的桌面快捷方式,选择属性,选到兼容性选项卡,勾选"以兼容模式运行这个程序",下拉框选择Windows Server 2008 (Service Pack 1),再勾选"以管理员身份运行此程序",确定.重新打开,就OK了. VirtualBox创建com对象失败,解决方法.,布布扣,bubuko.com

MySQL连接数超过限制的解决方法

最近网站出现 User 数据库名称 has already more than 'max_user_connections' active connections 的报错,网站瘫痪.有必要研究下这个问题. max_user_connections 是 MySQL 用户连接数的最大值设置,整段语句的意思是:服务器的 MySQL 的最大连接数参数设置不足.解决方法:修改 MySQL 安装目录下 my.ini 或者 my.cnf 文件内的 max_user_connections 参数的数值,重启 M

创建SQL作业错误的解决方法(不能将值 NULL 插入列 'owner_sid',表 'msdb.dbo.sysjobs';列不允许有空值。)

在用SQL语句创建SQL Server作业时有时出现如下错误: 消息 515,级别 16,状态 2,过程 sp_add_job,第 137 行 不能将值 NULL 插入列 'owner_sid',表 'msdb.dbo.sysjobs':列不允许有空值.INSERT 失败. 语句已终止. 这可能与为作业创建的数据库登录ID有关,这个登录ID需要是数据库的所有者(我的是sa),因此将 @owner_login_name=N'HYSERITC003/wellcomm', 中的N'HYSERITC00

Apache服务器httpd.exe进程占用cpu超过50%的解决方法

httpd.exe进程占用cpu超过50%,关闭掉Apache服务,cpu应用率立刻下降到0.  重新启动Apache又出现占用cpu高的情况.  原因是:httpd.exe和防火墙配置有冲突. 解决方法如下: 1.网上邻居->本地链接->属性->internet协议(TCP/IP)->属性->高级->wins标签->去掉起用LMhosts查询前的勾. 2.控制面版->windows防火墙->高级标签->本地链接设置->服务的标签里勾选安全

使用solr界面管理工具创建core 不能用的解决方法

可以用命令行进行创建  首先要先进入 solr所属的 用户 solr 中 然后创建 你的core  显示以下信息 就创建成功了 成功之之后可以在solr管理界面 进行 操作solr_sample

ubuntu 14.04 32bit 创建文件系统无法showmount的解决方法

1.创建文件系统之后sudo apt-get install nfs-kernel-server. 2.输入showmount -e 如果可以共享出去那就不用执行下一步. 用ubuntu14.04 64bit 是可以显示的,不知道为什么32bit的不行..... 3.如果还是无法共享就配置/etc/exports,输入 vim /etc/exports 添加要共享的文件夹的绝对路径. 4.执行exports -r 更新 5.重新启动nfs,执行/etc/init.d/nfs-kernel-ser

SENCHA用cmd创建app时错误的解决方法

SENCHA用cmd创建app时发生错误 提示 unable to locate support framework 之类的问题 可以输入 sencha -sdk 你sdk的目录 generate app APPNAME 你要放app的目录

git 手误在桌面上创建了本地仓库,解决方法

因为小白在使用git进行分布式版本控制的时候,不小心新在磁盘下, 直接创建了本地仓库,结果在磁盘下直接创建了,项目中磁盘下的全部文件都带有?. 解决的方法如下: 我的电脑是在win7下: 计算机-->左上角组织,选择文件夹与搜索选项-->查看-->隐藏的文件都点击成显示的 最后,在你的磁盘下,扎到.git文件夹,删除即可.

小程序包大小超过2M的解决方法

小程序的包被限制在2M以下, 超出的时候点击预览, 发现报错: Error: 代码包大小为 3701 kb,上限为 2048 kb,请删除文件后重试 1. 优化代码, 删除掉不用的代码 2. 图片压缩或上传服务器 一般图片所占空间较大,尽量不要放在小程序本地文件夹中,如果图片不多我们也可以对图片进行压缩,我经常使用的图片压缩平台:点击这里: 也可以将图片上传到服务器上,进行外链引用, 我们使用的是阿里云oss存储, 另外也可以通过图片托管平台对图片进行托管, 我找到的的图片托管平台:点击此处: