首页 > 代码库 > C#:使用OleDb从Excel表格中读取信息到DataTable

C#:使用OleDb从Excel表格中读取信息到DataTable

从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


C#:使用OleDb从Excel表格中读取信息到DataTable