关于NPOI带格式高速写入大量数据

本文介绍如何通过NPOI库在写入DataTable时添加自定义表头,包括直接插入和针对复杂格式的多次循环写入策略。重点在于解决大数据文件写入性能问题,对比了单行写入与批量处理的性能差异,以及如何在处理40万数据文件时显著提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇文章写了使用NPOI将DataTable直接写入EXCEL文件,但是问题就是没有表头而且不能保留原有格式。经过优化,写出了以下两个解决方案

1.在写入DataTable的时候添加一行表头(插入上一篇文章的代码中)

                    int rowIndex = 0;
                    int i = 0;
                    IRow data = sheet.CreateRow(rowIndex);
                    data.RowStyle = cellStyle;
                    foreach (var item in Hands)//循环遍历表头
                    {
                        data.CreateCell(i).SetCellValue(item.ToString());//添加表头
                        i++;
                    }

但是这样也有个坏处,就是写入的都是数据表自带的属性和内容,如果我想加个花里胡哨的表头或者把Bool型转为 √ 或者 × 怎么办呢,那就要用到第二种方法,多次循环并一次写入。

public static void PushValue(String ExcelPath, List<Mans> LMan)
        {
            string fileExt = Path.GetExtension(ExcelPath).ToLower();
            HSSFWorkbook wk = null;
            using (FileStream fs = File.Open(ExcelPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                wk = new HSSFWorkbook(fs);
                fs.Close();
            }
            //把xls文件读入workbook变量里,之后就可以关闭了
            int Index = 0;
            ISheet sheet = wk.GetSheetAt(0);
            foreach (var ps in LMan)
            {
                IRow row = sheet.CreateRow(Index + 6);

                ICell cell = row.CreateCell(0);
                cell.SetCellValue(ps.Name);
                
                if (ps.IsAlive == "健在")
                {
                    cell = row.CreateCell(15);
                    cell.SetCellValue("√");
                }
                if (ps.IsAlive == "死亡")
                {
                    cell = row.CreateCell(16);
                    cell.SetCellValue("√");
                }

                ///......内部执行语句....////
                
                Index++;
            }
            


            using (FileStream fileStream = File.Open(ExcelPath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                wk.Write(fileStream);
                fileStream.Close();
            }
        }

而其中单行写入造成写入越来越慢的罪魁祸首就是

ISheet sheet = wk.GetSheetAt(0);

当文件越来越大的时候,获取表的速度就会越来越慢,而当文件行数超过2000时速度下降会非常厉害,如果需要写入大量文件就一定要直接一次写入。这个算法经过实测分批写入一份40W的数据文件仅需要半分钟,比直接一行行写入耗费几个小时快了不知道几个华莱士了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值