這次要將讀取到的Office資料透過DataGridView去顯示,以前有寫過類似的東西,知道必須透過OLE DB去取得資料
什麼是OLE(Object Linking and Embedding)?OLE就是可以在檔案內嵌入不同的檔案
舉例:Word內可嵌入Excel、圖片、PDF等等的檔案
OLE DB是為了擴充不支援SQL語法的程式,而透過COM元件去實做出來的
程式內容會因為openToolStripMenuItem點擊事件『openToolStripMenuItem_Click』而觸發
private void openToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "Excel 2003|*.xls|Excel 2007|*.xlsx"; if (dialog.ShowDialog() == DialogResult.OK) { //File Path string path = dialog.FileName; string oleStr = GetOleStr(ref path); try { using (OleDbConnection ole = new OleDbConnection(oleStr)) { //OLE SQL const string sql = @"SELECT * FROM [tableName$]"; using (OleDbCommand cmd = new OleDbCommand(sql, ole)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd)) { DataTable table = new DataTable(); adapter.Fill(table); dataGridView1.DataSource = table; } } } } catch (OleDbException ex) { MessageBox.Show(ex.Message); } } }
透過OpenFileDialog去取得到檔案位址
OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "Excel 2003|*.xls|Excel 2007|*.xlsx"; if (dialog.ShowDialog() == DialogResult.OK) { ..... }
並將檔案位址透過『GetOleStr』方法去選擇使用OLE DB4.0或是OLE DB12.0語法,OLE DB4.0是給2003使用,OLE DB12.0是給2007使用
//File Path string path = dialog.FileName; string oleStr = GetOleStr(ref path);
private string GetOleStr(ref string path) { //isXls = true then file is Excel 2003 bool isXls = path.EndsWith(".xls"); string oleStr = string.Empty; if (isXls) { //2003 OLE oleStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", path); } else { //2007 OLE oleStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'", path); } return oleStr; }
『GetOleStr』方法內透過path.EndsWith方法去知道最後檔名為『Excel 2003的xls』或是『Excel 2007的xlsx』,並且回傳一個OLE DB語法
HDR全文為『HeaDer Row』
- 如果值為Yes,則代表第一行是標題
- 如果值為No,則代表第一行是資料
IMEX全文為『IMport EXport mode』
- 值為0,則只能匯出使用
- 值為1,則只能匯入使用
- 值為2,可以匯出也可以匯入
接著透過OleDbConnection去做連接
using (OleDbConnection ole = new OleDbConnection(oleStr)) { //OLE SQL const string sql = @"SELECT * FROM [tableName$]"; using (OleDbCommand cmd = new OleDbCommand(sql, ole)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd)) { DataTable table = new DataTable(); adapter.Fill(table); dataGridView1.DataSource = table; } } }
使用SQL語法選擇資料表,注意語法必須為"SELECT * FROM [資料表欄位$]",否則會無法取得資料
const string sql = @"SELECT * FROM [tableName$]";
用OleDbDataAdapter將資料注入到DataTable或DataSet,兩者有差異,有機會之後會寫一篇比較文
DataTable table = new DataTable(); adapter.Fill(table); dataGridView1.DataSource = table;
資料注入後就可以看得到結果啦
Designer.cs
namespace OpenExcelForm { partial class OpenExcelForm { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.dataGridView1 = new System.Windows.Forms.DataGridView(); this.menuStrip1 = new System.Windows.Forms.MenuStrip(); this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.openToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit(); this.menuStrip1.SuspendLayout(); this.SuspendLayout(); // // dataGridView1 // this.dataGridView1.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; this.dataGridView1.Location = new System.Drawing.Point(12, 27); this.dataGridView1.Name = "dataGridView1"; this.dataGridView1.RowTemplate.Height = 24; this.dataGridView1.Size = new System.Drawing.Size(682, 310); this.dataGridView1.TabIndex = 1; // // menuStrip1 // this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.fileToolStripMenuItem}); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.Name = "menuStrip1"; this.menuStrip1.Size = new System.Drawing.Size(706, 24); this.menuStrip1.TabIndex = 2; this.menuStrip1.Text = "menuStrip1"; // // fileToolStripMenuItem // this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.openToolStripMenuItem, this.exitToolStripMenuItem}); this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; this.fileToolStripMenuItem.Size = new System.Drawing.Size(39, 20); this.fileToolStripMenuItem.Text = "File"; // // openToolStripMenuItem // this.openToolStripMenuItem.Name = "openToolStripMenuItem"; this.openToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.openToolStripMenuItem.Text = "Open"; this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); // // exitToolStripMenuItem // this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; this.exitToolStripMenuItem.Size = new System.Drawing.Size(152, 22); this.exitToolStripMenuItem.Text = "Exit"; this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click); // // OpenExcelForm // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(706, 348); this.Controls.Add(this.dataGridView1); this.Controls.Add(this.menuStrip1); this.MainMenuStrip = this.menuStrip1; this.Name = "OpenExcelForm"; this.Text = "Form1"; ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).EndInit(); this.menuStrip1.ResumeLayout(false); this.menuStrip1.PerformLayout(); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.DataGridView dataGridView1; private System.Windows.Forms.MenuStrip menuStrip1; private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem openToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; } }
OpenExcelForm.cs
using System; using System.Data; using System.Data.OleDb; using System.Windows.Forms; namespace OpenExcelForm { public partial class OpenExcelForm : Form { public OpenExcelForm() { InitializeComponent(); } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { Application.Exit(); } private void openToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "Excel 2003|*.xls|Excel 2007|*.xlsx"; if (dialog.ShowDialog() == DialogResult.OK) { //File Path string path = dialog.FileName; string oleStr = GetOleStr(ref path); try { using (OleDbConnection ole = new OleDbConnection(oleStr)) { //OLE SQL const string sql = @"SELECT * FROM [tableName$]"; using (OleDbCommand cmd = new OleDbCommand(sql, ole)) { using (OleDbDataAdapter adapter = new OleDbDataAdapter(cmd)) { DataTable table = new DataTable(); adapter.Fill(table); dataGridView1.DataSource = table; } } } } catch (OleDbException ex) { MessageBox.Show(ex.Message); } } } private string GetOleStr(ref string path) { //isXls = true then file is Excel 2003 bool isXls = path.EndsWith(".xls"); string oleStr = string.Empty; if (isXls) { //2003 OLE oleStr = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'", path); } else { //2007 OLE oleStr = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=Yes;IMEX=1;'", path); } return oleStr; } } }
參考資料:
http://seanlu1688.pixnet.net/blog/post/47385718
http://social.msdn.microsoft.com/Forums/zh-TW/a9416a68-92f8-4f62-a3e0-59a18f025dd6/-microsoft-jet-ole-db-providerexcel?forum=232
http://www.blueshop.com.tw/board/FUM200410061527123KL/BRD20130508180117XNG.html
http://en.wikipedia.org/wiki/Object_Linking_and_Embedding
http://blog.csdn.net/ecnuzhangsq/article/details/5907689