質問: (WorksheetPart)(wbPart.GetPartById(targetSheet.Id)); /* * ここでいろいろExcelファイルを編集する */ wsPart.Worksheet.Save(); } return File(ms.ToArray(), "application/ms-excel", "ダウンロード時のファイル名.xlsx"); } } ```
回答: どうやら teratail には Open XML SDK の利用者がいないようなので、導入して少し調べてみました。 ``` // ワークブックを保存 wsPart.Worksheet.Save(ms); ``` 質問文に出てきたこの部分はワークブックではなくワークシートの出力を行っているようです。つまり Template.xlsxファイルの中の一部分しか出力されない。じゃあ Workbook.Saveならどうだとやってみましたが、今度はワークブックの基本情報だけ出力されて、ワークシートが出力されない。しばらく調べてみたのですが、どうにも全体をMemoryStreamに書き出す方法が見つからない。 開いたファイルを書き換えるのは普通にできるので、ファイルの代わりにMemoryStreamから開いてみたらどうだろうとやってみたら出来ました。 ``` // テンプレートファイルのパス var filename = Server.MapPath("~/App_Data/Template.xlsx"); // ファイルをMemoryStreamに読み込み var bytes = System.IO.File.ReadAllBytes(filename); using (MemoryStream ms = new MemoryStream(bytes)) { // MemoryStream上のExcelドキュメントを開く using (SpreadsheetDocument document = SpreadsheetDocument.Open(ms, true)) { // 編集する } return File(ms.ToArray(), "application/ms-excel", "ダウンロード時のファイル名.xlsx"); } ``` これなら Template.xlsx を読み込んで、編集して、送信する、ということができそうですがどうでしょうか?