.NET Framework 3.5でのExcel取込について

タグの編集
投稿者   (社会人) 投稿日時 2023/5/31 11:52:26
.NET Framework 3.5のフレームワークのC#を使って、Excel取込を行いたいです。
Excel取込したデータをSQLServerにMERGE文を使ってデータをするのが目的です。

MERGE文の作成は大方できているのですが、Excel取込で詰まっています。
質問といたしましては、MERGE文が使われている関数に、List<string[]>またはDataTable型でExcelの全ての内容を引数として渡したいと考えていますので、Excelの内容をいづれかの型に格納するために使用できるライブラリなどあれば教えていただきたいです。

検索してもClosedXMLなど使用できないものが出てきてしまうので質問させていただきました、よろしくお願いいたします。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/5/31 14:35:15
> ClosedXMLなど使用できないものが出てきてしまうので
バージョン 0.88.0 以降の ClosedXML は .NET Framework 3.5 に対応していませんが
バージョン 0.87.1 以前の ClosedXML は .NET Framework 3.5 に対応していたと思います。
https://www.nuget.org/packages/ClosedXML/0.87.1

また、SQLServer のサーバーから見える位置に Excel ファイルを配置できるのであれば、
C# を介さずとも、SQL Server の sp_addlinkedserver あるいは OPENDATASOURCE を使って
Excel データを読み取らせることもできます。(サーバー上に Microsoft.ACE.OLEDB.16.0 が必要)
https://learn.microsoft.com/ja-jp/sql/relational-databases/linked-servers/create-linked-servers-sql-server-database-engine?view=sql-server-ver16
https://logicalerror.seesaa.net/article/131309317.html
https://learn.microsoft.com/en-us/answers/questions/634023/sql-server-excel-import-the-microsoft-ace-oledb-12


> Excelの内容をいづれかの型に格納するために
SQL Server Integration Services (SSIS) の「インポートおよびエクスポート ウィザード」を利用したり、
作成した SSIS パッケージを実行するといったこともできるかと。
https://docoic.com/55505
https://learn.microsoft.com/ja-jp/sql/integration-services/import-export-data/choose-a-destination-sql-server-import-and-export-wizard?view=sql-server-ver16
https://learn.microsoft.com/ja-jp/sql/integration-services/ssis-quickstart-run-cmdline?view=sql-server-ver16
投稿者   (社会人) 投稿日時 2023/5/31 16:10:05
返信ありがとうございます。
C#のフォームにてボタンを押して、OpenFileDialogで取込ファイルを選ぶという機能がある為こちら以外の方法を教えていただきたいのですがなさそうでしょうか?
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/5/31 16:54:38
先ほど ClosedXML でも読めると回答したつもりでしたが、それでは駄目だったのでしょうか?

他の方法としては、System.Data.OleDb で
 Microsoft.ACE.OLEDB.16.0
 Microsoft.ACE.OLEDB.12.0
 Microsoft.Jet.OLEDB.4.0
 Microsoft.Jet.OLEDB.3.51
などの OLE DB プロバイダー経由で Excel を読むという昔ながらの方法が考えられます。
取扱いに多少クセがありますが、SQL 一発で直接読み出せるというメリットはあります。
https://devlights.hatenablog.com/entry/20091116/p1
https://atmarkit.itmedia.co.jp/bbs/phpBB/viewtopic.php?topic=18124&forum=7
https://loosecarrot.com/2020/02/19/3988/

あるいは、ClosedXML が内部的に利用している DocumentFormat.OpenXml を直接利用するとか。
https://atmarkit.itmedia.co.jp/ait/articles/1810/17/news022.html
https://www.nuget.org/packages/ClosedXML

もしくは、ReoGrid のバージョン 2.2.0 あたりを使うとか(.NET Framework 2.0 以降に対応)。
ReoGrid の最新は 3.1.0 ですが、Ver.3 以降は .NET Framework 3.5 非対応です。
https://reogrid.net/jp/document/
https://www.nuget.org/packages/unvell.ReoGrid.dll/2.2.0
https://github.com/unvell/ReoGrid
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/5/31 17:08:30
あとは NPOI のバージョン 2.3.0 以下とか。
こちらも ClosedXML と並んで歴史の長いライブラリです。
https://www.nuget.org/packages/NPOI/2.3.0
https://github.com/nissl-lab/npoi


もしくは、Excel を COM Interop で操作するとか。
実行環境に Excel が必須になる上に、メモリ解放手順などが面倒なので
お奨めはしませんが、Excel の機能を直接呼び出せるので多機能ではあります。
ただ、.NET Framework 4 未満(というか C# バージョン 4 未満)だと COM サポートが弱いため、
.NET Framework 3.5 環境で呼ぶ場合は VB の方が楽です。
https://learn.microsoft.com/ja-jp/dotnet/csharp/advanced-topics/interop/how-to-access-office-interop-objects
投稿者   (社会人) 投稿日時 2023/5/31 17:12:45
ご返信と新たな提案もありがとうございます。


>先ほど ClosedXML でも読めると回答したつもりでしたが、それでは駄目だったのでしょうか?
使ってみようと思い、Nugetパッケージの管理からインストールを試みたところ、
「'ClosedXML' にはすでに 'DocumentFormat.OpenXml' に対して定義された依存関係があります。」と失敗してしまいました。

こちらのエラーを今対応中でございます、調査中ですが何か知っていたら教えていただけるとありがたいです。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/5/31 17:17:45
> 調査中ですが何か知っていたら教えていただけるとありがたいです。

情報が不足しているので回答をつけにくいです。

• Visual Studio のバージョン(とエディション)は何か?

• Visual Studio 2017 バージョン 15.7 以降を使っている場合、
 packages.config モードと PackageReference モードのどちらで組んでいるか?

• 既存プロジェクトにいきなり組み込もうとするのではなく、依存関係確認のために
 新規作成の最小構成のプロジェクトで試してみて、それでも失敗するのか?

• 既存プロジェクトに組み込もうとすると競合が発生する場合、
 既存プロジェクトが参照しているライブラリ群はどういう構成になっているのか?
投稿者   (社会人) 投稿日時 2023/5/31 17:55:40
>• Visual Studio のバージョン(とエディション)は何か?
Visual Studioは2010を使用しています。

他にも色々情報を掲示していただきましたが、こちらのサイトを参考にして、nugetのサイトから直接インストールする方法で解決しました。

色々ご提案いただきありがとうございました!