从Excel表格中将数据读入到DataTable数据类型中,我是通过使用OLEDB来实现的
(OLEDB是Object Linking and Embedding Database的缩写)
现有一个扩展名为xlsx的工作簿文件“节气表.xlsx”,在工作表Sheet1中有24个节气的信息
本文中的示例程序(代码将在后面给出)读取这个数据表后的效果如下图:
可以看出:OleDb读入一个Excel工作表(Sheet)的数据后,工作表的第一行会变成标题,第二行起,逐行变为DataTable的一个数据行(Row)
示例程序控件说明:
程序代码:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Data.OleDb;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace ExcelReader{ public partial class FormMain : Form { public FormMain() { InitializeComponent(); } private void FormMain_Load(object sender, EventArgs e) { txtXlsxPath.Text = @"节气表.xlsx"; txtSheetName.Text = @"Sheet1"; } ////// 按钮:从EXCEL工作簿中读取信息 /// /// /// private void btnRead_Click(object sender, EventArgs e) { dgvTable.DataSource = ReadFromExcel(txtXlsxPath.Text, txtSheetName.Text); } ////// 从EXCEL工作簿中读取信息到DataTable(需要System.Data.OleDb) /// /// EXCEL工作簿文件地址 /// 工作表名称 private DataTable ReadFromExcel(string sXlsxPath, string sSheetName) { string sExt = System.IO.Path.GetExtension(sXlsxPath); string sConn = ""; if (sExt == ".xlsx") //Excel2007 { sConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + sXlsxPath + ";" + "Extended Properties='Excel 12.0;HDR=YES'"; } else if (sExt == ".xls") //Excel2003 { sConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + sXlsxPath + ";" + "Extended Properties=Excel 8.0"; } else { throw new Exception("未知的文件类型"); } OleDbConnection oledbConn = new OleDbConnection(sConn); oledbConn.Open(); OleDbDataAdapter command = new OleDbDataAdapter( "SELECT * FROM [" + sSheetName + "$]", oledbConn); DataSet ds = new DataSet(); command.Fill(ds, sSheetName); oledbConn.Close(); return ds.Tables[sSheetName]; } }}
编写这个程序的时候遇到过两个异常,解决方法如下:
1)异常“外部表不是预期的格式”:
写连接表达式时(上面代码中的sConn),要对扩展名为.xlsx和.xls分类讨论
2)异常:“找不到可安装的ISAM”:
读取.xlsx格式的Excel表格时,连接表达式的Extended Properties部分,等于号后面的字符是用单引号括起来的,如果漏写单引号引起的,补上就好了
END