COM経由でExcelを操作するための準備

依存関係から右クリックでCOM参照の追加を選択

Microsoft.Excel XX.X ObjectLibrary を選択(要Excelインストール)

OKで閉じる

ClosedXMLでExcelを操作するための準備

Nugetから ClosedXML をインストール

ExcelDataReaderでExcelを操作するための準備

Nugetから ExcelDataReader をインストール

ExcelDataReader.DataSetもインストールしてください
AsDataSet() を使うのに必要になってきます

EPPlusでExcelを操作するための準備

Nugetから EPPlus をインストール

NPOIでExcelを操作するための準備

Nugetから NPOIをインストール

投稿日時: 2025-05-07 13:02:07
更新日時: 2025-05-17 04:16:17

C#からExcel操作方法のメモ

ライブラリ .xls .xlsx 読み 書き ライセンス
ClosedXML × MIT
ExcelDataReader × MIT
NPOI Apache 2.0
EPPlus × Polyform Noncommercial License 1.0.0

ClosedXML、ExcelDataReader、EPPlus、NPOIのドキュメント・チュートリアル

Excel(COM)、ClosedXML、ExcelDataReader、NPOI、EPPlusを使えるようにする


早見表

項目 Excel(COM) ClosedXML EPPlus ExcelDataReader NPOI
ファイルパスオープン × ×
FileInfoオープン × × × ×
FileStreamオープン ×
行列番号 1~ 1~ 1~ 0~ 0~
シート番号 1~ 1~ 0~ 0~ 0~
シート取得 Sheets変数[ ] Worksheet() Worksheets() - GetSheetAt()/GetSheet()
存在しないシート 例外 例外 null null null

ワークブック

処理 Excel(COM) ClosedXML EPPlus ExcelDataReader NPOI
ブックを作成 ×
ブックを開く
ブックを開く(読み取り専用)
ブックを開く(書き込みパスワード付き) × × × ×
ブックを開く(開くパスワード付き) × × × ×
ブックを保存(名前をつけて保存) ×
上書き保存 ×

ワークシート

処理 Excel(COM) ClosedXML EPPlus ExcelDataReader NPOI
シートの数を取得する
全てのシートを取得しその名前を出力する
シート名を変更 ×
シートを追加する(一番最後) ×
シートの削除 ×
ワークシートの参照
アクティブなシートを取得/設定 ×
表示倍率の取得 × ×
表示倍率の設定 ×
シートの保護 ×
シートの解除 ×

(補足)シートの解除は、NPOIだとパス無し保護は解除できても、パス有り保護は解除できなさそう


セル

処理 Excel(COM) ClosedXML EPPlus ExcelDataReader NPOI
A1形式でセルの値取得 × ×
R1C1形式でセルの値取得
複数のセルを範囲で取得し、1つずつ取り出し値を出力
セルのアドレス × ×
セルに値を設定する ×

参考

ClosedXML, ExcelDataReader, EPPlus, NPOIがパスワード解除について

Officeのサーバー上でのCOM経由による自動操作について

Microsoft.Office.Interop.Excel でオブジェクトの解放について

解放ヘルパークラスを使ったオブジェクトの解放

R1C1情報からA1形式への変換

EPPlus/NPOIで既存ファイルを開き、保存する方法

EPPlusでファイル作成、保存方法

投稿日時: 2025-05-07 12:05:07
更新日時: 2025-05-28 14:58:28

回転せずに4つ横に画像を並べて表示するならこんな感じ。

(() => {
    let img = new Image();
    img.addEventListener('load', () => {
        drawImage(img);
    }, false);
    img.src = "./Image.png";
})();

function drawImage(img) {
    let canvas = document.querySelector("#main");
    let context = canvas.getContext("2d");

    let imgSize = 64;
    for (let i = 0; i < 4; i++) {
        let imgX = imgSize * i;
        let imgY = 0;
        context.drawImage(img, imgX, imgY);
    }
}

これを45°ずつ回転させて表示させると

(() => {
    let img = new Image();
    img.addEventListener('load', () => {
        drawImage(img);
    }, false);
    img.src = "./Image.png";
})();

function drawImage(img) {
    let canvas = document.querySelector("#main");
    let context = canvas.getContext("2d");

    let imgSize = 64;
    for (let i = 0; i < 4; i++) {
        let angle = 45 * i;
        let moveX = imgSize / 2 + imgSize * i;
        let moveY = imgSize / 2;

        let imgX = -imgSize / 2;
        let imgY = -imgSize / 2;

        // 描画状態保存
        context.save();

        // 原点を移動させる
        context.translate(moveX, moveY);

        // canvasを回転
        context.rotate(angle);

        // 画像表示
        context.drawImage(img, imgX, imgY);

        // saveの状態に戻す
        context.restore();
    }
}

1ループ目
translateで原点移動

キャンバスを0°回転させて、画像配置(左上の位置を指定)

restoreによって 、 fillStyle, strokeStyle, lineWidthなどのスタイルや
translate, rotate, scaleや globalAlpha, clipなどがsaveの状態に戻る
ここではsave後にrotateしただけなので、画像を表示した状態で回転が元の状態に戻ることになる

2ループ目
translate原点移動

キャンバスを45°回転

画像配置(左上の位置を指定)

restoreによって 回転をもとに戻す

これを繰り返すと

投稿日時: 2025-05-03 14:16:03

最近の投稿

最近のコメント

タグ

アーカイブ

その他