###[openXML]ASP.NETでダウンロードさせたExcelが開けない。
Templateに追記したファイルをダウンロードさせるため、
まず編集せずにダウンロードさせようと思いました。
Excelの操作にはopenXMLを使用しています。
ダウンロードはできましたが、肝心のファイルが開けませんでした。ご教示ください。
###発生している問題・エラーメッセージ
ダウンロードしたファイルを開こうとすると以下のエラーが発生します。
Excelでファイル'ダウンロードファイル名.xlsx'を開くことができません。 ファイル形式またはファイル拡張子が正しくありません。 ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。
###該当のソースコード
C#
1public ActionResult DownloadExcel() 2{ 3 // xlsxドキュメントを開く。 4 // 第2引数:編集するかどうか。 5 using (SpreadsheetDocument document = SpreadsheetDocument.Open(Server.MapPath("~/App_Data/Template.xlsx"), true)) 6 using(MemoryStream ms = new MemoryStream()) 7 { 8 // Workbookにアクセス。 9 WorkbookPart wbPart = document.WorkbookPart; 10 11 // シート情報を取得 12 Sheet targetSheet = document.WorkbookPart.Workbook.Sheets.Elements<Sheet>().First(); 13 if (targetSheet == null) 14 { 15 return null; 16 } 17 18 // シート情報からIDを取得し、WorksheetPartを得る 19 WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(targetSheet.Id)); 20 21 // ワークブックを保存 22 wsPart.Worksheet.Save(ms); 23 return File(ms.ToArray(), "application/msexcel", "ダウンロードファイル名.xlsx"); 24 } 25} 26
###試したこと
wsPart.Worksheet.Save(ms)したあとにmsが閉じてしました。
↓を参考にしました。
http://xptn.dtiblog.com/blog-entry-19.html
C#
1wsPart.Worksheet.Save(ms); 2ms.Close(); 3return File(ms.ToArray(), "application/vnd.ms-excel", "ダウンロードファイル名.xlsx");
が、変わらずダウンロードしたファイルは壊れて開けませんでした。
msが閉じていることはあまり関係ないみたいでした。
http://xptn.dtiblog.com/blog-entry-19.html
MemoryStreamを使わずに直接ダウンロードさせたら開けました。
なので、MemoryStreamにドキュメントをセーブした時点で中身が壊れてしまったものだと思われます。
###解決
以下の様にすることでメモリ上でExcelファイルの編集を行い、一時ファイルを作成することなくクライアントにダウンロードさせることができました。
C#
1public ActionResult DownloadExcel() 2{ 3 // テンプレートファイルのパス 4 var templateName = Server.MapPath("~/App_Data/Template.xlsx"); 5 6 // ファイルをbyte配列に変換 7 var byteArray = System.IO.File.ReadAllBytes(templateName); 8 using (MemoryStream ms = new MemoryStream()) 9 { 10 /* 11 * MemoryStreamにbyte配列を書き込む 12 * MemoryStream上にExcelドキュメントができる 13 */ 14 ms.Write(byteArray, 0, (int)byteArray.Length); 15 // MemoryStream上のExcelドキュメントを開く 16 using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(ms, true)) 17 { 18 WorkbookPart wbPart = spreadSheet.WorkbookPart; 19 20 Sheet targetSheet = spreadSheet.WorkbookPart.Workbook.Sheets.Elements<Sheet>().First(); 21 if (targetSheet == null) 22 { 23 return null; 24 } 25 26 WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(targetSheet.Id)); 27 28 /* 29 * ここでいろいろExcelファイルを編集する 30 */ 31 32 wsPart.Worksheet.Save(); 33 } 34 return File(ms.ToArray(), "application/ms-excel", "ダウンロード時のファイル名.xlsx"); 35 } 36}
回答1件
あなたの回答
tips
プレビュー