創作內容

13 GP

C# Excel 檔案讀取

作者:貓貓風 ฅ●ω●ฅ│2021-05-20 15:49:17│巴幣:26│人氣:5414
.















有鑑於上次寫EXCEL相關文章是好幾年前,而且那時還有加入其他功能導致程式碼攏長且複雜

這次直接簡化,只單純做Excel的資料讀取呈現在 windows form的畫面上

詳細要include的兩個windows函式庫可以參考這篇 -> C# Excel Read Write

操作方式 是先選擇要讀取的Excel檔 (我把要讀取的檔案都放在INPUT FILE中)

然後再選要讀取EXCEL的工作表,通常Excel預設都是三個工作表 (1 2 3)

以下範例我會建立各種不同數量的工作表,有些會把工作表改名稱跟內容作讀取測試


先上程式碼,關鍵的地方都有做註解,有問題再提出
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.IO;
  10. using Excel = Microsoft.Office.Interop.Excel;
  11. using Microsoft.Office.Interop.Excel;
  12. using System.Runtime.InteropServices;
  13. using System.Threading;
  14. using System.Diagnostics;
  15. namespace Excel_reader
  16. {
  17.     public partial class Form1 : Form
  18.     {
  19.         public Form1()
  20.         {
  21.             InitializeComponent();
  22.         }
  23.         private void Form1_Load(object sender, EventArgs e)
  24.         {
  25.             //指定Excel檔案路徑
  26.             string str = System.Windows.Forms.Application.StartupPath + "\\input_file";
  27.             //-----------------------下拉選單製作
  28.             //檔案下拉選單
  29.             DirectoryInfo di = new DirectoryInfo(str);
  30.             foreach (var fi in di.GetFiles("*.xlsx"))
  31.             {
  32.                 this.comboBox_select_file.Items.Add
  33.                 (new combobox(fi.Name, str + "\\" + fi.Name));
  34.             }
  35.             this.comboBox_select_file.SelectedIndex = 0;
  36.         }
  37.         Excel.Application _xlApp;
  38.         Excel.Workbook _xlWorkBook;
  39.         Excel.Worksheet _xlWorkSheet;
  40.         Excel.Range _range;
  41.         String _file_name = "";
  42.         private void btn_select_file_Click(object sender, EventArgs e)
  43.         {
  44.             //取得下拉選單數值讀取指定檔案
  45.             combobox cb2 = (combobox)this.comboBox_select_file.SelectedItem;
  46.             _file_name = cb2.value;
  47.             //開啟Excel
  48.             _xlApp = new Excel.Application();
  49.             _xlWorkBook = _xlApp.Workbooks.Open(_file_name, 0, true, 5, "", "", true,
  50.               Microsoft.Office.Interop.Excel.XlPlatform.xlWindows
  51.              , "\t", false, false, 0, true, 1, 0);
  52.             //-----------------------worksheet下拉選單
  53.             Excel.Worksheet xlWorkSheet2;
  54.             this.comboBox_select_sheet.Items.Clear();
  55.             lb_sys_info.Text = "Excel工作表載入中";
  56.             for (int i = 1; i <= _xlWorkBook.Sheets.Count; i++) //計算總共有幾個工作表
  57.             {
  58.                  //取得該工作表
  59.                 xlWorkSheet2 = (Excel.Worksheet)_xlWorkBook.Worksheets[i];
  60.                 //將該工作表名稱加入下拉選單
  61.                 this.comboBox_select_sheet.Items.Add(new
  62.                 combobox(((Excel.Worksheet)_xlWorkBook.Worksheets[i]).Name
  63.                 , i.ToString()));
  64.             }
  65.             this.comboBox_select_sheet.SelectedIndex = 0;
  66.             lb_sys_info.Text = "Excel工作表載入完成";
  67.             //使用完EXCEL資源釋放
  68.             _xlApp.Quit();
  69.             Form1.KillExcelApp(_xlApp);
  70.         }
  71.         private System.Data.DataTable _tb = new System.Data.DataTable("table");
  72.         DataRow _NewRow;
  73.         Thread _read_execel_data;
  74.         private void btn_select_sheet_Click(object sender, EventArgs e)
  75.         {
  76.             lb_load_data_count.Visible = true;
  77.             _read_execel_data = new Thread(read_execel_data);
  78.             _read_execel_data.Start();
  79.         }
  80.         private void read_execel_data()
  81.         {
  82.             int select_sheet = 0;  //select_sheet第幾個工作表
  83.             string str = System.Windows.Forms.Application.StartupPath;
  84.             //開啟Excel
  85.             _xlApp = new Excel.Application();
  86.             this.Invoke((MethodInvoker)delegate
  87.             {
  88.                 dataGridView1.DataSource = null;
  89.                 _tb.Clear(); //清空表格
  90.                 _tb.Rows.Clear();//清空資料
  91.                 _tb.Columns.Clear();
  92.             });
  93.             try
  94.             {
  95.                 _xlWorkBook = _xlApp.Workbooks.Open(_file_name, 0, true, 5, "", "", true,
  96.                  Microsoft.Office.Interop.Excel.XlPlatform.xlWindows
  97.                   , "\t", false, false, 0, true, 1, 0);
  98.             }
  99.             catch
  100.             {
  101.                 MessageBox.Show("未選擇檔案");
  102.                 return;
  103.             }
  104.             //取得下拉選單數值讀取指定工作表
  105.             this.Invoke((MethodInvoker)delegate
  106.             {
  107.                 combobox cb = (combobox)this.comboBox_select_sheet.SelectedItem;
  108.                 select_sheet = Int32.Parse(cb.value);
  109.                 _xlWorkSheet = (Excel.Worksheet)_xlWorkBook.Worksheets[select_sheet];
  110.                 _range = _xlWorkSheet.UsedRange;//讀取Excel列與行資訊
  111.             });
  112.             int rw = _range.Rows.Count;     //直 (總行數)
  113.             int cl = _range.Columns.Count;  //橫 (總列數)
  114.             int sum = rw;
  115.             DataColumn[] colItem = new DataColumn[cl + 1];
  116.             String[] title = new String[cl + 1];
  117.             Excel.Worksheet excelSheet =
  118.            (Excel.Worksheet)_xlWorkBook.Worksheets[select_sheet];
  119.             //-----------------------------表格欄位製作
  120.             for (int i = 1; i <= cl; i++)
  121.             {
  122.                 //將Table Titile塞入Excel第一列作為標題 [1,n]
  123.                 Excel.Range rng = (Excel.Range)excelSheet.Cells[1, i];
  124.                 try
  125.                 {
  126.                     colItem[i] = new DataColumn(rng.Value, Type.GetType("System.String"));
  127.                     title[i] = rng.Value;
  128.                 }
  129.                 catch
  130.                 {
  131.                     colItem[i] = new DataColumn(" ", Type.GetType("System.String"));
  132.                 }
  133.                 _tb.Columns.Add(colItem[i]);
  134.             }
  135.             sum = rw - 1;
  136.             lb_sys_info.Invoke((MethodInvoker)delegate
  137.             {
  138.                 lb_sys_info.Text = "Excel工作表內容載入中";
  139.             });
  140.             for (int i = 2; i <= rw; i++)
  141.             {
  142.                 lb_load_data_count.Invoke((MethodInvoker)delegate
  143.                 {
  144.                     lb_load_data_count.Text =
  145.                     "尚有 " + (sum - i - 1).ToString() + " 筆資料未加入";
  146.                 });
  147.                 _NewRow = _tb.NewRow(); //開新的一列
  148.                 for (int j = 1; j <= cl; j++)
  149.                 {
  150.                     try
  151.                     {
  152.                         Excel.Range rng = (Excel.Range)excelSheet.Cells[i, j];
  153.                         //讀取 Excel每格內容
  154.                         _NewRow[title[j]] = rng.Value.ToString(); //將取得的值存入陣列
  155.                     }
  156.                     catch
  157.                     {
  158.                         _NewRow[title[j]] = "";
  159.                     }
  160.                 }
  161.                 this.Invoke((MethodInvoker)delegate
  162.                 {
  163.                     _tb.Rows.Add(_NewRow);
  164.                 });
  165.             }
  166.             this.Invoke((MethodInvoker)delegate
  167.             {
  168.                 _tb.AcceptChanges();
  169.                 dataGridView1.AutoSizeColumnsMode
  170.                 =  DataGridViewAutoSizeColumnsMode.DisplayedCells;
  171.                 dataGridView1.DataSource = _tb;
  172.                 lb_load_data_count.Visible = false;
  173.             });
  174.             //使用完EXCEL資源釋放
  175.             _xlApp.Quit();
  176.             Form1.KillExcelApp(_xlApp);
  177.             lb_sys_info.Invoke((MethodInvoker)delegate
  178.             {
  179.                 lb_sys_info.Text = "Excel工作表內容載入完成";
  180.             });
  181.             _read_execel_data.Abort();
  182.         }
  183.         // release excel resource
  184.         [DllImport("User32.dll")]
  185.         public static extern int GetWindowThreadProcessId
  186.         (IntPtr hWnd, out int  ProcessId);
  187.         public static void KillExcelApp(Excel.Application app)
  188.         {
  189.             if (app != null)
  190.             {
  191.                 try
  192.                 {
  193.                     app.Quit();
  194.                     IntPtr intptr = new IntPtr(app.Hwnd);
  195.                     var ps = Process.GetProcessesByName("EXCEL").ToList();
  196.                     int id;
  197.                     GetWindowThreadProcessId(intptr, out id);
  198.                     var p = Process.GetProcessById(id);
  199.                     //if (p != null)
  200.                     p.Kill();
  201.                 }
  202.                 catch (Exception)
  203.                 {
  204.                 }
  205.             }
  206.         }
  207.     }
  208. }


