openFileDialog ツールがあります。コンピューターから Excel ファイルを選択し、プログラムが列 (たとえば A 列) を読み取り、GUI にリストボックスを書き込みます。OleDB 経由で行うにはどうすればよいですか? 私はC#が初めてです。詳しく説明してくれると、嬉しいです。ご協力ありがとうございました。
1 に答える
OLEDB プロバイダーをうまく使用するには、いくつかの点を考慮する必要があります。
Excel 2003 ファイルの OLEDB プロバイダーは、Excel 2007/2010 ファイルに使用されるプロバイダーとは異なります。そのため、最初にやらなければならないことは、正しいプロバイダーを選択するために Excel ファイル形式を決定することです。以下のコード例では、単純にファイルの拡張子をチェックして Excel ファイル形式を判別しています。Excel ファイル形式を決定するためのより精巧な方法があることに注意してください (たとえば、マジック バイトを介して)。
Excel シートのすべての行を選択するには、Excel シートの名前を知る必要があります。標準シート名は言語に依存しており、ユーザーが名前を変更できます。そのため、Excel ファイルに含まれるシートの名前が言語に依存しない (そしてもちろん名前が変更されたシートに依存しない) ことを確認する方法が必要です。幸いなことに、この
OleDbConnection
クラスにはGetOleDbSchemaTable
、Excel ファイル内のすべてのシート名を取得できるメソッドが用意されています。Excel の OLEDB プロバイダーは、HDR と呼ばれる拡張プロパティをサポートしています。に設定
HDR
するYes
と、シートの最初の行に列のタイトルが含まれます。したがって、列のタイトルを使用する場合は、 を設定する必要がありますHDR=Yes
。
したがって、以下のコード サンプルを要約すると、次のようになります (ボタン クリック時)。
- ファイル拡張子に基づいて Excel ファイルの種類を決定します。
- Excel ファイルの種類に基づいて正しい OLEDB プロバイダーを選択し、接続文字列を作成します。
- Excel ファイルに含まれるシート名を決定します。
- 最初のシートを選択し、すべての行を選択して、行を という DataTable に格納します
mytable
。 - という名前のリストボックスの最初の列のすべての値を表示します
listbox1
。
コードサンプル:
private static bool IsExcelXmlFileFormat(string fileName)
{
return fileName.EndsWith("xlsx", StringComparison.OrdinalIgnoreCase);
}
private void button1_Click(object sender, EventArgs e)
{
// Open your FileOpenDialog and let the user select a file...
string fileName = "c:\\temp\\myexcelfile.xlsx";
OleDbConnectionStringBuilder connStringBuilder =
new OleDbConnectionStringBuilder();
connStringBuilder.DataSource = fileName;
if (IsExcelXmlFileFormat(fileName))
{
// Set HDR=Yes if first row contains column titles.
connStringBuilder.Provider = "Microsoft.ACE.OLEDB.12.0";
connStringBuilder.Add("Extended Properties", "Excel 8.0;HDR=NO;");
}
else
{
connStringBuilder.Provider = "Microsoft.Jet.OLEDB.4.0";
connStringBuilder.Add("Extended Properties", "Excel 8.0;");
}
DataSet data = new DataSet();
using (OleDbConnection dbConn = new OleDbConnection(connStringBuilder.ConnectionString))
{
dbConn.Open();
DataTable sheets = dbConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
using (OleDbCommand selectCmd = new OleDbCommand(
String.Format("SELECT * FROM [{0}]", sheets.Rows[0]["TABLE_NAME"]), dbConn))
{
using (OleDbDataAdapter dbAdapter = new OleDbDataAdapter())
{
dbAdapter.SelectCommand = selectCmd;
dbAdapter.Fill(data, "mytable");
}
}
}
// To enumerate all rows use the following code.
// foreach (DataRow row in data.Tables["mytable"].Rows)
// {
// Console.Out.WriteLine(row[0]);
// }
// Display the values of column 0 in a listbox called listBox1.
listBox1.ValueMember = data.Tables["mytable"].Columns[0].ColumnName;
listBox1.DisplayMember = data.Tables["mytable"].Columns[0].ColumnName;
listBox1.DataSource = data.Tables["mytable"];
}