C# .NET6 macOS Excel読込 / 書込

C# .NET6 macOS Excel読込 / 書込

C# .NET6でExcelファイルを読書する場合NPOIと云うパッケージあります。NPOInugetで公開されていて、dotnetの「add package」コマンドを使えば簡単に利用できます。「add package」は下記のようにターミナルから実行します。

dotnet add package NPOI --version 2.5.5

Excelファイルを読み込んでセル内の文字列を取得

macOSのOffice365からExcelでファイル新規作成しました。ファイル名は「Book1.xlsx」です。セルA1に「ジュアン・リコ」という文字列を入れました。

Excelファイルを新規作成しBook1で保存
Excelファイルを新規作成しBook1.xlsxで保存

セルA1に入れた文字列をC# .NET6で取り出すコード例です。

using NPOI.XSSF.UserModel;
var book = new XSSFWorkbook("Book1.xlsx");
var sheet = book.GetSheet("Sheet1");
var row = sheet.GetRow(0);
var cell = row.GetCell(0);
Console.WriteLine(cell.StringCellValue);

最後の StringCellValueに「ジュアン・リコ」が入っていました。

VSCodeデバッグ実行
VSCodeデバッグ実行

コード例はシンプルに書いていますが、sheetをGetRow()やGetCell()する場合は、その行に何も入っていなければ問答無用でnullが入ります。nullチェックなどの処理は必要かと思います。

Excelファイルにデータ入れて保存

読み込んだ先程のExcelファイルのセルA1を書き換えて保存したい場合はStringCellValue()を使います。上のコードに下記を追記します

if (cell != null){
    cell.SetCellValue("ロジャー・ヤング");
}

Write()を実行するとセルA1の変更された内容が保存されます。

book.Write(new FileStream("Book2.xlsx",FileMode.OpenOrCreate));

Book2.xlsxというファイル名で保存しました。Book1で保存しなかった理由は、Office365で新規作成したExcelファイルに上書きするとデータがキレイに書けていないようでExcelで開くと下記のようなメッセージがでました。別ファイルで保存するとその後Excelで開くことも成功しました。

上書きするとExcelファイルが壊れた
上書きするとExcelファイルが壊れた

他の行やセルにデータを入れたい場合はGetRow()でnullが返るのでCreateRow()したあとCreateCell()する必要があります。

var row1 = sheet.CreateRow(1);
row1.CreateCell(0).SetCellValue("キャンプ・カリー");

C# .NET6 macOS 時間の「分・秒」以降を0にする

C# DateTime Ticks計算

Windows 時代からPCを使っているひとは 流行りのスクリプト言語よりC#で書いたほうが楽もしくは安心だと思います。わたしもmacOSを使うようになって簡単なプログラムならPythonNode.jsで書いていましたが.NET6が安定して動くので最近はC#言語macOSで使うようになりました。

C#のDateTime型で「分・秒・㍉秒」などを0にしたい場合、方法はいろいろあると思いますがわたしの場合下記2つの方法を使っています。

新しくDateTimeを作る

DateTimeのコンストラクタの中に「DateTime(int year, int month, int day, int hour, int minute, int second)」があるのでそれを使います。下のコード例では年月日時以降は0に設定しています。

var d1 = DateTime.Now;
d1 = new DateTime(d1.Year, d1.Month, d1.Day, d1.Hour, 0,0);
Console.WriteLine(d1);

DateTimeのTicksで計算

TimeSpanで、1時間出してその後 Ticksを 剰余演算(%) します。

その後、AddTicksしています。

var ts1 = TimeSpan.FromHours(1);
var d1 = DateTime.Now;
var tt1 = d1.Ticks % ts1.Ticks;
d1 = d1.AddTicks(- tt1);
Console.WriteLine(d1);

Ticksが 637 791 516 000 000 000 計算されました。

内部では GetTickCount64() が使われているのかな?よくわからない

Excel VBA While 繰返し処理 書き方

Excel VBA While文 コード例

Excel VBAで While 文を使った繰返し処理の書き方です。While は、下記コード例のように「While と Wend」間で処理を記述します。

Sub test()
    Dim i As Integer
    i = 1
    While i <= 100   ' i が100以内ならくり返す
        i = i + 1  ' i は1個づつ足されていく
    Wend
    Worksheets("Sheet1").Cells(1, 1).Value = i
End Sub

上記コードの場合 While〜Wendが1〜100まで繰り返され最後に iの中身をセルに書いています。セルには「101」が入ります。

VBAWhile文を使い九九表を作成するコード例です。

Sub kuku()
    Dim nodan As Integer   '○○の段
    Dim row As Integer      ' 行
    Dim kotae As Integer   ' 答え
    nodan = 1
     While nodan <= 9  '1 の段から9の段
        row = 1
        While row <= 9  '1行目〜9行目まで
            kotae = nodan * row '99の計算(掛け算)
            Worksheets("Sheet1").Cells(row, nodan).Value = Str(nodan) & "×" & Str(row) & "=" & Str(kotae)
             If nodan Mod 2 = 0 Then '段が偶数の場合
                Worksheets("Sheet1").Cells(row, nodan).Interior.Color = RGB(235, 240, 235) 'セルの背景色を変更する
             End If
             row = row + 1
        Wend
        nodan = nodan + 1
     Wend
End Sub
Excel VBA While〜Wend 実行結果