16
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OpenXMLでExcelファイルを操作しよう (1) - Excelファイルを新規作成したい

Last updated at Posted at 2021-09-20

はじめに

先月(2021/08)、技術評論社より『C#コードレシピ集』を出版しました。
この本には、385のコードレシピが掲載されています。執筆している段階では385を超えるレシピを予定していたのですが、ページ数の関係(この本700ページを超える分厚い本です)でいくつかのレシピは没にしています。
その中にOpen XMLを使ってExcelを操作するものがあります。そのまま眠らせてしまうのは残念なので、Qiitaでこのレシピを5回に分けて紹介したいと思います。

  1. OpenXMLでExcelファイルを操作しよう (1) - Excelファイルを新規作成したい ← 今ここ
  2. OpenXMLでExcelファイルを操作しよう (2) - セルに値を設定したい
  3. OpenXMLでExcelファイルを操作しよう (3) - セルの値を読み込みたい
  4. OpenXMLでExcelファイルを操作しよう (4) - 全てのセルの値を取得したい
  5. OpenXMLでExcelファイルを操作しよう (5) - セルに書式を設定したい

コードレシピの環境は、C#9.0 + .NET 5 のコンソールアプリケーションです。

なお、『C#コードレシピ集』では、NPOIを使ってエクセルファイルを操作するレシピを掲載しています。

準備

C#でExcelファイルを操作する方法はいくつか存在しますが、ここでは、OpenXML SDKを利用した方法を紹介したいと思います。
OpenXML SDKを使えばExcelがインストールされていないPCからもExcel文書を作成することが可能です。

OpenXML SDKを利用するには、Visual Studioの「NuGet パッケージの管理」を利用してDocumentFormat.OpenXmlパッケージをインストールします。あるいは、以下のコマンドでプロジェクトにパッケージをインストールします。ここでは、バージョン2.13.1を利用しています。

dotnet add package DocumentFormat.OpenXml --version 2.13.1

名前空間

OpenXML SDKを利用する際に必要な名前空間を以下に示します。

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml.Packaging;

サンプルコードの方針

ここでは、MyExcelBookクラスを定義し、そこにエクセルファイルを操作するメソッドを追加していきます。そうすることで、OpenXMLが提供する機能をより理解しやすくなると思います。

定義するメソッド

以下のメソッドを定義します。OpenXMLの機能をカプセル化により抽象度をあげています。

メソッド 機能
CreateBook エクセルのBookを作成する (静的メソッド)
CreateSheet Bookにシートを追加する
Save 作成したBookを保存する

MyExcelBookクラス

上記3つのメソッドを定義したMyExcelBookクラスを以下に示します。ここで示したコードが、Excelファイルを操作する出発点となります。第2回目以降は、このMyExcelBookクラスに機能を追加していくことになります。

具体的にOpenXMLのどんな機能を使っているのかはコメントを読んでください。

sealed class MyExcelBook : IDisposable {
    private MyExcelBook() { }

    public void Dispose() => _document?.Dispose();

    private SpreadsheetDocument _document;
    private WorkbookPart _workbookpart;
    private WorksheetPart _worksheetPart;
    private Sheets _sheets;

    public static MyExcelBook CreateBook(string filepath) {
        var book = new MyExcelBook();
        // Excelのドキュメントを新規に作成する
        book._document = SpreadsheetDocument.Create(filepath, SpreadsheetDocumentType.Workbook);

        // ドキュメントにワークブックを追加する
        book._workbookpart = book._document.AddWorkbookPart();
        book._workbookpart.Workbook = new Workbook();

        // ワークブックにシートの入れ物を追加する
        book._sheets = book._workbookpart.Workbook.AppendChild<Sheets>(new Sheets());
        return book;
    }

    // シートを作成する
    public void CreateSheet(string sheetname) {
        // シート作成のための準備
        _worksheetPart = _workbookpart.AddNewPart<WorksheetPart>();
        _worksheetPart.Worksheet = new Worksheet(new SheetData());

        // シートを作成し追加する
        var max = (uint)(_sheets.Count() + 1);
        var sheet = new Sheet {
            Id = _workbookpart.GetIdOfPart(_worksheetPart),
            SheetId = max,
            Name = sheetname
        };
        _sheets.Append(sheet);
    }
    
    // 保存する
    public void Save() {
        _workbookpart.Workbook.Save();
        _document.Close();
    }
}

MyExcelBookクラスを使って、エクセルファイルを新規作成する

それでは、MyExcelBookクラスを利用したコードを示しましょう。ここでは新規にExcelファイルを作成し、空のシートを挿入しています。
OpenXMLのAPIをダラダラと羅列すると何をやっているのかわからないコードになりがちですが、こうすれば、何をやっているのかがとてもよくわかります。

using var book = MyExcelBook.CreateBook("example.xlsx");
book.CreateSheet("sheet1");
book.CreateSheet("sheet2");
book.Save();

以下のようなExcelファイルが作成されます。

スクリーンショット 2020-11-25 20.31.58.png

16
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?