232

C# プログラムから直接 Excel ファイル (.xls) を読み取るための無料またはオープン ソースのライブラリはありますか?

ワークシートを選択してデータを文字列として読み取るだけです。これまで、Excel の Unicode テキストへのエクスポート機能を使用して、結果の (タブ区切りの) ファイルを解析していましたが、手動のステップをなくしたいと思います。

4

32 に答える 32

152
var fileName = string.Format("{0}\\fileNameHere", Directory.GetCurrentDirectory());
var connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0; data source={0}; Extended Properties=Excel 8.0;", fileName);

var adapter = new OleDbDataAdapter("SELECT * FROM [workSheetNameHere$]", connectionString);
var ds = new DataSet();

adapter.Fill(ds, "anyNameHere");

DataTable data = ds.Tables["anyNameHere"];

これは私が普段使っているものです。通常、テーブルの編集時に AsEnumerable() を貼り付けているため、少し異なります。

var data = ds.Tables["anyNameHere"].AsEnumerable();

これにより、LINQ を使用してフィールドから構造体を検索および構築できるようになります。

var query = data.Where(x => x.Field<string>("phoneNumber") != string.Empty).Select(x =>
                new MyContact
                    {
                        firstName= x.Field<string>("First Name"),
                        lastName = x.Field<string>("Last Name"),
                        phoneNumber =x.Field<string>("Phone Number"),
                    });
于 2008-08-19T12:18:20.197 に答える
83

Excelファイルに含まれている単純なデータの場合は、ADO.NETを介してデータを読み取ることができます。ここにリストされている接続文字列を参照してください。

http://www.connectionstrings.com/?carrier=excel2007 または http://www.connectionstrings.com/?carrier=excel

-ライアン

更新:その後、次のような方法でワークシートを読むことができますselect * from [Sheet1$]

于 2008-08-19T07:28:37.630 に答える
27

ADO.NET のアプローチは迅速かつ簡単ですが、特に DataTypes の処理方法に関して注意すべきいくつかの癖があります。

この優れた記事は、いくつかの一般的な落とし穴を回避するのに役立ちます: http://blog.lab49.com/archives/196

于 2008-08-20T13:19:17.173 に答える
22

これは、Excel 2003 で使用したものです。

Dictionary<string, string> props = new Dictionary<string, string>();
props["Provider"] = "Microsoft.Jet.OLEDB.4.0";
props["Data Source"] = repFile;
props["Extended Properties"] = "Excel 8.0";

StringBuilder sb = new StringBuilder();
foreach (KeyValuePair<string, string> prop in props)
{
    sb.Append(prop.Key);
    sb.Append('=');
    sb.Append(prop.Value);
    sb.Append(';');
}
string properties = sb.ToString();

using (OleDbConnection conn = new OleDbConnection(properties))
{
    conn.Open();
    DataSet ds = new DataSet();
    string columns = String.Join(",", columnNames.ToArray());
    using (OleDbDataAdapter da = new OleDbDataAdapter(
        "SELECT " + columns + " FROM [" + worksheet + "$]", conn))
    {
        DataTable dt = new DataTable(tableName);
        da.Fill(dt);
        ds.Tables.Add(dt);
    }
}
于 2008-09-04T11:39:19.803 に答える
21

How about Excel Data Reader?

http://exceldatareader.codeplex.com/

I've used in it anger, in a production environment, to pull large amounts of data from a variety of Excel files into SQL Server Compact. It works very well and it's rather robust.

于 2010-09-08T08:45:52.537 に答える
16

これは、数年前に.NET 1.1を使用してC#で記述したコードです。これがまさにあなたが必要としているものであるかどうかはわかりません(そして私の最高のコードではないかもしれません:))。

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

namespace ExportExcelToAccess
{
    /// <summary>
    /// Summary description for ExcelHelper.
    /// </summary>
    public sealed class ExcelHelper
    {
        private const string CONNECTION_STRING = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<FILENAME>;Extended Properties=\"Excel 8.0;HDR=Yes;\";";

