🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

2回答

8802閲覧

[C#] ClosedXML Excelファイルを開く際にシートを指定して開く方法

kuniyan

総合スコア13

ClosedXML

ClosedXMLは、Excel形式ファイル(.xlsx, .xlsm)の操作や読み書きのための.NETライブラリです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2019/09/26 02:49

C#にて、ClosedXMLを使用し、Excelファイルのデータを読み込みたいのですが、対象のファイルの容量が大きいせいか、Bookを開く際に時間がかかってしまいます。
そこで、ファイル(Book)のみではなく、Sheetも指定してデータを読み込みたいと考えています。

現在単純に、以下のようなコードを実行しているのですが、上記の内容は可能でしょうか。
(Sheetのみ取得 => 指定のSheetを開く といった感じ、、、)

C#

1 string filePath = @"D:\temp\Test.xlsm"; 2 3 4 5 using (var workbook = new XLWorkbook(filePath)) 6 { 7 var worksheet = workbook.Worksheet("Sheet1"); 8 9 var cell = worksheet.Cell("B2"); 10 11 Console.WriteLine(cell.Value); 12 }

お手数おかけしますが、宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/09/26 22:20 編集

excel の book の特定の sheet からデータを読むことだけが目的で、そのための手段は問わないのでしょうか? 例えば、closed xml である必要はなくて、jet または ace プロバイダと ado.net を使ってもかまわないとか。
kuniyan

2019/09/26 23:03

はい。 Excelシート内の値を使用したいだけですので、ClosedXMLである必要はないです。 DBエンジンに関して無知なので、ご教示いただけるとありがたいです。
guest

回答2

0

ClosedXML は Open XML SDK を内部で使っているそうです。
Open XML SDK で大きなスプレッドシートを読み取る方法がありました。

[方法] サイズの大きいスプレッドシート ドキュメントを解析して読み取る (Open XML SDK)

DOM を使う方法では、ドキュメントのすべてを事前に読み取ります。ClosedXML はこちらの方法を採用していると思われます。一方、SAX を使う方法では、XML を先頭から逐次読み取ります。こちらを使ってみてください。

投稿2019/09/27 03:07

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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 を使った場合と比較して早くなるかどうかは分かりませんが、試してみる価値はあるのではと思います。

投稿2019/09/27 02:55

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問