web-dev-qa-db-ja.com

C#を使用してExcelファイルからデータを読み取る方法

アプリケーションは、Excelファイルからデータを読み取る必要があります。開発には.Netとc#を使用しています。システムにMS Officeをインストールできません。そのため、私のアプリケーションはExcelファイルの読み取りに失敗し、Excelのdllの読み込み中にエラーをスローします。

Ms officeがインストールされていないシステムのアプリケーションでExcelファイルにアクセスするにはどうすればよいですか?

57
TutuGeorge

OleDBを使用し、データベース内のデータテーブルのようなExcelシートを使用するオプションがあります...

ほんの一例.....

string con =
  @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp\test.xls;" + 
  @"Extended Properties='Excel 8.0;HDR=Yes;'";    
using(OleDbConnection connection = new OleDbConnection(con))
{
    connection.Open();
    OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection); 
    using(OleDbDataReader dr = command.ExecuteReader())
    {
         while(dr.Read())
         {
             var row1Col0 = dr[0];
             Console.WriteLine(row1Col0);
         }
    }
}

この例では、Microsoft.Jet.OleDb.4.0プロバイダーを使用してExcelファイルを開いて読み取ります。ただし、ファイルのタイプが(xlsx)の場合(Excel 2007以降)、 Microsoft Access Database Engine コンポーネントをダウンロードして、ターゲットマシンにインストールする必要があります。

プロバイダーはMicrosoft.ACE.OLEDB.12.0;と呼ばれます。このコンポーネントには、32ビット用と64ビット用の2つのバージョンがあることに注意してください。アプリケーションのビット数とインストールされているOfficeのバージョン(存在する場合)に適したものを選択します。そのドライバーをアプリケーションで正しく動作させるには、多くの癖があります。 例についてはこの質問を参照

もちろん、ターゲットマシンにOfficeをインストールする必要はありません。

このアプローチにはいくつかのメリットがありますが、質問のコメントによって通知されるリンクに特に注意を払う必要があると思います C#からExcelファイルを読み取る 。データ型の正しい解釈に関して、および単一のExcelセルに存在するデータの長さが255文字を超える場合、いくつかの問題があります。

88
Steve

Excel 97-2003ファイル(xls)を読み取るためのCSharpJExcel: http://sourceforge.net/projects/jexcelapi/

およびExcel 2007/2010ファイルを読み込むためのExcelPackage(Office Open XML形式、xlsx): http://excelpackage.codeplex.com/

およびExcelDataReader、これは両方の形式を処理する機能を持っているようです: https://github.com/ExcelDataReader/ExcelDataReader

がんばろう!

19
Obama

これをテストするマシンはありませんが、動作するはずです。最初に 2007 Office System Driver:Data Connectivity Components または Microsoft Access Database Engine 2010 Redistributable をインストールする必要があります。次に、次のコードを試してください。Excelファイルのシート名と一致するように、以下のSelectステートメントでシートの名前を変更する必要があることに注意してください。

using System.Data;
using System.Data.OleDb;

namespace Data_Migration_Process_Creator
{
    class Class1
    {
        private DataTable GetDataTable(string sql, string connectionString)
        {
            DataTable dt = null;

            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                conn.Open();
                using (OleDbCommand cmd = new OleDbCommand(sql, conn))
                {
                    using (OleDbDataReader rdr = cmd.ExecuteReader())
                    {
                        dt.Load(rdr);
                        return dt;
                    }
                }
            }
        }

        private void GetExcel()
        {
            string fullPathToExcel = "<Path to Excel file>"; //ie C:\Temp\YourExcel.xls
            string connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=yes'", fullPathToExcel);
            DataTable dt = GetDataTable("SELECT * from [SheetName$]", connString);

            foreach (DataRow dr in dt.Rows)
            {
                //Do what you need to do with your data here
            }
        }
    }
}

注:これをテストする環境はありません(Officeがインストールされている環境)。環境で動作するかどうかはわかりませんが、動作しない理由はわかりません。

8
Mark Kram

ExcelファイルをCSVに保存し、 FileHelpers などのCSVリーダーライブラリを使用してC#で結果ファイルを読み取ります。

5
Robert Harvey

Excelファイルを.csvファイル(カンマ区切り値ファイル)に変換すると、簡単に読み取れるようになります。

4
petko_stankoski