使用NPOI处理EXCEL文件:例1-关于优化的一些问题

记得有一次处理Excel文件对比,自己前后使用VBA和NPOI对比了下效率。由于涉及到页面的渲染和刷新,二者的处理速度差了个数量级(10多秒和几十分钟的差别)。当然使用NPOI操作时也做了一定优化。印象这么深刻这次一有需求就想到了NPOI。

需求:财务数据,只挑出最新月份(整数类型,yyyyMM)的数据。然后将数据增加一部分固定列内容按格式写入到另外一张表中。

由于宋丹丹老师把一切复杂的问题都总结为三步:打开冰箱门,把大象塞进去,关上冰箱门。那么我也把这个问题拆分出以下几个三步走

1、打开数据源:

使用NPOI可以打开xls和xlsx类型的,这个没有一点问题

由于使用了wpf,下面也又分为(以下没有什么好说的都是正常代码)

1.1 设置一个按钮

1.2 点击时弹出"打开文件"框

1.3如果选择了文件就获取文件路径。

2、读取数据:

上面获取了文件路径,我们就可以正常打开了。

对于如何读取到合适的数据,我在这里有个优化

先只读取日期列,找出最大日期的那些行。这里我用了一个Dictionary<DateTime, List<int>> 来保存行号。同时记录了一个最大的日期值。通过这点只读取了日期最大的行,会减少读取操作。我觉得这一点

cs 复制代码
 ISheet sheet = workbook.GetSheetAt(0);

 int cellcount = head.LastCellNum;//一行最多有多少个列
 long maxRow = sheet.LastRowNum;//页面有多少行
 Dictionary<DateTime, List<int>> dateRows = new Dictionary<DateTime, List<int>>();
 var rows = new List<IRow>();
 for (int i = 1; i < maxRow; i++)//第一行是标题行,忽略
 {
     var row = sheet.GetRow(i);
     var cell = row.GetCell(0);//日期行,数据形式yyyyMM
     if (cell != null)
     {
         var num=(int) cell.NumericCellValue;
         var year = num / 100;
         var mon = num% 100;
         var day = 1;
         var date = new DateTime(year, mon, day);
         if (dateRows.Keys.Contains(date))
         {
             dateRows[date].Add(i);
         }
         else
         {
             dateRows.Add(date, new List<int> { i });
         }
     }
 }

3、写入并保存文件:

由于单元格有一定格式,我想了一个取巧的办法-使用一个文件模板,保存的时候另存文件。

在数据写入的时候又发现了一个优化点。有20多行他们之前是可以采用循环来赋值的。

cs 复制代码
 

  //表1的第10行到34,对应表2的第18到42行,数据格式也一致,完美。
  for (int j = 9, k = 17; j < 34; j++, k++)
  {
      if (srcRow.Cells[j].CellType == CellType.Numeric)
      {

          row.CreateCell(k).SetCellValue(srcRow.Cells[j].NumericCellValue);
      }
  }

自我总结:一个简单的程序,自顶向下的思路,逐步解决问题。优化要多码,多总结。

相关推荐
bin91538 小时前
【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和常规型数字格式的区别
大数据·前端·数据库·信息可视化·数据分析·excel·数据可视化
Eiceblue20 小时前
Python保留数据删除Excel单元格的函数和公式
开发语言·python·excel
bin915320 小时前
【EXCEL数据处理】000014 案例 EXCEL分类汇总、定位和创建组。附多个操作案例。
信息可视化·数据挖掘·数据分析·excel·数据可视化·数据图表·excel 数据分析
育种数据分析之放飞自我20 小时前
GWAS分析中显著位点如何注释基因:excel???
linux·算法·excel
PowerBI学谦1 天前
Python in Excel 正式发布!
开发语言·python·excel
bin91531 天前
【EXCEL数据处理】000011 案列 EXCEL带有三角形图标的单元格转换,和文本日期格式转换。
大数据·数据库·信息可视化·数据挖掘·数据分析·excel·数据可视化
股票程序交易接口1 天前
股票接口api,如何用excel获得股票实时数据
excel·量化交易·股票api接口·股票量化接口·python股票接口·股票实时数据
zh路西法1 天前
【Matlab绘图】从Excel导入表格并进行三维绘图
开发语言·matlab·excel
百事牛1 天前
防止错误输入!Excel单元格限制输入内容的三种有效方式
windows·excel
DefineJ1 天前
EXCEL图片链接快速批量转成图片
excel