从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";
}
/// <summary>
/// 按钮:从EXCEL工作簿中读取信息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnRead_Click(object sender, EventArgs e)
{
dgvTable.DataSource = ReadFromExcel(txtXlsxPath.Text, txtSheetName.Text);
}
/// <summary>
/// 从EXCEL工作簿中读取信息到DataTable(需要System.Data.OleDb)
/// </summary>
/// <param name="sXlsxPath">EXCEL工作簿文件地址</param>
/// <param name="sSheetName">工作表名称</param>
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