回答:
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"),
});
xlsx
、あなたの代わりにこの接続文字列を使用する必要がありますstring.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0}; Extended Properties=Excel 12.0;", fileName)
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に大量のデータを引き出すために、運用環境で怒りの中で使用しました。それは非常にうまく機能し、かなり堅牢です。
<dimension>
て<worksheet>
いた欠落した要素だったと思います。
これは、数年前に.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;
}
}
}
OpenXML形式(たとえば、xlsx)の場合、古いファイル形式を暗示する.xlsを具体的に要求しましたが、OpenXML SDK(http://msdn.microsoft.com/en-us/library/bb448854.aspx)を強くお勧めします
ExcelMapperは、Excelワークシートを厳密に型指定されたオブジェクトとして読み取るために使用できるオープンソースツール(http://code.google.com/p/excelmapper/)です。xlsとxlsxの両方のフォーマットをサポートしています。
.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 = new 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 set = new DataSet(); ada.Fill(set); set.Tables [0];を返します。 } }
コードは記事からです:http : //www.c-sharpcorner.com/uploadfile/d2dcfc/read-excel-file-with-net/。あなたはそれからより多くの詳細を得ることができます。
無料ではありませんが、最新のOfficeには非常に優れたオートメーション.Net APIがあります。(長い間APIが使用されていましたが、厄介なCOMでした)Officeアプリが非表示のバックグラウンドプロセスのままで、コード内で必要なすべてのことを実行できます。
ここで私がベースから外れていても許してください、しかしこれはOffice PIAの目的ではありませんか?
.NETコンポーネントのExcel Reader .NETは、要件を満たす場合があります。XLSXおよびXLSファイルを読み取るのに十分です。だからそれを試してください:
無料で使いやすい.NETライブラリであるFileHelpersライブラリをお勧めします。これは、EXCELからデータをインポート/エクスポートしたり、ファイル、文字列、ストリームなどの固定長または区切りレコードをインポートしたり、その他の機能を追加したりするために使用します。
Excelデータリンクのドキュメントセクション http://filehelpers.sourceforge.net/example_exceldatalink.html
このオープンソースソリューションを使用すると、Excelをよりクリーンに扱うことができます。
私たちが使用したソリューションは、次のことを必要としました。
いくつかの選択肢がありますが、NPoi(Javaの長い既存のPoiオープンソースプロジェクトの.NETポート)が最適であることがわかりました:http : //npoi.codeplex.com/
また、.docおよび.pptファイル形式を操作できます。
パーティーには遅れますが、私はLinqToExcelのファンです
特定のExcelスプレッドシートを読み込み、CSVとして保存するExcelスプレッドシートを(手動で作成するのではなく)作成できます。
その後、c#から自動化できます。
そしてcsvに入ると、c#プログラムはそれを見ることができます。
(また、誰かがあなたにExcelでプログラムするように頼んだら、あなたが方法がわからないふりをするのが最善です)
(編集:ああそう、ロブとライアンはどちらも正しい)
私は人々がこの目的のためにExcelの「拡張」を作成していることを知っています。
あなたは多かれ少なかれExcelに「プログラムXにエクスポートする」と書かれたボタンを作り、そしてプログラムが読むことができるフォーマットでデータをエクスポートして送り出します。
http://msdn.microsoft.com/en-us/library/ms186213.aspxから始めるのが良いでしょう。
幸運を
いくつかのExcelファイルの管理を必要とする簡単なデモプロジェクトを実行しました。GemBoxソフトウェアの.NETコンポーネントは、私のニーズには十分でした。それはいくつかの制限付きの無料版を持っています。
Excelパッケージは、Excel 2007ファイルを読み書きするためのオープンソース(GPL)コンポーネントです。小さなプロジェクトで使用しましたが、APIは単純です。XLSXでは機能せず、XLSXでのみ機能します(Excel 200&)。
ソースコードもよく整理されており、簡単に移動できます(機能を拡張したり、マイナーな問題を修正したりする必要がある場合)。
最初はADO.Net(Excel接続文字列)のアプローチを試しましたが、厄介なハッキングに悩まされていました。たとえば、2行目に数値が含まれていると、下の列のすべてのフィールドにintが返され、静かにデータがドロップされますそれは適合しません。
ExcelLibraryを使用して、.xlsスプレッドシートをDataSetにロードしました。私にとってはうまくいきました。