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 |
.NetFramework | v4.7.2 |
ClosedXml | v0.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との相性も良いため、テーブル集計や加工をしやすいのでお勧めです。