質問編集履歴

8

解決方法

2016/09/07 07:23

投稿

shikasama
shikasama

スコア163

test CHANGED
File without changes
test CHANGED
@@ -119,3 +119,85 @@
119
119
  MemoryStreamを使わずに直接ダウンロードさせたら開けました。
120
120
 
121
121
  なので、MemoryStreamにドキュメントをセーブした時点で中身が壊れてしまったものだと思われます。
122
+
123
+
124
+
125
+ ###解決
126
+
127
+ 以下の様にすることでメモリ上でExcelファイルの編集を行い、一時ファイルを作成することなくクライアントにダウンロードさせることができました。
128
+
129
+ ```C#
130
+
131
+ public ActionResult DownloadExcel()
132
+
133
+ {
134
+
135
+ // テンプレートファイルのパス
136
+
137
+ var templateName = Server.MapPath("~/App_Data/Template.xlsx");
138
+
139
+
140
+
141
+ // ファイルをbyte配列に変換
142
+
143
+ var byteArray = System.IO.File.ReadAllBytes(templateName);
144
+
145
+ using (MemoryStream ms = new MemoryStream())
146
+
147
+ {
148
+
149
+ /*
150
+
151
+ * MemoryStreamにbyte配列を書き込む
152
+
153
+ * MemoryStream上にExcelドキュメントができる
154
+
155
+ */
156
+
157
+ ms.Write(byteArray, 0, (int)byteArray.Length);
158
+
159
+ // MemoryStream上のExcelドキュメントを開く
160
+
161
+ using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(ms, true))
162
+
163
+ {
164
+
165
+ WorkbookPart wbPart = spreadSheet.WorkbookPart;
166
+
167
+
168
+
169
+ Sheet targetSheet = spreadSheet.WorkbookPart.Workbook.Sheets.Elements<Sheet>().First();
170
+
171
+ if (targetSheet == null)
172
+
173
+ {
174
+
175
+ return null;
176
+
177
+ }
178
+
179
+
180
+
181
+ WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(targetSheet.Id));
182
+
183
+
184
+
185
+ /*
186
+
187
+ * ここでいろいろExcelファイルを編集する
188
+
189
+ */
190
+
191
+
192
+
193
+ wsPart.Worksheet.Save();
194
+
195
+ }
196
+
197
+ return File(ms.ToArray(), "application/ms-excel", "ダウンロード時のファイル名.xlsx");
198
+
199
+ }
200
+
201
+ }
202
+
203
+ ```

7

追記の修正

2016/09/07 07:23

投稿

shikasama
shikasama

スコア163

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- ###ASP.NETでダウンロードさせたExcelが開けない。
1
+ ###[openXML]ASP.NETでダウンロードさせたExcelが開けない。
2
2
 
3
3
  Templateに追記したファイルをダウンロードさせるため、
4
4
 

6

追記修正

2016/09/02 08:28

投稿

shikasama
shikasama

スコア163

test CHANGED
File without changes
test CHANGED
@@ -96,20 +96,6 @@
96
96
 
97
97
 
98
98
 
99
- msが閉じていることはあまり関係ないみたいでした。
100
-
101
- http://xptn.dtiblog.com/blog-entry-19.html
102
-
103
-
104
-
105
- MemoryStreamを使わずに直接ダウンロードさせたら開けました。
106
-
107
- なので、MemoryStreamにドキュメントをセーブした時点で中身が壊れてしまったものだと思われます。
108
-
109
-
110
-
111
-
112
-
113
99
  ```C#
114
100
 
115
101
  wsPart.Worksheet.Save(ms);
@@ -121,3 +107,15 @@
121
107
  ```
122
108
 
123
109
  が、変わらずダウンロードしたファイルは壊れて開けませんでした。
110
+
111
+
112
+
113
+ msが閉じていることはあまり関係ないみたいでした。
114
+
115
+ http://xptn.dtiblog.com/blog-entry-19.html
116
+
117
+
118
+
119
+ MemoryStreamを使わずに直接ダウンロードさせたら開けました。
120
+
121
+ なので、MemoryStreamにドキュメントをセーブした時点で中身が壊れてしまったものだと思われます。

5

情報の追加

2016/09/02 08:27

投稿

shikasama
shikasama

スコア163

test CHANGED
@@ -1 +1 @@
1
- ASP.NETでダウンロードさせたExcelが開けない。
1
+ [openXML]ASP.NETでダウンロードさせたExcelが開けない。
test CHANGED
@@ -96,6 +96,20 @@
96
96
 
97
97
 
98
98
 
99
+ msが閉じていることはあまり関係ないみたいでした。
100
+
101
+ http://xptn.dtiblog.com/blog-entry-19.html
102
+
103
+
104
+
105
+ MemoryStreamを使わずに直接ダウンロードさせたら開けました。
106
+
107
+ なので、MemoryStreamにドキュメントをセーブした時点で中身が壊れてしまったものだと思われます。
108
+
109
+
110
+
111
+
112
+
99
113
  ```C#
100
114
 
101
115
  wsPart.Worksheet.Save(ms);

4

情報追加

2016/09/02 08:26

投稿

shikasama
shikasama

スコア163

test CHANGED
File without changes
test CHANGED
@@ -84,6 +84,26 @@
84
84
 
85
85
 
86
86
 
87
+ ```
88
+
87
89
  ###試したこと
88
90
 
89
- wsPart.Worksheet.Save(ms)したあとにmsが閉じてしまっているようです
91
+ wsPart.Worksheet.Save(ms)したあとにmsが閉じてしました
92
+
93
+ ↓を参考にしました。
94
+
95
+ http://xptn.dtiblog.com/blog-entry-19.html
96
+
97
+
98
+
99
+ ```C#
100
+
101
+ wsPart.Worksheet.Save(ms);
102
+
103
+ ms.Close();
104
+
105
+ return File(ms.ToArray(), "application/vnd.ms-excel", "ダウンロードファイル名.xlsx");
106
+
107
+ ```
108
+
109
+ が、変わらずダウンロードしたファイルは壊れて開けませんでした。

3

情報更新

2016/09/01 07:41

投稿

shikasama
shikasama

スコア163

test CHANGED
File without changes
test CHANGED
@@ -82,4 +82,8 @@
82
82
 
83
83
  }
84
84
 
85
+
86
+
85
- ```
87
+ ###試したこと
88
+
89
+ wsPart.Worksheet.Save(ms)したあとにmsが閉じてしまっているようです。

2

using修正

2016/09/01 07:22

投稿

shikasama
shikasama

スコア163

test CHANGED
File without changes
test CHANGED
@@ -40,7 +40,7 @@
40
40
 
41
41
  // 第2引数:編集するかどうか。
42
42
 
43
- using (SpreadsheetDocument document = SpreadsheetDocument.Open(Server.MapPath("~/App_Data/Template.xlsx"), false))
43
+ using (SpreadsheetDocument document = SpreadsheetDocument.Open(Server.MapPath("~/App_Data/Template.xlsx"), true))
44
44
 
45
45
  using(MemoryStream ms = new MemoryStream())
46
46
 

1

説明追加

2016/09/01 03:05

投稿

shikasama
shikasama

スコア163

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,8 @@
3
3
  Templateに追記したファイルをダウンロードさせるため、
4
4
 
5
5
  まず編集せずにダウンロードさせようと思いました。
6
+
7
+ Excelの操作にはopenXMLを使用しています。
6
8
 
7
9
  ダウンロードはできましたが、肝心のファイルが開けませんでした。ご教示ください。
8
10