通常,要存取Excel档案,无非是把Excel档案当作资料库,透过Ole或ODBC存取,不然就是透过Excel的ActiveX元件,开启档案,逐一读取。
这两种方式,在执行效率上似乎都不是很好,尤其是遇到工作表、资料列很多的状况,让人感觉到几乎跟当机没两样....
L 在 CodePlex 上找到了一个for .net的开源 Excel 读取元件,支援Excel 97-2003的xls格式,以及Excel 2007 xlsx档案格式。
透过这个元件,存取Excel资料,显得更加快速、简单。
如果客户要求,应用程式必须要可以读取Excel档、把Excel汇入资料库...等等疑难杂症,程式设计人员存取Excel档案的方式,不外乎把Excel档案当作资料库,透过Ole或ODBC存取,不然就是透过Excel的ActiveX元件,开启档案,逐一读取,执行效率上似乎都不是很好。
CodePlex 上的 ExcelDataReader 元件,支援Excel 97-2003的xls格式,以及Excel 2007 xlsx档案格式。透过这个元件,存取Excel资料,显得更加快速、简单。
以下是一段C# 写的 Console application:
using System;using System.Data;using Excel;using ICSharpCode;using Excel.Core;using ICSharpCode.SharpZipLib;using System.IO;namespace ExcelReader{ class Program { public static void Main(string[] args) { Console.WriteLine("Welcome to Excel Reader testing program!"); Console.Write("Please enter a full path of an Excel file:"); string strPath = Console.ReadLine(); if(String.IsNullOrEmpty(strPath)) Console.WriteLine("Invalid file path!"); else{if(File.Exists(strPath){ try{ // Excel 97-2003档案格式-->CreateBinaryReader;Excel 2007档案格式-->CreateOpenXmlReader IExcelDataReader _reader = ExcelReaderFactory.CreateBinaryReader(File.Open(strPath, FileMode.Open,FileAccess.Read)); /* 若设定IsFirstRowAsColumnNames为true,倒入资料时会由第二列开始倒入,第一列的资料将被忽略 * 第一列的内容,会被当做每个栏位的名称,透过SharDevelop执行,会有很奇怪的问题....请爱用Visual Studio...Orz。 * 这个Component处理中文好像有不少问题...... * 如果要将Excel资料,倒入DataSet,IsFirstRowAsColumnNames属性必须在执行 AsDataSet 前设定完成*/ _reader.IsFirstRowAsColumnNames = true; // 将Excel工作表,依序倒入Dataset,每个工作表生成一个datatable;空白的工作表,将被忽略 DataSet _dataset = _reader.AsDataSet(); foreach(DataTable _table in _dataset.Tables){ for(int i=0;i<_table.Columns.Count;i++) Console.Write(_table.Columns[i].ColumnName.PadRight(_table.Columns[i].ColumnName.Length+2,Convert.ToChar(" "))); Console.WriteLine(); foreach(DataRow _row in _table.Rows){ for(int i=0;i<_table.Columns.Count;i++) Console.Write(_row[i].ToString().Trim().PadRight(_table.Columns[i].ColumnName.Length+2,Convert.ToChar(" "))); Console.WriteLine(); } Console.WriteLine("\n-------------------------------------------"); // 这两行纯粹用来测试IsFirstRowAsColumnNames属性的差异 Console.WriteLine("Total Columns: "+_table.Columns.Count.ToString()); Console.WriteLine("Total Rows: " + _table.Rows.Count.ToString()); } _reader.Close(); } catch(Exception exp){ Console.WriteLine("An error occurs: " + exp.Message);} }else Console.WriteLine("Excel file: "+strPath+" not exists!"); } Console.Write("Press any key to continue . . . "); Console.ReadKey(true); } }}