2016年11月3日 星期四

[研究] [C#] [WinForm] 取得 Excel 的所有 工作表 名稱,及儲存格內容 (使用Access Database Engine 2010)

[研究] [C#] [WinForm] 取得 Excel 的所有 工作表 名稱,及儲存格內容 (使用Access Database Engine 2010)

2016-11-03

取得 Excel 的 活頁簿(Book) 中所有 工作表 (Sheet, WorkSheet) 的名稱,及儲存格 (Cell) 內容

Visual Studio 2015 with Update 3 + Windows Server 2012 R2 + IIS + Excel 2010

Form1.cs

using System;
using System.Data;
using System.Data.OleDb;
using System.Windows.Forms;

namespace ExcelSheet
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            OleDbConnection oleDbConn = null;
            DataTable dataTable = null;
            try
            {
                // Microsoft.ACE.OLEDB.12.0' 提供者並未登錄於本機電腦上。
                // 原因是Server上沒有安裝Access Database Engine 2010 的驅動程式。
                // http://www.microsoft.com/downloads/zh-tw/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=zh-tw

                // 連接字串語法
                // https://msdn.microsoft.com/zh-tw/library/ms254500(v=vs.110).aspx

                string Hdr = "Yes";    // Yes 表示第一列是欄位名稱
                string IMEX = "0";
                String connString =
                    @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source="
                    + @"D:\\Excel.xlsx" + ";Extended Properties=\"Excel 8.0; HDR=YES; IMEX=0\"";
                oleDbConn = new OleDbConnection(connString);
                oleDbConn.Open();
                dataTable = oleDbConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                if (dataTable == null)
                {
                    richTextBox1.AppendText("No table\r\n");
                }
                foreach (DataRow row in dataTable.Rows)
                {
                    richTextBox1.AppendText(row["TABLE_NAME"].ToString() + "\r\n");
                }
                // ----------
                string SheetName = "工作表1";
                using (OleDbConnection oldDbConn = new OleDbConnection(connString))
                {
                    oldDbConn.Open();
                    string qs = "select * from[" + SheetName + "$]";
                    try
                    {
                        using (OleDbDataAdapter dr = new OleDbDataAdapter(qs, oldDbConn))
                        {
                            DataTable dt = new DataTable();
                            dr.Fill(dt);
                            foreach (DataRow item in dt.Rows)
                            {
                                richTextBox1.AppendText(item[1].ToString() + "\r\n");
                            }
                        }
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
                // -----
                richTextBox1.AppendText("欄位\r\n");
                OleDbCommand oleDbCommand = new OleDbCommand("SELECT * FROM [" + SheetName + "$]", oleDbConn);
                OleDbDataAdapter objAdapter1 = new OleDbDataAdapter();
                objAdapter1.SelectCommand = oleDbCommand;
                DataSet dataSet1 = new DataSet();
                objAdapter1.Fill(dataSet1);
                foreach (DataTable table in dataSet1.Tables)
                {
                    foreach (DataColumn column in table.Columns)
                    {
                        richTextBox1.AppendText(column.ColumnName + "\r\n");
                    }
                }
            }
            catch (Exception ex)
            {
                richTextBox1.AppendText(ex.ToString() + "\r\n");
            }
            finally
            {
                if (oleDbConn != null)
                {
                    oleDbConn.Close();
                    oleDbConn.Dispose();
                }
                if (dataTable != null)
                {
                    dataTable.Dispose();
                }
            }
        }
    }
}




D:\Excel.xlsx

(下圖) 執行結果
因為第一列被當作欄位名稱,所以資料列第一列是 a2, b2, c2, d2
第一個 Cell 的索引編號是 0,所以第一列 item[1] 抓到 b2,第二列 item[1] 抓到 b3


(完)

相關

[研究] 'Microsoft.ACE.OLEDB.12.0' 提供者並未登錄於本機電腦上。
http://shaurong.blogspot.tw/2016/11/microsoftaceoledb120.html

[研究][C#][ASP.NET] GridView 匯出成 .xls (使用 Excel )
http://shaurong.blogspot.tw/2016/03/caspnet-gridview-xls-excel.html

Read and Write Excel Documents Using OLEDB
https://www.codeproject.com/Tips/705470/Read-and-Write-Excel-Documents-Using-OLEDB

使用 Access 2010 進行資料程式設計
https://msdn.microsoft.com/zh-tw/library/office/ff965871(v=office.14).aspx

沒有留言:

張貼留言