質問

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

あまり複雑な作業は必要なく、ワークシートを選択してデータを文字列として読み取るだけです。これまで、Excel の Unicode テキストへのエクスポート機能を使用し、結果として得られた (タブ区切りの) ファイルを解析してきましたが、手動の手順を省略したいと考えています。

役に立ちましたか?

解決

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"),
                    });

他のヒント

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

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

-ライアン

アップデート:次に、次のような方法でワークシートを読み取ることができます select * from [Sheet1$]

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

この優れた記事は、よくある落とし穴を回避するのに役立ちます。http://blog.lab49.com/archives/196

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);
    }
}

Excelデータリーダーはどうですか?

http://exceldatareader.codeplex.com/

私は運用環境で、さまざまな Excel ファイルから大量のデータを SQL Server Compact にプルするために使用しました。とてもうまく機能し、かなり頑丈です。

以下は、数年前に .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;
        }
    }
}

クーグラ は、Excel ファイルの読み取りと書き込みを行う C# で書かれたオープンソース コンポーネントです。

OpenXML 形式 (例:xlsx) OpenXML SDK を強くお勧めします (http://msdn.microsoft.com/en-us/library/bb448854.aspx)

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

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

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

乾杯、

カール

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

.NETでxls/xlsxファイルを読み取る簡単な方法を紹介したいと思います。以下があなたのお役に立てば幸いです。

 private DataTable ReadExcelToTable(string path)    
 {

     //Connection String

     string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';";  
     //the same name 
     //string connstring = Provider=Microsoft.JET.OLEDB.4.0;Data Source=" + path + //";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; 

     using(OleDbConnection conn = new OleDbConnection(connstring))
     {
        conn.Open();
        //Get All Sheets Name
        DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables,new object[]{null,null,null,"Table"});  

        //Get the First Sheet Name
        string firstSheetName = sheetsName.Rows[0][2].ToString(); 

        //Query String 
        string sql = string.Format("SELECT * FROM [{0}]",firstSheetName); 
        OleDbDataAdapter ada =new OleDbDataAdapter(sql,connstring);
        DataSet set = new DataSet();
        ada.Fill(set);
        return set.Tables[0];   
   }
 }

コードは記事からのものです: http://www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/. 。そこからさらに詳しい情報を得ることができます。

無料ではありませんが、最新の Office を使用すると、 とても 素晴らしい自動化 .Net API。(API は長い間存在していましたが、厄介な COM でした) Office アプリが隠されたバックグラウンド プロセスのままである間、必要なことはすべてコード内で行うことができます。

基地外だったらごめんなさい、でもこれが本当のことではないでしょうか? オフィスPIA のためですか?

最近は、LINQ を上手くするためもあって…。Excel のオートメーション API を使用してファイルを XML スプレッドシートとして保存し、LINQ to XML を使用してそのファイルを処理しています。

.NET 用スプレッドシートギア は、.NET 用の Excel 互換スプレッドシート コンポーネントです。パフォーマンスについてのお客様の声は、右側のページで確認できます。 商品ページ. 。無料の完全な機能を試してみることができます 評価.

スマートXLS これは、Excel グラフ、数式エンジンのほとんどの機能をサポートし、excel2007 openxml 形式の読み取り/書き込みができるもう 1 つの Excel スプレッドシート コンポーネントです。

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

http://www.devtriogroup.com/ExcelReader

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

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

Excel の処理を​​よりクリーンにするこのオープン ソース ソリューションを使用してみてください。

http://excelwrapperdotnet.codeplex.com/

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

私たちが使用したソリューションでは、次のことが必要でした。

  • 許可する 読み書き Excel で生成されたファイルの数
  • なれ 速い パフォーマンス上 (COM の使用とは異なります)
  • MSオフィスになる 独立した (クライアントに MS Office がインストールされていない場合でも使用できる必要があります)
  • なれ 無料 または オープンソース (ただし積極的に開発されています)

いくつかの選択肢がありますが、私たちが見つけたのは、 NPOi (古くから存在する Java の .NET ポート ポイ オープンソース プロジェクト) を最適化するには:http://npoi.codeplex.com/

.doc および .ppt ファイル形式を使用することもできます。

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

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

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

それを C# から自動化できます。

CSV に保存すると、C# プログラムでそれを認識できます。

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

(編集:ああ、そうだ、ロブとライアンは両方とも正しい)

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

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

幸運を

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

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

エクセルパッケージ Excel 2007 ファイルの読み取り/書き込み用のオープンソース (GPL) コンポーネントです。私は小規模なプロジェクトでそれを使用しましたが、API は簡単です。XLSX (Excel 200&) でのみ動作し、XLS では動作しません。

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

最初は、ADO.Net (Excel 接続文字列) アプローチを試しましたが、厄介なハックがたくさんありました。 2番 行に数値が含まれている場合、その下の列のすべてのフィールドに対して int が返され、適合しないデータは静かに削除されます。

を使用しております クローズドXML かなり大規模なシステムで。

  • 無料
  • 取り付けが簡単
  • 単純なコーディング
  • とても 応答性の高いサポート
  • 開発者チームは、 極端に 新しい提案を受け入れます。多くの場合、新機能とバグ修正は同じ週内に実装されます

Take.io スプレッドシートがこの作業を無料で行います。ちょっと見てください これ.

ちょうど使ったばかりです エクセルライブラリ .xls スプレッドシートを DataSet にロードします。私にとってはとてもうまくいきました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top