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

相關文章
相關標籤/搜索