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

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

前面讲过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,不好的地方是它收费.(我个人有偏见,收费也没有什么不好)

不过不影响使用...

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...