        public static DataTable GetDataTableFromExcelFile(string fullFileName, ref string sheetName)
        {
            OleDbConnection objConnection = new OleDbConnection();
            objConnection = new OleDbConnection(CONNECTION_STRING.Replace("<FILENAME>", fullFileName));
            DataSet dsImport = new DataSet();

            try
            {
                objConnection.Open();

                DataTable dtSchema = objConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);

                if( (null == dtSchema) || ( dtSchema.Rows.Count <= 0 ) )
                {
                    //raise exception if needed
                }

                if( (null != sheetName) && (0 != sheetName.Length))
                {
                    if( !CheckIfSheetNameExists(sheetName, dtSchema) )
                    {
                        //raise exception if needed
                    }
                }
                else
                {
                    //Reading the first sheet name from the Excel file.
                    sheetName = dtSchema.Rows[0]["TABLE_NAME"].ToString();
                }

                new OleDbDataAdapter("SELECT * FROM [" + sheetName + "]", objConnection ).Fill(dsImport);
            }
            catch (Exception)
            {
                //raise exception if needed
            }
            finally
            {
                // Clean up.
                if(objConnection != null)
                {
                    objConnection.Close();
                    objConnection.Dispose();
                }
            }


            return dsImport.Tables[0];
            #region Commented code for importing data from CSV file.
            //              string strConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source=" + System.IO.Path.GetDirectoryName(fullFileName) +";" +"Extended Properties=\"Text;HDR=YES;FMT=Delimited\"";
            //
            //              System.Data.OleDb.OleDbConnection conText = new System.Data.OleDb.OleDbConnection(strConnectionString);
            //              new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " + System.IO.Path.GetFileName(fullFileName).Replace(".", "#"), conText).Fill(dsImport);
            //              return dsImport.Tables[0];

            #endregion
        }

        /// <summary>
        /// This method checks if the user entered sheetName exists in the Schema Table
        /// </summary>
        /// <param name="sheetName">Sheet name to be verified</param>
        /// <param name="dtSchema">schema table </param>
        private static bool CheckIfSheetNameExists(string sheetName, DataTable dtSchema)
        {
            foreach(DataRow dataRow in dtSchema.Rows)
            {
                if( sheetName == dataRow["TABLE_NAME"].ToString() )
                {
                    return true;
                }   
            }
            return false;
        }
    }
}
于 2008-08-19T10:50:55.710 に答える
15

Koograは、Excel ファイルを読み書きする C# で記述されたオープンソース コンポーネントです。

于 2008-11-04T11:22:57.473 に答える
12

