質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.37%

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

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 4,867

score 13

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

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

            string filePath = @"D:\temp\Test.xlsm";



            using (var workbook = new XLWorkbook(filePath))
            {
                var worksheet = workbook.Worksheet("Sheet1");

                var cell = worksheet.Cell("B2");

                Console.WriteLine(cell.Value);
            }

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2019/09/27 07:19 編集

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

    キャンセル

  • kuniyan

    2019/09/27 08:03

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

    キャンセル

回答 2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る