c#快速读写Excel文件用于需要大批量处理Excel文件

在项目中需要使用C#读写Excel,然后进行汇总处理数据到模板,之前使用Excel 编写VBA 宏文件进行处理,但是速度太慢,而且还暂用内存,于是就想着自己写个c#程序来处理,大量的Excel文件数据,进行汇总统计。发现一个开源的公共库,可以解决,于是就开始熟悉EPPlus的.NET的开源库,可以快速读写Excel文件,非常适用于需要处理大量数据的应用程序。

官方网站:Excel spreadsheet library for .NET Framework/Core - EPPlus Software

简介

EPPlus是一个使用Open Office XML(xlsx)文件格式,能读写Excel 2007/2010 文件的开源组件,在导出Excel的时候不需要电脑上安装office,它的一个缺点就是不支持导出2003版的Excel(xls)。

通过nuget 包管理器添加

在这里插入图片描述

 我们先来设计一下功能按钮

 操作步骤:1.点击选择,选择需要处理的Excel文件夹路径

                   2.点击“第一站汇总” 开始读取文件到指点的模板中

 

 

处理完成以后就可以点击把汇总好的数据进行导出

 

 两个多个文件,处理完成时间在两分钟内,之前用宏文件处理至少需要五十分钟以上,现在两分钟搞定,给生产的同事解决了他们的疼点。 接下来我们还是来看看是怎么实现的把!

选择文件夹按钮代码:

 第一站汇总按钮代码:

 读取数据,然后进行输出保存到指定模板中

private void ProcessFilesFirst(string folderPath, string workbookPath,int filesCount)
        {
            // 添加进度条控件并设置初始值
            ProgressBar progressBar = new ProgressBar();
            progressBar.Minimum = 0;
            progressBar.Maximum = filesCount;
            progressBar.Value = 0;

            using (ExcelPackage package = new ExcelPackage(new FileInfo(workbookPath)))
            {
                ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
                ExcelWorksheet ws1 = package.Workbook.Worksheets[0];
                ExcelWorksheet ws2 = package.Workbook.Worksheets[1];

                int processedFiles = 0;

                ws2.Cells[1, 1].Value = "名称";
                ws2.Cells[1, 2].Value = "文件类型";
                ws2.Cells[1, 3].Value = "打开文件链接";

                List<FileInfo> fileList = ExtractFileNames(folderPath, ws1, ws2);

                // 初始化进度条
                startProgress(filesCount);

                foreach (FileInfo file in fileList)
                {
                   
                    using (ExcelPackage excelPackage = new ExcelPackage(new FileInfo(folderPath + "\\" + file.Name)))
                    {
                        

                        processedFiles++;
                        #region 文件处理显示
                        //lblStatus.Text = "正在处理第" + processedFiles + "/" + filesCount + "个文件";
                        //lblStatus.Refresh();
                        string statusText = "正在处理第 " + processedFiles + "/" + filesCount + " 个文件";
                        UpdateStatusLabel(statusText);
                        #endregion
                        var excelWorksheet = excelPackage.Workbook.Worksheets["外观汇总"];
                        excelWorksheet.Calculate();//执行计算
                        if (excelWorksheet.Protection.IsProtected)
                        {
                            // 如果工作表受保护,则设置IsProtected为false来取消保护
                            excelWorksheet.Protection.IsProtected = false;
                            excelWorksheet.Protection.AllowSelectLockedCells = true;
                        }
                        // 复制外观汇总
                        //ws1.Cells[processedFiles + 4, 12].Value = excelWorksheet.Cells[2, 10].Value; // 获取单元格的值
                        //ws1.Cells[processedFiles + 4, 13].Value = excelWorksheet.Cells[2, 11].Value;// 获取单元格的值
                        ws1.Cells[processedFiles + 4, 12].Value = excelWorksheet.Cells[2, 10].GetValue<int>();  // 获取单元格的值OK数量
                        ws1.Cells[processedFiles + 4, 13].Value = excelWorksheet.Cells[2, 11].GetValue<int>();// 获取单元格的值

                        excelWorksheet = excelPackage.Workbook.Worksheets["尺寸1"];
                        excelWorksheet.Calculate();//执行计算
                        // 复制尺寸1
                        //ws1.Cells[processedFiles + 4, 14].Value = excelWorksheet.Cells[2, 14].Value;
                        ws1.Cells[processedFiles + 4, 14].Value = excelWorksheet.Cells[2, 14].GetValue<int>();//OK数量


                        // 计算其他列的值
                        double value14 = ws1.Cells[processedFiles + 4, 14].GetValue<double>();
                        ws1.Cells[processedFiles + 4, 15].Value = 400 - value14;
                        ws1.Cells[processedFiles + 4, 16].Value = (Math.Round((400-value14) / value14 * 100, 1)).ToString("0.0") + "%";

                        // 更新进度条值
                        updateProgress(processedFiles);
                    }
                    
                }

                package.Save();
            }
        }

总结

EPPlus还提供了一些高级功能,例如合并单元格、设置单元格样式、添加图表等。使用这些功能,我们可以创建出非常漂亮的Excel文件。

EPPlus的性能也非常出色,它采用了一些优化技术来提高读写Excel文件的速度。例如,它会将数据缓存到内存中,以减少磁盘IO操作。此外,EPPlus还支持多线程读写,可以进一步提高性能。

总之,EPPlus是一个非常实用的.NET库,可以帮助我们快速地读写Excel文件。它的API简单易用,性能出色,非常适合处理大量数据的应用程序。如果你需要处理Excel文件,EPPlus绝对是一个值得尝试的工具。

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值