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

从Excel表格中将数据读入到DataTable数据类型中,我是经过使用OLEDB来实现的ide

(OLEDB是Object Linking and Embedding Database的缩写)spa

现有一个扩展名为xlsx的工做簿文件“节气表.xlsx”,在工做表Sheet1中有24个节气的信息code

本文中的示例程序(代码将在后面给出)读取这个数据表后的效果以下图:orm

能够看出:OleDb读入一个Excel工做表(Sheet)的数据后,工做表的第一行会变成标题,第二行起,逐行变为DataTable的一个数据行(Row)string

示例程序控件说明:it

程序代码:io

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];
        }
    }
}

编写这个程序的时候遇到过两个异常,解决方法以下:class

1)异常“外部表不是预期的格式”:扩展

写链接表达式时(上面代码中的sConn),要对扩展名为.xlsx和.xls分类讨论object

2)异常:“找不到可安装的ISAM”:

读取.xlsx格式的Excel表格时,链接表达式的Extended Properties部分,等于号后面的字符是用单引号括起来的,若是漏写单引号引发的,补上就行了

END

相关文章
相关标签/搜索