excel の book の特定の sheet からデータを読むことだけが目的で、そのための手段は問わないのでしょうか? 例えば、closed xml である必要はなくて、jet または ace プロバイダと ado.net を使ってもかまわないとか。
はい。 Excelシート内の値を使用したいだけですので、ClosedXMLである必要はないです。
・・・とのことですので、ACE プロバイダ + ADO.NET を使う方法を紹介しておきます。
以下の記事の通り、ACE プロバイダ + ADO.NET で Excel の Book を作成して任意の Sheet を追加できます。なので、任意の Sheet から SELECT クエリでデータの取得もできるはずです。
ACE OleDb で Excel のブック作成
http://surferonwww.info/BlogEngine/post/2012/01/26/Creating-Excel-workbook-by-using-ACE-OleDb-provider.aspx
「はず」と言っておいて、できなかったら何ですので、上の記事で作った .xlsx ファイルの Sheet からデータを取得するサンプルを書いておきます。
.xlsx ファイルは上の記事とはちょっと違っていて MySheet2 が上の記事のコードで作った Sheet に該当します。以下のようになっています。この MySheet2 からデータを取得します。
ACE プロバイダと ADO.NET ライブラリを利用して DataTable に上の画像の Excel Book の MySheet2 からデータを取得し、それを DataGridView にバインドして表示します。
そのコードは以下の通りです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.OleDb;
namespace WindowsFormsApplication2
{
public partial class Form4 : Form
{
private BindingSource bindingSource1;
private DataGridView dataGridView1;
private DataTable table;
public Form4()
{
InitializeComponent();
this.dataGridView1 = new DataGridView();
this.dataGridView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.bindingSource1 = new BindingSource();
this.dataGridView1.DataSource = this.bindingSource1;
this.Controls.Add(this.dataGridView1);
this.table = new DataTable();
}
private void Form4_Load(object sender, EventArgs e)
{
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\surfe\Documents\test.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES""";
string query = "SELECT CustomerID, CompanyName, ContactName, ContactTitle FROM [MySheet2]";
using (OleDbConnection connection = new OleDbConnection(connString))
{
OleDbDataAdapter adapter = new OleDbDataAdapter();
adapter.SelectCommand = new OleDbCommand(query, connection);
adapter.Fill(this.table);
}
this.bindingSource1.DataSource = this.table;
}
}
}
結果は以下のようになります。
ClosedXML を使った場合と比較して早くなるかどうかは分かりませんが、試してみる価値はあるのではと思います。