aardio调用ExcelDataReader.dll来快速读取excel文件

By admin at 2022-04-23 • 0人收藏 • 617人看过

前面讲过npoi和其他的几个excel操作库, 这些程序集操作速度最快的应该是npoi了, 但是有时候需要读取几十万行列的超大数据就有些力不从心了.

网上很多人推荐用ExcelDataReader来读取excel , 轻量, 大数据文件速度更快.

这里进行简单的测试, 由于没有特别大的文件, 就没测试大数据, 有这方面需求的可以自己测试下, 欢迎测试后留言反馈下.


ExcelDataReader开源地址:

https://github.com/ExcelDataReader/ExcelDataReader

Lightweight and fast library written in C# for reading Microsoft Excel files

在vs中可以在包管理器里面直接 搜索它的名字直接安装依赖库.


image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=759;bottom=469)
winform.add(
custom={cls="custom";text="自定义控件";left=0;top=0;right=760;bottom=470;bgcolor=12639424;db=1;dl=1;dr=1;dt=1;z=1}
)
/*}}*/

import dotNet;
import System.Windows.Forms;
var Forms = System.Windows.Forms;
var dataGridView = Forms.CreateEmbed("DataGridView",winform.custom); 
dataGridView.ColumnHeadersHeightSizeMode = 2; //避免在高分屏下错乱
dataGridView.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect; //整行选择 
//dataGridView.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;//列填充
//声明接口
var Readerdll = dotNet.load("\ExcelDataReader.dll"); 
var ExcelDataReader = Readerdll.import("ExcelDataReader");
//声明接口
var ReaderDataSetdll = dotNet.load("\ExcelDataReader.DataSet.dll"); 
var ExcelDataReaderExtensions = ReaderDataSetdll.import("ExcelDataReader.ExcelDataReaderExtensions");
//文件流
import System.IO;
var stream = System.IO.File.OpenRead("C:\Users\Desktop\PivotTables.xlsx");
//操作文件
var reader = ExcelDataReader.ExcelReaderFactory.CreateReader(stream);
//转换为dataset
var result = ExcelDataReaderExtensions.AsDataSet(reader);
//关闭文件占用
stream.Close();
//显示数据
dataGridView.DataSource = result.Tables[1];
//最后一列填充满剩余宽度
dataGridView.Columns[dataGridView.ColumnCount].AutoSizeMode = System.Windows.Forms.DataGridViewAutoSizeColumnMode.Fill;

winform.show();
win.loopMessage();

如果不同的sheet可以用下面两种方式访问:

方式1:  直接用序号访问

//显示数据
dataGridView.DataSource = result.Tables[1];//2 3 4 ...

方式2: 用sheet名字访问

//显示数据
dataGridView.DataSource = result.Tables.Item["Sheet1"];

完!



上面和调用其他c#程序集不同地方是:

在vs中当你

 using ExcelDataReader;

之后就可以添加ExcelDataReader的名字空间了,  这样它的扩展库ExcelDataReader.DataSet.dll 就也直接被集成到这个名字空间了, 所以可以直接使用 

var result = reader.AsDataSet();                 
this.dataGridView1.DataSource = result.Tables[0];

进行转换为dataset格式.

但是在aardio中, 名字空间是隔离的, 所以这里就需要使用另外的方式来实现这个扩展功能. 相当于在vs中使用

var result = ExcelDataReader.ExcelDataReaderExtensions.AsDataSet(reader);

来实现.


工程文件下载:

ExcelDataReader.zip


3 个回复 | 最后更新于 2022-04-25
2022-04-24   #1

这段时间试了miniExcel,苦于不知道怎么把C#中的array转成aardio中使用...

我试试楼主的看看

2022-04-24   #2

原来在excel里VBA怎么数据 ,直接通过数组方式处理速度快得很,想改一改移植进aardio,也没有试出一种类似的方法...

2022-04-25   #3

虚似机里测试了一下5W条数据

先放结果

image.png

10W条

image.png


测试代码

var tim = time.tick();
    import System.Windows.Forms;
    var Forms = System.Windows.Forms;
    var dataGridView = Forms.CreateEmbed("DataGridView", winform.custom);
    dataGridView.ColumnHeadersHeightSizeMode = 2; //避免在高分屏下错乱 
    
    import System.Type;
    import System.Data;
    
    var dataTable = System.Data.DataTable("DT");
    
    //添加数据
    
    var dll = dotNet.load("res\Aspose.Cells.dll"); //
    var workbook = dll.new("Aspose.Cells.Workbook", "res\示例数据.xlsx");
    var cells = workbook.Worksheets[1].Cells;
    
    var dataTable1 = cells.ExportDataTable(1, 0, cells.MaxDataRow, cells.MaxColumn + 1); //noneTitle
    var dataTable2 = cells.ExportDataTable(0, 0, cells.MaxDataRow + 1, cells.MaxColumn + 1, true); //showTitle
    
    //显示数据
    var dataView = System.Data.DataView(dataTable1);
    dataGridView.DataSource = dataView;
    dataGridView.EditMode = 2;
    console.log("使用aspose花费时间:", (time.tick() - tim) / 1000)


使用aspose.Cells的好处是直接,在vs生成dll,直接调用,几条命令就将数据吐到datatable,不好的地方是它收费.(我个人有偏见,收费也没有什么不好)

不过不影响使用...

登录后方可回帖

登 录
信息栏
公告:
个人博客
专注分享
谢谢合作!

本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...