【C#】ClosedXMLによるエクセル操作

C#

ClosedXMLとは

C#でExcelファイルを操作することができます。
Excelファイル(.xlsx)を閉じたままテキストファイルとして操作ができるので高速で実行でき、テキストとして開くのでExcelが入っていないPCでも実行できます。
※Excelの古い拡張子(.xls)は開くことはできません。

Microsoftが公式で出しているDocumentFormat.OpenXmlだけでも操作はできますが、WordやPowerPointにも対応している関係で操作が煩雑になるため、Excel操作はClosedXMLを使うのがおすすめです。
ClosedXMLはOpenXMLと依存関係にあるため、両方インポートする必要があります。

入手方法

名称バージョン
入手場所Nuget
ライセンスMIT license

実装例

VBAを書く要領で手軽に実装できます。
実装例として下記フローを実行します。

①Excelを開く
②Sheet1に記載しているテーブルをUsedRangeをDataTable型で取得する
③DataTableをDatagridにバインディングすることで、MainWindowに一覧表を表示

事前作業

Nugetからダウンロードしてプロジェクトにインポートする。

環境

名称バージョン
フレームワークWPF
.NetFrameworkv4.7.2
ClosedXmlv0.95.4

実装コード

・CSファイル


using System;
using System.IO;
using System.Data;
using ClosedXML.Excel;

public partial class MainWindow : System.Windows.Window
{
	public MainWindow()
	{
		try{
			InitializeComponent();
			
			ExcelControl xl = new ExcelControl();
			this.DataContext = xl.getTables();
		}
		catch (System.Exception ex)
		{
			Console.WriteLine(ex.Message);
		}
	}
}

public class ExcelControl
{
	protected DataTable getTables()
	{
		DataTable table = null;
		using (FileStream fs = new FileStream("D:\\test.xlsx", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
		{
			//Excelを開く
			var workbook = new XLWorkbook(fs);
			if(workbook==null)
			{
				throw new FileNotFoundException("Excelファイルが見つかりませんでした。");
			}
			//シートを取得
			var worksheet = workbook.Worksheet("Sheet1");
			//フィルタ解除
			worksheet.AutoFilter.Clear();
			//RangeUsedでテーブル情報を配列で取得する
			table = worksheet.RangeUsed().AsTable().AsNativeDataTable();
		}
		return table;
	}
}

・XAMLファイル(抜粋)

<DataGrid ItemsSource="{Binding}" x:Name="dataGrid" >

最後に

業務でExcelを利用しているのであれば汎用的に利用できます。またLinqとの相性も良いため、テーブル集計や加工をしやすいのでお勧めです。

参考サイト