特に古いファイル形式を意味する.xlsを要求しましたが、OpenXML形式(xlsxなど)の場合は、OpenXML SDK(http://msdn.microsoft.com/en-us/library/bb448854.aspx)を強くお勧めします。

于 2008-09-04T06:00:46.293 に答える
8

少し前に C# で Excel ファイルから多くの読み取りを行いましたが、次の 2 つのアプローチを使用しました。

  • Excel のオブジェクトに直接アクセスし、メソッドとプロパティを介して操作する COM API
  • Excel をデータベースのように使用できるようにする ODBC ドライバー。

後者のアプローチははるかに高速でした。20 列と 200 行の大きなテーブルを読み取るには、COM では 30 秒、ODBC では 0.5 秒かかりました。したがって、必要なのはデータだけである場合は、データベース アプローチをお勧めします。

乾杯、

カール

于 2008-08-20T13:24:35.477 に答える
6

.NET で xls/xlsx ファイルを読み込む簡単な方法を示したいと思います。以下が参考になれば幸いです。

プライベート DataTable ReadExcelToTable(文字列パス)    
 {

     //接続文字列

     string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";  
     //同じ名前
     //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + //";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";

     using (OleDbConnection conn = 新しい OleDbConnection(connstring))
     {
        conn.Open();
        //すべてのシート名を取得
        DataTable sheetName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"});  

        //最初のシート名を取得
        string firstSheetName = sheetName.Rows[0][2].ToString();

        //クエリ文字列
        string sql = string.Format("SELECT * FROM [{0}]",firstSheetName);
        OleDbDataAdapter ada = new OleDbDataAdapter(sql,connstring);
        DataSet セット = 新しい DataSet();
        ada.Fill(セット);
        set.Tables[0] を返します。   
   }
 }

コードは記事からのものです: http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/。そこから詳細を取得できます。

于 2012-03-06T08:49:41.217 に答える
6

ExcelMapper は、Excel ワークシートを厳密に型指定されたオブジェクトとして読み取るために使用できるオープン ソース ツール ( http://code.google.com/p/excelmapper/ ) です。xls 形式と xlsx 形式の両方をサポートしています。

于 2009-05-11T15:26:26.313 に答える
4

無料ではありませんが、最新のOfficeには、非常に優れた自動化.NetAPIがあります。(APIは長い間存在していましたが、厄介なCOMでした)Officeアプリが非表示のバックグラウンドプロセスのままである間、コードで必要なすべてを実行できます。

于 2008-08-19T07:31:57.670 に答える
3

最近、部分的にLINQをより良くするために....私はExcelの自動化APIを使用してファイルをXMLスプレッドシートとして保存し、LINQ to XMLを使用してそのファイルを処理しています。

于 2008-09-04T11:10:40.230 に答える
3

SmartXLSは、Excel チャート、数式エンジンのほとんどの機能をサポートし、excel2007 openxml 形式を読み書きできるもう 1 つの Excel スプレッドシート コンポーネントです。

于 2009-09-30T03:18:16.903 に答える
3

SpreadsheetGear for .NETは、Excel 互換の .NET 用スプレッドシート コンポーネントです。製品ページの右側で、パフォーマンスに関するお客様の声をご覧いただけます。完全に機能する無料の評価版を使用して、自分で試すことができます。

于 2009-01-19T15:49:51.650 に答える
3

基地外でしたらすみませんが、これがOffice PIAの目的ではないでしょうか?

于 2008-08-19T07:28:03.683 に答える
3

.NET コンポーネントの Excel Reader .NET が要件を満たす場合があります。XLSX および XLS ファイルを読み取るには十分です。だからそれを試してみてください:

http://www.devtriogroup.com/ExcelReader

于 2011-04-12T07:30:55.960 に答える
2

無料で使いやすい.NETライブラリであるFileHelpersライブラリをお勧めします。これは、EXCEL、ファイル、文字列、またはストリームなどの固定長または区切りレコードからデータをインポート/エクスポートするためのものです。

Excelデータリンクドキュメントセクション http://filehelpers.sourceforge.net/example_exceldatalink.html

于 2008-09-04T10:24:13.227 に答える
2

Excel をよりクリーンに扱うこのオープン ソース ソリューションを試してみることができます。

http://excelwrapperdotnet.codeplex.com/

于 2010-03-09T00:16:47.053 に答える
2

SpreadsheetGearは素晴らしいです。はい、それは費用がかかりますが、これらの他のソリューションをいじるのと比較すると、コストに見合うだけの価値があります. それは高速で、信頼性が高く、非常に包括的です。フルタイムのソフトウェアの仕事でこの製品を 1 年半以上使用した後、彼らの顧客サポートは素晴らしいと言わざるを得ません!

于 2010-08-26T18:01:25.567 に答える
2

それが単なる表形式のデータである場合。ここからダウンロードできる Marcos Melli によるファイル データ ヘルパーをお勧めします。

于 2011-09-13T04:47:14.430 に答える
2

私たちが使用したソリューションは、次のことを行う必要がありました。

  • Excel で生成されたファイルの読み取り/書き込みを許可する
  • パフォーマンスが高速であること (COM の使用とは異なります)
  • MS Officeに依存しない (クライアントに MS Office がインストールされていなくても使用できる必要がある)
  • フリーまたはオープンソースであること(ただし、積極的に開発されている)

いくつかの選択肢がありますが、NPoi (Java の長い既存のPoiオープン ソース プロジェクトの .NET ポート) が最適であることがわかりました: http://npoi.codeplex.com/

また、.doc および .ppt ファイル形式で作業することもできます

于 2011-04-21T10:07:48.167 に答える
2

パーティーに遅れましたが、私はLinqToExcelのファンです

于 2012-10-26T15:09:52.860 に答える
1

Take.ioSpreadsheetがこの作業を無料で行います。これを見てください。

于 2011-09-15T03:33:19.927 に答える
1

いくつかのExcelファイルの管理を必要とする簡単なデモプロジェクトを実行しました。GemBoxソフトウェアの.NETコンポーネントは、私のニーズには十分でした。いくつかの制限がある無料バージョンがあります。

http://www.gemboxsoftware.com/GBSpreadsheet.htm

于 2008-08-19T07:48:58.073 に答える
1

Excel パッケージは、Excel 2007 ファイルを読み書きするためのオープン ソース (GPL) コンポーネントです。小さなプロジェクトで使用しましたが、API は簡単です。XLS ではなく、XLSX のみ (Excel 200&) で動作します。

ソース コードもよく整理されていて、簡単に入手できます (機能を拡張したり、私のように小さな問題を修正したりする必要がある場合)。

最初、私は ADO.Net (Excel 接続文字列) アプローチを試しましたが、厄介なハックに満ちていました。それは合いません。

于 2009-10-01T03:44:08.643 に答える
1

特定のExcelスプレッドシートをロードしてcsvとして保存するExcelスプレッドシートを作成できます(手動で行うのではなく)。

その後、C# から自動化できます。

csv に変換されると、C# プログラムはそれを理解できます。

(また、誰かがあなたに Excel でプログラミングするように頼んだ場合は、方法がわからないふりをするのが最善です)

(編集:ああ、はい、ロブとライアンはどちらも正しいです)

于 2008-08-19T07:26:38.040 に答える
1

この目的のために、人々が Excel の「拡張機能」を作成していることを私は知っています。
多かれ少なかれ、Excel で「プログラム X にエクスポート」というボタンを作成し、プログラムが読み取れる形式でデータをエクスポートして送信します。

http://msdn.microsoft.com/en-us/library/ms186213.aspxから始めるのがよいでしょう。

幸運を

于 2008-08-19T07:26:41.987 に答える
1

かなり大規模なシステムではClosedXMLを使用します。

  • 無料
  • インストールが簡単
  • 簡単なコーディング
  • 非常に反応の良いサポート
  • 開発者チームは、新しい提案に対して非常にオープンです。多くの場合、新機能とバグ修正は同じ週に実装されます
于 2012-08-17T08:34:36.403 に答える
0

同じワークシートに複数のテーブルがある場合は、各テーブルにオブジェクト名を付けて、次のように OleDb メソッドを使用してテーブルを読み取ることができます: http://vbktech.wordpress.com/2011/05/10/c-net-reading -and-writing-to-multiple-tables-in-the-same-microsoft-excel-worksheet/

于 2011-07-20T02:33:05.517 に答える
0

ExcelLibraryを使用して、.xls スプレッドシートを DataSet にロードしました。私にとってはうまくいきました。

于 2009-08-24T06:21:56.800 に答える
0

Excel データ リーダーが最適です。

http://exceldatareader.codeplex.com/にあるオープン ソースであり、積極的に開発されています。

私たちは数年前から、表形式の (そして時にはそれほど表形式ではない) ワークシートを読むためにそれを使用しています (金融アプリケーションで)。

人間が読めるシートから単体テストデータを読み取るのは魅力的です。

Excelの場合、DateTimeは単なる2つの数値であるため、DateTimeを返そうとする機能は避けてください。

于 2011-02-04T19:41:51.807 に答える