エクセルファイルを新規作成&読み込み&編集する方法【C#】【Mac】【Visual Studio】

今回はエクセルファイルを作成してデータを入れて保存することができるプログラムを作成します。手順は以下の通りです。

1.Visual Studio for Macを起動し、プロジェクト「ExcelOperation」を作成する

スクリーンショット 2021-03-13 20.09.55

2.ソリューションエクスプローラのプロジェクト名の上で右クリックし、追加>新しいクラスを選択する

スクリーンショット 2021-03-13 20.13.18

3.General>空のクラスを選択し、CreateNewBook.csを作成する。

スクリーンショット 2021-03-13 20.14.34

4.下記のコードを入力し、保存する。(赤線が出るが、気にしない)

using System;
using System.Linq;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
namespace ExcelOperation
{
   public class CreateNewBook
   {
       public static void CreateExcelFile()
       {
           const string CreateFilePath = "/Users/mocuramichi/";
           //作成するExcelファイルの名前を設定しておく
           DateTime dt = DateTime.Now; //名前に入れる日付データを設定しておく
           string ExcelBookFileName = "出力データ" + dt.ToString("yyyyMMddHHmmss") + ".xlsx";
           //作成するエクセルファイルの絶対パスを設定する
           string ExcelFilePath = CreateFilePath + ExcelBookFileName;

           // Excelファイルを作る
           using (SpreadsheetDocument spreadsheetDocument
             = SpreadsheetDocument.Create(ExcelFilePath, SpreadsheetDocumentType.Workbook))
           {

               // ワークブックを用意し、ワークシートを追加する
               WorkbookPart workbookpart = spreadsheetDocument.AddWorkbookPart();
               workbookpart.Workbook = new Workbook();
               WorksheetPart worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
               worksheetPart.Worksheet = new Worksheet(new SheetData());
               Sheets sheets
                 = spreadsheetDocument.WorkbookPart.Workbook.AppendChild<Sheets>(new Sheets());
               //シートを追加する
               Sheet sheet = new Sheet()
               {
                   Id = spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
                   SheetId = 1,
                   Name = "サンプルシート" //シート名を設定する
               };
               sheets.Append(sheet);

               Console.WriteLine("ワークシートを追加しました。");

               // 後述(1)(セルを追加)
               //セルA1をワークシートに追加する
               Cell cellA1 = InsertCellInWorksheet("A", 1, worksheetPart);
               //セルA1に数字をセットする
               cellA1.CellValue = new CellValue("10");
               cellA1.DataType = new EnumValue<CellValues>(CellValues.Number);

               // セルA2をワークシートに追加する
               Cell cellA2 = InsertCellInWorksheet("A", 2, worksheetPart);
               // セルA2に数字をセットする
               cellA2.CellValue = new CellValue("20");
               cellA2.DataType = new EnumValue<CellValues>(CellValues.Number);

               // セルA3をワークシートに追加する
               Cell cellA3 = InsertCellInWorksheet("A", 3, worksheetPart);
               // セルA3に数式をセットする
               cellA3.CellFormula = new CellFormula("=SUM(A1, A2)");

               Console.WriteLine("セルを3つ追加しました。");

               // ワークブックを保存する
               workbookpart.Workbook.Save();
           }
           Console.WriteLine("Excelファイルを保存しました。");
       }

       //位置を指定してセルを追加するメソッド
       private static Cell InsertCellInWorksheet(string columnName, uint rowIndex, WorksheetPart worksheetPart)
       {
           Worksheet worksheet = worksheetPart.Worksheet;
           SheetData sheetData = worksheet.GetFirstChild<SheetData>();
           string cellReference = columnName + rowIndex.ToString();

           // 指定された位置のRowオブジェクト
           Row row
             = sheetData.Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex);
           if (row == null)
           {
               // Rowオブジェクトがまだ存在しないときは作る
               row = new Row() { RowIndex = rowIndex };
               sheetData.Append(row);
           }

           // 指定された位置のCellオブジェクト
           Cell refCell
             = row.Elements<Cell>().FirstOrDefault(c =>
                 c.CellReference.Value == cellReference);
           if (refCell != null)
               return refCell; // すでに存在するので、それを返す

           // Cellオブジェクトがまだ存在しないときは作って挿入する
           Cell nextCell
             = row.Elements<Cell>().FirstOrDefault(c =>
                 string.Compare(c.CellReference.Value, cellReference, true) > 0);
           Cell newCell = new Cell() { CellReference = cellReference };
           row.InsertBefore(newCell, nextCell);

