回転せずに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

Nuget

ClosedXMLをインストール

ファイルを開いてシート名をすべて表示

using ClosedXML.Excel;

try
{
    var filePath = @"c:\temp\Sample.xlsx";
    using (var workbook = new XLWorkbook(filePath))
    {
        Console.WriteLine($"シート数: {workbook.Worksheets.Count}");

        foreach (var sheet in workbook.Worksheets)
        {
            Console.WriteLine($"シート名: {sheet.Name}");
        }
    }
}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}

Excelを開いていると、ファイルオープン時にエラーになるので・・・

読み取り専用で開く場合は、ClosedXML自体には機能がないので

FileStreamで読み取り専用で開いてそれを使って開くとよい

using ClosedXML.Excel;

try
{
    var filePath = @"c:\temp\Sample.xlsx";

    // 読み取りで開き、他ファイルは読み書きOKとする
    using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
    {
        using (var workbook = new XLWorkbook(fileStream))
        {
            Console.WriteLine($"シート数: {workbook.Worksheets.Count}");

            foreach (var sheet in workbook.Worksheets)
            {
                Console.WriteLine($"シート名: {sheet.Name}");
            }
        }
    }

}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}

Excelで開いている間にClosedXMLで開くとエラーになるが、
CLosedXMLで開いている間にExcelは開くことが可能なので、処理して保存する際にエラーとなる可能性はある。
そういうケースを気にするのであれば、FileStreamで排他制御する必要あり。

using ClosedXML.Excel;

try
{
    var filePath = @"c:\temp\Sample.xlsx";

    // 読み書き開き、他ファイルは読み書き禁止とする
    using (var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
    {
        using (var workbook = new XLWorkbook(fileStream))
        {
            Console.WriteLine($"シート数: {workbook.Worksheets.Count}");

            foreach (var sheet in workbook.Worksheets)
            {
                Console.WriteLine($"シート名: {sheet.Name}");
            }
        }
    }

}
catch(Exception ex)
{
    Console.WriteLine(ex.Message);
}

セルの操作

A1形式でアクセス

worksheet.Cell(2, "C").value

行列でアクセス

worksheet.Cell(2, 3).value
投稿日時: 2025-04-24 13:23:24
更新日時: 2025-04-24 13:43:24

Explorerのツリーでフォルダ内にフォルダが一つしかないとき
デフォルトだとコンパクトに表示するために1行で表示されます

例えば、各フォルダに1つずつA B C Dというフォルダがある場合

こんな表示になります

階層ごとに分けて表示してほしいので、設定変更します

歯車マークから、Settingsを開き、 compact folders で検索します
Explorer: Compact Foldersのチェックを外します

1行1フォルダずつ表示します

投稿日時: 2025-04-18 15:45:18

最近の投稿

タグ

アーカイブ

その他