微信公众号“dotNET跨平台”的文章《一个.NET开源、性能优异的Excel数据读取库》介绍了C#开源Excel文件读写库Sylvan.Data.Excel,其支持读取xlsx、xlsb、xls等格式的Excel文件,同时支持写入xlsx、xlsb格式的Excel文件,据说具有最快的Excel读取速度。本文学习并测试其基本用法。
VS2022新建Winform项目,如果仅读取Excel文件,在Nuget包管理器中搜索并安装Sylvan.Data.Excel包即可,如果还需要写入Excel文件,则可以安装Sylvan.Data包(主要使用其中的AsDataReader扩展函数,使用比较方便,按照其GitHub官网主页示例来看,其实是不需要装,但在其测试用例中是用了该包)。
准备以下Excel测试数据,第一行为列名,从第二行开始为测试数据。
Sylvan.Data.Excel库的ExcelDataReader类用于读取Excel文件,根据测试情况来看,默认第一行为列名,通过edr.GetName函数可以获取指定列的列名,FieldCount属性标识总列数,RowCount为总行数(包括第一行),调用Read函数读取一行数据,然后调用各类GetString、GetInt等函数获取指定列、指定格式的值,主要示例及显示效果如下图所示:
using ExcelDataReader edr = ExcelDataReader.Create(txtFileName.Text);
for (int i = 0; i < edr.FieldCount; i++)
{
DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();
column.HeaderText = edr.GetName(i);
dgvData.Columns.Add(column);
}
while (edr.Read())
{
DataGridViewRow dataGridViewRow = new DataGridViewRow();
dataGridViewRow.CreateCells(dgvData);
for (int i = 0; i < edr.FieldCount; i++)
{
dataGridViewRow.Cells[i].Value = edr.GetString(i);
}
dgvData.Rows.Add(dataGridViewRow);
}
写入Excel文件使用ExcelDataWriter类,只能新建或覆盖文件写入,不支持向已有文件中追加写入数据。该类通过DbDataReader对象读取数据集合并写入数据,第一行为数据类型的属性名称(本文测试时将属性名称定义为中文,以便在一行写入中文列名),从第二行开始写入真正的数据,使用示例及Excel文件效果如下图所示。
List<Student> lstStudents = new List<Student>();
foreach(DataGridViewRow dgvr in dgvData.Rows)
{
Student student = new Student();
student.ID = dgvr.Cells[0].Value.ToString();
student.姓名= dgvr.Cells[1].Value.ToString();
student.性别 = dgvr.Cells[2].Value.ToString();
student.电子邮箱 = dgvr.Cells[3].Value.ToString();
lstStudents.Add(student);
}
// 不用扩展函数的话,则使用下面代码创建读取类
// DbDataReader reader=ObjectDataReader.Create(lstStudents);
DbDataReader reader = lstStudents.AsDataReader();
using (var w = ExcelDataWriter.Create(saveFileDialog.FileName))
{
w.Write(reader);
}
参考文献:
[1]https://github.com/MarkPflug/Sylvan.Data.Excel
[2]https://blog.youkuaiyun.com/sd7o95o/article/details/142976888