User Tools

Site Tools

blog:2024-12-19-001



2024-12-19 C# 免裝Excel 就可以讀取 EXCEL 檔案 - ExcelDataReader

Local Backup

  • ExcelDataReader - 這是一套在GitHub 上的 OpenSource 套件,它提供了強大的 Reader 功能,重點是免費,與強大的可攜性,它號稱是 Lightweight and fast library written in C# for reading Microsoft Excel files。
  • 基本的讀取不是問題,處理檔案有它就很夠用了。
  • 首先你可以到專案下的 NuGet 去取得套件:
    • 總共有兩個套件要安裝:ExcelDataReader 和 ExcelDataReader.DataSet
  • 要注意的是3.0.0以前的版本只有 ExcelDataReader,沒有 ExcelDataReader.DataSet,這個 DataSet 套件是從 3.0.0後分開的,屬於 System.Data 的擴展套件。
  • 使用時一定要引用下面兩個 namespace
    • using System.Data;
      using ExcelDataReader;
  • 底下是基於Console 模式的程式碼,主要提供一個檔案給程式就可以讀取並顯示出到螢幕上
    • using System;
      using System.IO;
      using System.Data;
      using System.Text;
      using ExcelDataReader;
      
      namespace XlsReader
      {
          class Program
          {
              static public string AppPath;
              static int Main(string[] args)
              {
                  DataSet ds;
                  AppPath = AppDomain.CurrentDomain.BaseDirectory;
                  if (args.Length > 0)
                  {
                      string file = Path.Combine(AppPath, args[0]);
                      if (File.Exists(file))
                      {
                          var extension = Path.GetExtension(file).ToLower();
                          Console.WriteLine("讀取檔案:" + file);
                          using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                          {
                              //判斷格式套用讀取方法
                              IExcelDataReader reader = null;
                              if (extension == ".xls")
                              {
                                  Console.WriteLine(" => XLS格式");
                                  reader = ExcelReaderFactory.CreateBinaryReader(stream , new ExcelReaderConfiguration() {
                                      FallbackEncoding =Encoding.GetEncoding("big5")
                                  });
                              }
                              else if (extension == ".xlsx")
                              {
                                  Console.WriteLine(" => XLSX格式");
                                  reader = ExcelReaderFactory.CreateOpenXmlReader(stream);
                              }
                              else if (extension == ".csv")
                              {
                                  Console.WriteLine(" => CSV格式");
                                  reader = ExcelReaderFactory.CreateCsvReader(stream, new ExcelReaderConfiguration() {
                                      FallbackEncoding = Encoding.GetEncoding("big5")
                                  });
                              }
                              else if (extension == ".txt")
                              {
                                  Console.WriteLine(" => Text(Tab Separated)格式");
                                  reader = ExcelReaderFactory.CreateCsvReader(stream, new ExcelReaderConfiguration() {
                                      FallbackEncoding = Encoding.GetEncoding("big5"),
                                      AutodetectSeparators = new char[] { '\t' }
                                  });
                              }
      
                              //沒有對應產生任何格式
                              if (reader == null)
                              {
                                  Console.WriteLine("未知的處理檔案:" + extension);
                                  Console.ReadKey();
                                  return 20;
                              }
                              Console.WriteLine(" => 轉換中");
                              using (reader)
                              {
                               
                                  ds = reader.AsDataSet(new ExcelDataSetConfiguration()
                                  {
                                      UseColumnDataType = false,
                                      ConfigureDataTable = (tableReader) => new ExcelDataTableConfiguration()
                                      {
                                          //設定讀取資料時是否忽略標題
                                          UseHeaderRow = false
                                      }
                                  });
      
      
                                  //把 DataSet 顯示出來
                                  var table = ds.Tables[0];
                                  for(int row = 0; row < table.Rows.Count; row++)
                                  {
                                      for (var col = 0; col < table.Columns.Count; col++)
                                      {
                                          string data = table.Rows[row][col].ToString();
                                          Console.Write(data + ",");
                                      }
                                      Console.WriteLine("");
                                  }
                              }
                          }
                          Console.WriteLine("結束...按任意鍵離開...");
                          Console.ReadKey();
                          return 0;
                      }
                      else
                      {
                          Console.WriteLine("檔案 " + file + " 不存在!");
                          Console.ReadKey();
                          return 18;
                      }
                   
                  }
                  else
                  {
                      Console.WriteLine("沒有提供參數!");
                      Console.ReadKey();
                      return 13;
                  }
              }
          }
      }

TAGS

  • 1 person(s) visited this page until now.

Permalink blog/2024-12-19-001.txt · Last modified: 2024/12/19 15:07 by jethro

oeffentlich