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 のアプローチは迅速かつ簡単ですが、特に DataTypes の処理方法に関して注意すべきいくつかの癖があります。
この優れた記事は、いくつかの一般的な落とし穴を回避するのに役立ちます: 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);
}
}
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.
これは、数年前に.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;
}
}
}
Koograは、Excel ファイルを読み書きする C# で記述されたオープンソース コンポーネントです。
特に古いファイル形式を意味する.xlsを要求しましたが、OpenXML形式(xlsxなど)の場合は、OpenXML SDK(http://msdn.microsoft.com/en-us/library/bb448854.aspx)を強くお勧めします。
少し前に C# で Excel ファイルから多くの読み取りを行いましたが、次の 2 つのアプローチを使用しました。
後者のアプローチははるかに高速でした。20 列と 200 行の大きなテーブルを読み取るには、COM では 30 秒、ODBC では 0.5 秒かかりました。したがって、必要なのはデータだけである場合は、データベース アプローチをお勧めします。
乾杯、
カール
.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/。そこから詳細を取得できます。
ExcelMapper は、Excel ワークシートを厳密に型指定されたオブジェクトとして読み取るために使用できるオープン ソース ツール ( http://code.google.com/p/excelmapper/ ) です。xls 形式と xlsx 形式の両方をサポートしています。
無料ではありませんが、最新のOfficeには、非常に優れた自動化.NetAPIがあります。(APIは長い間存在していましたが、厄介なCOMでした)Officeアプリが非表示のバックグラウンドプロセスのままである間、コードで必要なすべてを実行できます。
最近、部分的にLINQをより良くするために....私はExcelの自動化APIを使用してファイルをXMLスプレッドシートとして保存し、LINQ to XMLを使用してそのファイルを処理しています。
SmartXLSは、Excel チャート、数式エンジンのほとんどの機能をサポートし、excel2007 openxml 形式を読み書きできるもう 1 つの Excel スプレッドシート コンポーネントです。
SpreadsheetGear for .NETは、Excel 互換の .NET 用スプレッドシート コンポーネントです。製品ページの右側で、パフォーマンスに関するお客様の声をご覧いただけます。完全に機能する無料の評価版を使用して、自分で試すことができます。
基地外でしたらすみませんが、これがOffice PIAの目的ではないでしょうか?
.NET コンポーネントの Excel Reader .NET が要件を満たす場合があります。XLSX および XLS ファイルを読み取るには十分です。だからそれを試してみてください:
無料で使いやすい.NETライブラリであるFileHelpersライブラリをお勧めします。これは、EXCEL、ファイル、文字列、またはストリームなどの固定長または区切りレコードからデータをインポート/エクスポートするためのものです。
Excelデータリンクドキュメントセクション http://filehelpers.sourceforge.net/example_exceldatalink.html
Excel をよりクリーンに扱うこのオープン ソース ソリューションを試してみることができます。
SpreadsheetGearは素晴らしいです。はい、それは費用がかかりますが、これらの他のソリューションをいじるのと比較すると、コストに見合うだけの価値があります. それは高速で、信頼性が高く、非常に包括的です。フルタイムのソフトウェアの仕事でこの製品を 1 年半以上使用した後、彼らの顧客サポートは素晴らしいと言わざるを得ません!
それが単なる表形式のデータである場合。ここからダウンロードできる Marcos Melli によるファイル データ ヘルパーをお勧めします。
私たちが使用したソリューションは、次のことを行う必要がありました。
いくつかの選択肢がありますが、NPoi (Java の長い既存のPoiオープン ソース プロジェクトの .NET ポート) が最適であることがわかりました: http://npoi.codeplex.com/
また、.doc および .ppt ファイル形式で作業することもできます
パーティーに遅れましたが、私はLinqToExcelのファンです
Take.io
Spreadsheetがこの作業を無料で行います。これを見てください。
いくつかのExcelファイルの管理を必要とする簡単なデモプロジェクトを実行しました。GemBoxソフトウェアの.NETコンポーネントは、私のニーズには十分でした。いくつかの制限がある無料バージョンがあります。
Excel パッケージは、Excel 2007 ファイルを読み書きするためのオープン ソース (GPL) コンポーネントです。小さなプロジェクトで使用しましたが、API は簡単です。XLS ではなく、XLSX のみ (Excel 200&) で動作します。
ソース コードもよく整理されていて、簡単に入手できます (機能を拡張したり、私のように小さな問題を修正したりする必要がある場合)。
最初、私は ADO.Net (Excel 接続文字列) アプローチを試しましたが、厄介なハックに満ちていました。それは合いません。
特定のExcelスプレッドシートをロードしてcsvとして保存するExcelスプレッドシートを作成できます(手動で行うのではなく)。
その後、C# から自動化できます。
csv に変換されると、C# プログラムはそれを理解できます。
(また、誰かがあなたに Excel でプログラミングするように頼んだ場合は、方法がわからないふりをするのが最善です)
(編集:ああ、はい、ロブとライアンはどちらも正しいです)
この目的のために、人々が Excel の「拡張機能」を作成していることを私は知っています。
多かれ少なかれ、Excel で「プログラム X にエクスポート」というボタンを作成し、プログラムが読み取れる形式でデータをエクスポートして送信します。
http://msdn.microsoft.com/en-us/library/ms186213.aspxから始めるのがよいでしょう。
幸運を
かなり大規模なシステムではClosedXMLを使用します。
同じワークシートに複数のテーブルがある場合は、各テーブルにオブジェクト名を付けて、次のように OleDb メソッドを使用してテーブルを読み取ることができます: http://vbktech.wordpress.com/2011/05/10/c-net-reading -and-writing-to-multiple-tables-in-the-same-microsoft-excel-worksheet/
ExcelLibraryを使用して、.xls スプレッドシートを DataSet にロードしました。私にとってはうまくいきました。
Excel データ リーダーが最適です。
http://exceldatareader.codeplex.com/にあるオープン ソースであり、積極的に開発されています。
私たちは数年前から、表形式の (そして時にはそれほど表形式ではない) ワークシートを読むためにそれを使用しています (金融アプリケーションで)。
人間が読めるシートから単体テストデータを読み取るのは魅力的です。
Excelの場合、DateTimeは単なる2つの数値であるため、DateTimeを返そうとする機能は避けてください。