Excelセルの値をプログラムで更新することは、Excel自動化において最も一般的なタスクの一つです。レポートの生成、データファイルの更新、あるいは一括情報の処理など、どのような場合でも、C#でExcelセルを効率的に更新できることは、アプリケーションにとって非常に重要です。

Excel セルをプログラムで更新する理由
- 📊 動的なレポートを生成する
- 🔄 一括データ更新
- 📈 自動データ処理
- 💼 ビジネスワークフローの自動化
- 🕒 スケジュールされたデータ更新
Openize.OpenXML SDK を使い始める
using Openize.Cells;
using System;
基本的なセルの更新
個々のセルを更新する
using Openize.Cells;
class CellUpdater
{
public static void UpdateSingleCells()
{
using (var workbook = new Workbook("data.xlsx"))
{
var worksheet = workbook.Worksheets[0];
// Update different data types
worksheet.Cells["A1"].PutValue("Updated Text");
worksheet.Cells["B1"].PutValue(12345);
worksheet.Cells["C1"].PutValue(99.99);
worksheet.Cells["D1"].PutValue(DateTime.Now);
worksheet.Cells["E1"].PutValue(true);
// Save changes
workbook.Save();
Console.WriteLine("Cells updated successfully!");
}
}
}
ループで複数のセルを更新する
public static void UpdateMultipleCells()
{
using (var workbook = new Workbook("report.xlsx"))
{
var worksheet = workbook.Worksheets[0];
// Update headers
string[] headers = {"Product", "Price", "Quantity", "Total"};
for (int i = 0; i < headers.Length; i++)
{
worksheet.Cells[$"{GetColumnLetter(i + 1)}1"].PutValue(headers[i]);
}
// Update data rows
string[,] data = {
{"Laptop", "999.99", "5", "4999.95"},
{"Mouse", "25.50", "10", "255.00"},
{"Keyboard", "75.00", "3", "225.00"}
};
for (int row = 0; row < data.GetLength(0); row++)
{
for (int col = 0; col < data.GetLength(1); col++)
{
string cellRef = GetCellReference(row + 2, col + 1);
worksheet.Cells[cellRef].PutValue(data[row, col]);
}
}
workbook.Save();
Console.WriteLine("Multiple cells updated!");
}
}
static string GetCellReference(int row, int col)
{
return $"{GetColumnLetter(col)}{row}";
}
static string GetColumnLetter(int columnNumber)
{
string columnLetter = string.Empty;
while (columnNumber > 0)
{
columnNumber--;
columnLetter = (char)('A' + columnNumber % 26) + columnLetter;
columnNumber /= 26;
}
return columnLetter;
}
高度な更新操作
条件に基づいて更新する
public static void ConditionalUpdate()
{
using (var workbook = new Workbook("sales.xlsx"))
{
var worksheet = workbook.Worksheets[0];
// Read and update based on conditions
for (int row = 2; row <= worksheet.GetRowCount(); row++)
{
string salesValue = worksheet.Cells[$"C{row}"].GetValue();
if (double.TryParse(salesValue, out double sales))
{
// Update status based on sales amount
if (sales > 10000)
{
worksheet.Cells[$"D{row}"].PutValue("High Performer");
}
else if (sales > 5000)
{
worksheet.Cells[$"D{row}"].PutValue("Good");
}
else
{
worksheet.Cells[$"D{row}"].PutValue("Needs Improvement");
}
}
}
workbook.Save();
Console.WriteLine("Conditional updates completed!");
}
}
範囲操作による一括更新
public static void BulkRangeUpdate()
{
using (var workbook = new Workbook("template.xlsx"))
{
var worksheet = workbook.Worksheets[0];
// Update a range of cells with the same value
var range = worksheet.GetRange(1, 1, 1, 5); // A1:E1
range.SetValue("HEADER");
// Update a column with sequential values
for (int row = 2; row <= 10; row++)
{
worksheet.Cells[$"A{row}"].PutValue($"Item {row - 1}");
worksheet.Cells[$"B{row}"].PutValue(row * 100);
}
workbook.Save();
Console.WriteLine("Bulk update completed!");
}
}
実際の例: 従業員データの更新
using Openize.Cells;
using System.Collections.Generic;
public class Employee
{
public string Name { get; set; }
public string Department { get; set; }
public double Salary { get; set; }
public DateTime HireDate { get; set; }
}
public class EmployeeDataUpdater
{
public static void UpdateEmployeeData()
{
var employees = new List<Employee>
{
new Employee { Name = "John Doe", Department = "IT", Salary = 75000, HireDate = new DateTime(2020, 1, 15) },
new Employee { Name = "Jane Smith", Department = "HR", Salary = 65000, HireDate = new DateTime(2019, 3, 20) },
new Employee { Name = "Mike Johnson", Department = "Finance", Salary = 80000, HireDate = new DateTime(2021, 6, 10) }
};
using (var workbook = new Workbook())
{
var worksheet = workbook.Worksheets[0];
worksheet.Name = "Employee Data";
// Set headers
worksheet.Cells["A1"].PutValue("Name");
worksheet.Cells["B1"].PutValue("Department");
worksheet.Cells["C1"].PutValue("Salary");
worksheet.Cells["D1"].PutValue("Hire Date");
worksheet.Cells["E1"].PutValue("Years of Service");
// Update employee data
for (int i = 0; i < employees.Count; i++)
{
int row = i + 2;
var emp = employees[i];
worksheet.Cells[$"A{row}"].PutValue(emp.Name);
worksheet.Cells[$"B{row}"].PutValue(emp.Department);
worksheet.Cells[$"C{row}"].PutValue(emp.Salary);
worksheet.Cells[$"D{row}"].PutValue(emp.HireDate);
// Calculate years of service
int yearsOfService = DateTime.Now.Year - emp.HireDate.Year;
worksheet.Cells[$"E{row}"].PutValue(yearsOfService);
}
workbook.Save("UpdatedEmployeeData.xlsx");
Console.WriteLine("Employee data updated successfully!");
}
}
}
エラー処理のベストプラクティス
public static void SafeUpdateCells(string filePath)
{
try
{
using (var workbook = new Workbook(filePath))
{
var worksheet = workbook.Worksheets[0];
// Validate before updating
if (worksheet.GetRowCount() < 1 || worksheet.GetColumnCount() < 1)
{
Console.WriteLine("Worksheet is empty!");
return;
}
// Safe update with validation
string existingValue = worksheet.Cells["A1"].GetValue();
if (!string.IsNullOrEmpty(existingValue))
{
worksheet.Cells["A1"].PutValue($"Updated: {existingValue}");
}
else
{
worksheet.Cells["A1"].PutValue("New Value");
}
workbook.Save();
Console.WriteLine("Update completed successfully!");
}
}
catch (FileNotFoundException)
{
Console.WriteLine("Excel file not found!");
}
catch (UnauthorizedAccessException)
{
Console.WriteLine("File is locked or you don't have permission!");
}
catch (Exception ex)
{
Console.WriteLine($"Error updating cells: {ex.Message}");
}
}
パフォーマンスのヒント
- バッチ更新:保存する前に複数のセルを更新します
- 範囲を使用する: 一括操作の場合は範囲メソッドを使用します
- ファイルI/Oの最小化: 開く、更新する、保存する、閉じるを1回の操作で実行
- データ型の認識: 適切なPutValueオーバーロードを使用する
結論
Openize.OpenXML SDK を使えば、Excel のセルの値をプログラムで簡単に効率的に更新できます。このライブラリは以下を提供します。
- ✅ 複数のデータ型のサポート
- ✅ 一括更新のための範囲操作
- ✅ 高性能
- ✅ スレッドセーフな操作
- ✅ Excelのインストールは不要 今すぐ Excel の更新を自動化しましょう。