エクセルファイルを新規作成&読み込み&編集する方法【C#】【Mac】【Visual Studio】
今回はエクセルファイルを作成してデータを入れて保存することができるプログラムを作成します。手順は以下の通りです。
1.Visual Studio for Macを起動し、プロジェクト「ExcelOperation」を作成する
2.ソリューションエクスプローラのプロジェクト名の上で右クリックし、追加>新しいクラスを選択する
3.General>空のクラスを選択し、CreateNewBook.csを作成する。
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)...を選択する
6.右上の検索欄に「DocumentFormat.OpenXml」と入力し、検索結果のDocumentFormat.OpenXmlにチェックを入れ「パッケージの追加」ボタンを押下する。追加するとソースコードの赤線が消える。
7.プロジェクトで動作するメインメソッドに以下のコードを追加し、保存する。
//エクセルファイルを作成する
CreateNewBook.CreateExcelFile();
8.プロジェクトをビルドして実行する。CreateFilePathで指定したパス(/Users/mocuramichi/)にExcelBookFileNameで指定したファイル名("出力データ" + dt.ToString("yyyyMMddHHmmss") + ".xlsx")のエクセルファイルが作成される。
9.エクセルファイルを開くとデータが入っていることが確認できる。
~プラスα~
同じ要領で以下のソースコード①のクラス「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();
本記事は下記のサイトを参考に作らせていただきました。
この記事が気に入ったらサポートをしてみませんか?