Open XML SDK の解決策:Excel セルを更新する方法は?
以下に示します:
Open XML SDK を使用して Excel のスプレッドシートのセルを更新しようとしています:
test.xlsx
using System.Linq;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
namespace DotNetSandbox.SO
{
public class CellUpdating
{
public static void Update()
{
using SpreadsheetDocument doc = SpreadsheetDocument.Open(@"c:temptest.xlsx", true);
Sheet sheet = doc.WorkbookPart.Workbook.Descendants<Sheet>().First();
WorksheetPart wsPart = (WorksheetPart)doc.WorkbookPart.GetPartById(sheet.Id);
Cell cell = wsPart.Worksheet.Descendants<Cell>().First(c => c.CellReference == "A2");
cell.CellValue = new CellValue("new");
wsPart.Worksheet.Save();
}
}
}
これによりセルが更新されますが、Excel アプリによる回復後にのみ:
環境:
- DocumentFormat.OpenXml:2.13.0
- Excel:Microsoft 265 MSO (16.0.14026.20270) 64 ビット
私は何を間違っていますか?
Excel は、インライン文字列の代わりに SharedStrings を使用することを好みます。
Cell.DataType == EnumValue<CellValues>(CellValues.SharedString)
の場合 SharedString を追加せずに CellValue を置き換えることはできません。
これを修正する最も簡単な方法は、DataType をインライン文字列 (別名:CellValues.String) に切り替えてから、文字列値を割り当てることです:
cell.DataType = new EnumValue<CellValues>(CellValues.String);
cell.CellValue = new CellValue("new");
Excel はロード時にインライン文字列を共有文字列に書き換えることに注意してください。これは、変更を加えずに保存する前後のファイルがまったく同じであると予想される場合に注意する必要があります。