實際測試結果

讀取 EXCEL放置位置



開啟程式選擇要讀取的EXCEL檔案



選擇要讀取的工作表



讀取完成



切換讀工作表2



工作表2內容



原始Excel檔案內容   跟讀取的內容比對完全一致   

1-EXCEL-TABLE1


1-EXCEL-TABLE2




改讀取 Test



讀取Test工作表1


Test工作表一內容



讀取Test工作表2為空



將讀取資料比對實際Excel內容,正確無誤


2-excel-工作表2




引用網址:https://home.gamer.com.tw/TrackBack.php?sn=5153774
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:C#|Excel

留言共 2 篇留言

bin
你好 我很喜歡這篇 但試不出來 能把程式mail給我嗎 avastwow127@gmail.com 感激不盡

09-29 11:16

小九
您好,我想詢問第53行 _file_name = cb2.value; 這裡我沒辦法選value是我漏了什麼嗎??
麻煩您幫忙解惑了,謝謝您

10-29 22:04

貓貓風 ฅ●ω●ฅ
要建立一個 combobox的class
public combobox(string text, string value)
{
this.text = text;
this.value = value;
}

public override string ToString()
{
return text;
} 10-30 00:14
我要留言提醒:您尚未登入,請先登入再留言

13喜歡★s1234567 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:Dyson Purifi... 後一篇:三星 2021 55型 ...

追蹤私訊切換新版閱覽

作品資料夾

leon770530巴友
我的小屋首頁共有4篇健身相關證照心得文,對健身有興趣的朋友可以來看看喔!看更多我要大聲說昨天10:10


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】