           worksheet.Save();
           return newCell;
       }

   }
}

5.ソリューションエクスプローラのプロジェクト名の上で右クリックし、追加>NuGetパッケージ(P)...を選択する

スクリーンショット 2021-03-13 20.21.58

6.右上の検索欄に「DocumentFormat.OpenXml」と入力し、検索結果のDocumentFormat.OpenXmlにチェックを入れ「パッケージの追加」ボタンを押下する。追加するとソースコードの赤線が消える。

スクリーンショット 2021-03-13 20.24.39

7.プロジェクトで動作するメインメソッドに以下のコードを追加し、保存する。

//エクセルファイルを作成する
CreateNewBook.CreateExcelFile();

8.プロジェクトをビルドして実行する。CreateFilePathで指定したパス(/Users/mocuramichi/)にExcelBookFileNameで指定したファイル名("出力データ" + dt.ToString("yyyyMMddHHmmss") + ".xlsx")のエクセルファイルが作成される。

スクリーンショット 2021-03-13 20.30.15

9.エクセルファイルを開くとデータが入っていることが確認できる。

スクリーンショット 2021-03-13 20.31.52

~プラスα~
同じ要領で以下のソースコード①のクラス「OpenBook.cs」を追加し、プロジェクトで動作するメインメソッドに以下のコード②を追加するとExcelFilePathで指定したパスのファイルを読み込み、編集することができます。

ソースコード①

using System;
using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;

namespace ExcelOperation
{
   public class OpenBook
   {
       public OpenBook()
       {
       }

       public static void UpdateExcelFile()
       {
           //編集するエクセルファイルの絶対パスを設定する
           const string ExcelFilePath = "/Users/moguramichi/test.xlsx";
           // Excelファイルを開く
           using (SpreadsheetDocument spreadsheetDocument
             = SpreadsheetDocument.Open(ExcelFilePath, true,
                                         new OpenSettings { AutoSave = false, }))
           {
               Console.WriteLine("Excelファイルを開きました。");

               // シート名からWorksheetオブジェクトを取得する
               WorkbookPart workbookpart = spreadsheetDocument.WorkbookPart;
               Sheet sheet = workbookpart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>()
                               .FirstOrDefault(s => s.Name == "サンプルシート");
               string relationshipId = sheet.Id.Value;
               WorksheetPart worksheetPart
                 = (WorksheetPart)workbookpart.GetPartById(relationshipId);
               Worksheet worksheet = worksheetPart.Worksheet;

               // 位置を指定してセルを取得する
               Cell cellA1 = GetSpreadsheetCell(worksheet, "A", 1);
               Cell cellA2 = GetSpreadsheetCell(worksheet, "A", 2);
               Cell cellA3 = GetSpreadsheetCell(worksheet, "A", 3);

               // セルの内容を読み取る
               Console.WriteLine($"A1: {cellA1.CellValue?.Text}");
               // 出力:A1: 10
               Console.WriteLine($"A2: {cellA2.CellValue?.Text}");
               // 出力:A2: 20
               Console.WriteLine($"A3(値): {cellA3.CellValue?.Text}");
               Console.WriteLine($"A3(数式): {cellA3.CellFormula?.Text}");
               // 出力:A3(値):
               // 出力:A3(数式): =SUM(A1, A2)

               // セルA1の値を書き換える
               cellA1.CellValue = new CellValue("15");

               Console.WriteLine($"A1の値を{cellA1.CellValue.Text}に書き換えました。");
               // 出力:A1の値を15に書き換えました。

               // 保存する
               worksheet.Save();
           }
       }

       //位置を指定してセルを取得するメソッド
       private static Cell GetSpreadsheetCell(Worksheet worksheet, string columnName, uint rowIndex)
       {
           string cellReference = columnName + rowIndex.ToString();
           Row row
             = worksheet.GetFirstChild<SheetData>().Elements<Row>()
                 .FirstOrDefault(r => r.RowIndex == rowIndex);
           Cell cell
             = row?.Elements<Cell>()
                 .FirstOrDefault(c => c.CellReference.Value == cellReference);
           return cell;
       }
   }
}

ソースコード②

//エクセルファイルを編集&保存する
OpenBook.UpdateExcelFile();

本記事は下記のサイトを参考に作らせていただきました。



この記事が気に入ったらサポートをしてみませんか?