LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【C#】一款轻量级的Excel操作组件MiniExcel

admin
2023年10月16日 9:45 本文热度 714
、概述

一直以来,C#操作Excel格式文档常用的方式有Office互操作组件、NPOI、EPPLUS等,每种方式各有其优缺点。我们简单汇总了一下,参见下表。


上表中,有商业的,也有免费的。就组件质量来说,商业的肯定要比开源免费的好。不差钱的用户建议优先选择商业组件库。质量和服务都有保障。免费的组件库中,NPOI目前应该可以算是占有率最高了。

除了上面几种外,我们现在还有一款简单、高效避免OOM的轻量级,名为MiniExcel的类库可以选择。


、MiniExcel特点
  1. 低内存耗用,避免OOM、频繁 Full GC 情况;

  2. 支持即时操作每行数据;

  3. 兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询;

  4. 轻量,不需要安装 Microsoft OfficeCOM+DLL小于150KB

  5. 简便操作的 API 风格;


、如何使用

MiniExcel使用比较方便,也有比较完善的文档帮助(链接:https://gitee.com/dotnetchina/MiniExcel)。这里我们结合一个实际例子来简单介绍如何使用。


1、需求说明


WinCC有两个bool类型变量。分别表示Save和Export。其中Save为true时开始按照指定的时间间隔读取数据,为false时停止读取。当Export为true时将读取的数据写到一个excel文件中,然后导出到指定的文件夹下面。


2、程序界面


因为完全后台运行,所以界面比较简单。只有一个过程消息显示和两个操作按钮。两个按钮分别用于打开导出的文件夹和手动强制导出。

代码也不复杂。界面加载后启动一个线程对WinCC的这两个变量进行监视。当bSave为true时把数据保存到一个list中。当bSave为false时停止记录。数据存储的时间间隔我们简单地用了一个计数器来实现。

//保存命令bool bSave = hmi.ReadTag("a1") == "1";

//导出命令bool bExport = hmi.ReadTag("a2") == "1";
//开始记录

if (bSave){

  if (StartLog)

  {

      if (DataBuff.Count>=32000)

      {

         labMsg.Text = "信息: " + "记录数超限,请先导出再记录";

      }

      else

      {

          labMsg.Text = "信息: " + "正在记录数据......";

          Models.DataModel dm = new Models.DataModel();

          dm.DT = DateTime.Now.ToString();

          dm.Data1 = hmi.ReadTag("PAR1");

          dm.Data2 = hmi.ReadTag("PAR2");

          dm.Data3 = hmi.ReadTag("PAR3");

          dm.Data4 = hmi.ReadTag("PAR4");

          dm.Data5 = hmi.ReadTag("PAR5");

          dm.Data6 = hmi.ReadTag("PAR6");

          dm.Data7 = hmi.ReadTag("PAR7");

          dm.Data8 = hmi.ReadTag("PAR8");

          DataBuff.Add(dm);

      }

  }
  StartLog = 
false;

  count++;

  if (count>=timespace)

  {

      StartLog = true;

      count = 0;

  }

}

Else

{

   if (DataBuff.Count>0 && !bSave)

   {

       labMsg.Text = "信息: " + "暂停记录数据......";

   }

}

当bExport为true时或者点击手动导出按钮时把数据保存到指定的文件夹下面。导出完成后清除list里面的数据。

//导出

if (ExportPN.P(bExport) || ManualExport)

{

    //手动导出命令

    ManualExport = false;

    if (DataBuff.Count>0)

    {

        StartLog = true;

        count = 0;

        string MainPath = INIOperation.INIGetStringValue(CommData.ConfigPath, "Export""Path"string.Empty);

        //判断路径是否存在

        string Path = MainPath + DateTime.Now.ToString("yyyy-MM") + "/";

        if (Directory.Exists(Path))

        {

            //

        }

        else

        {

            DirectoryInfo directoryInfo = new DirectoryInfo(Path);

            labMsg.Text = "信息: " + "创建新文件夹......";

            directoryInfo.create();

        }
        
string FilePath = Path + DateTime.Now.ToString("yyyyMMddHHmmss")+".xlsx";

         //Excel

         var config = new OpenXmlConfiguration

         {

              DynamicColumns = new DynamicExcelColumn[] {

              new DynamicExcelColumn("DT"){Width=20,Name="日期时间"},

              new DynamicExcelColumn("Data1"){Width=15,Name=AliasList[0],Ignore=string.IsNullOrEmpty(AliasList[0])},

              new DynamicExcelColumn("Data2"){Width=15,Name=AliasList[1],Ignore=string.IsNullOrEmpty(AliasList[1])},

              new DynamicExcelColumn("Data3"){Width=15,Name=AliasList[2],Ignore=string.IsNullOrEmpty(AliasList[2])},

              new DynamicExcelColumn("Data4"){Width=15,Name=AliasList[3],Ignore=string.IsNullOrEmpty(AliasList[3])},

              new DynamicExcelColumn("Data5"){Width=15,Name=AliasList[4],Ignore=string.IsNullOrEmpty(AliasList[4])},

              new DynamicExcelColumn("Data6"){Width=15,Name=AliasList[5],Ignore=string.IsNullOrEmpty(AliasList[5])},

              new DynamicExcelColumn("Data7"){Width=15,Name=AliasList[6],Ignore=string.IsNullOrEmpty(AliasList[6])},

              new DynamicExcelColumn("Data8"){Width=15,Name=AliasList[7],Ignore=string.IsNullOrEmpty(AliasList[7])}

          }

      };
     
//导出Excel

      MiniExcelLibs.MiniExcel.SaveAs(FilePath, DataBuff, configuration: config);

      DataBuff.Clear();

      labMsg.Text = "信息: " + "导出文件成功!";

   }

   else

      labMsg.Text = "信息: " + "无数据,请先记录数据!";

}

从上面的代码可以看出,MiniExcel的使用还是比较简单的。寥寥数行即可实现将数据保存到Excel中。导出的文件效果如下图所示。


这个小项目中我们只用到了MiniExcel的写入和保存功能,其它的读取、查询功能没有使用到,大家可以自行参考帮助。


该文章在 2023/10/16 9:45:42 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved