??使用微軟的com組件Microsoft.office.Interop.Excel讀寫Excel文件雖然可用,但是列多、行多的時候速度很慢,之前測試過Sylvan.Data.Excel包的用法,如果只是讀取Excel文件內容的話,還可以使用ExcelDataReader包,后者是C#開源、輕量化、快速的Excel文件讀取庫,支持讀取xlsx、xlsb、xls、csv格式的文件。本文學習并測試ExcelDataReader包的基本用法。
??新建Winform項目,在Nuget包管理器中搜索并安裝ExcelDataReader。
??ExcelDataReader包中最重要的是ExcelReaderFactory類和IExcelDataReader接口,前者根據不同的文件格式創建對應的數據讀取類(也即IExcelDataReader接口實現類),后者用于操作excel文件。IExcelDataReader的常用函數或屬性如下:
序號 | 函數或屬性 | 說明 |
---|---|---|
1 | Read | 讀取當前工作簿中的一行數據 |
2 | NextResult | 切換到當前文件的下一工作簿 |
3 | ResultsCount | 獲取當前文件的工作簿數量 |
4 | FieldCount | 返回當前工作簿中的列數量 |
5 | RowCount | 返回當前工作簿中的行數量 |
6 | GetValue | 獲取當前工作簿通過Read函數獲取的一行數據中指定列的數據,返回值類型為object,同理還有GetDouble、GetInt32、GetBoolean、GetDateTime、GetString函數,返回指定類型的數據 |
7 | GetColumnWidth | 返回列寬,如果列是隱藏狀態,則返回 0 |
8 | RowHeight | 返回行高 ,如果行是隱藏狀態,則返回 0 |
??下方為基本的測試代碼,不同于Sylvan.Data.Excel包有專門的函數獲取列名,ExcelDataReader需要自己寫代碼獲取列名(其實就是先調用一次Read函數),然后再繼續讀取下面的數據。
using (var stream = File.Open(txtFileName.Text, FileMode.Open, FileAccess.Read))
{using (var reader = ExcelReaderFactory.CreateReader(stream)){reader.Read();for (int i = 0; i < reader.FieldCount; i++){DataGridViewTextBoxColumn column = new DataGridViewTextBoxColumn();column.HeaderText = reader.GetString(i);dgvData.Columns.Add(column);}while (reader.Read()){DataGridViewRow dataGridViewRow = new DataGridViewRow();dataGridViewRow.CreateCells(dgvData);for (int i = 0; i < reader.FieldCount; i++){dataGridViewRow.Cells[i].Value = reader.GetValue(i);}dgvData.Rows.Add(dataGridViewRow);}}
}
??程序運行時遇到下面的報錯,百度該錯誤,找到參考文獻3,其中說到要安裝System.Text .Encoding.CodePages包,同時在項目的program文件中增加下面的一行代碼,照做后問題解決。
static void Main()
{ApplicationConfiguration.Initialize();//增加下面一行代碼System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);Application.Run(new Form1());
}
??最后是程序運行效果,如下圖所示:
參考文獻:
[1]https://zhuanlan.zhihu.com/p/18555606219
[2]https://github.com/ExcelDataReader/ExcelDataReader
[3]https://blog.csdn.net/qq_41545233/article/details/122198747