回答編集履歴

2

解決方法の変更

2016/09/07 07:59

投稿

twck
twck

スコア314

test CHANGED
@@ -14,38 +14,42 @@
14
14
 
15
15
 
16
16
 
17
- 開いたファイルを書き換えるのは普通にできるので、ファイルの代わりにBufferedStreamから開いてみたらどうだろうとやってみたら出来ました。ソースがVBなのは申し訳ないですが。
17
+ 開いたファイルを書き換えるのは普通にできるので、ファイルの代わりにMemoryStreamから開いてみたらどうだろうとやってみたら出来ました。
18
18
 
19
- ```VB.NET
19
+ ```C#
20
20
 
21
- Dim filename = Server.MapPath("~/App_Data/Template.xlsx")
21
+ // テンプレートファイルのパス
22
22
 
23
- Dim inStream = New System.IO.FileStream(filename, FileMode.Open)
23
+ var filename = Server.MapPath("~/App_Data/Template.xlsx");
24
-
25
- Dim ioStream = New BufferedStream(inStream)
26
24
 
27
25
 
28
26
 
29
- Using document As SpreadsheetDocument = SpreadsheetDocument.Open(ioStream, True)
27
+ // ファイルをMemoryStreamに読み込み
30
28
 
31
- 'この中で編集する
29
+ var bytes = System.IO.File.ReadAllBytes(filename);
32
30
 
31
+ using (MemoryStream ms = new MemoryStream(bytes))
32
+
33
+ {
34
+
35
+ // MemoryStream上のExcelドキュメントを開く
36
+
37
+ using (SpreadsheetDocument document = SpreadsheetDocument.Open(ms, true))
38
+
39
+ {
40
+
33
- End Using
41
+ // 編集する
42
+
43
+ }
34
44
 
35
45
 
36
46
 
37
- Dim size = CType(ioStream.Length, Integer)
47
+ return File(ms.ToArray(), "application/ms-excel", "ダウンロード時のファイル名.xlsx");
38
48
 
39
- Dim bytes(size) As Byte
40
-
41
- ioStream.Position = 0
49
+ }
42
-
43
- ioStream.Read(bytes, 0, size)
44
-
45
- Dim outStream = New MemoryStream(bytes)
46
50
 
47
51
  ```
48
52
 
49
53
 
50
54
 
51
- これなら Template.xlsx を読み込んで、編集して、MemoryStreamに書き出して、送信する、ということができそうですがどうでしょうか?
55
+ これなら Template.xlsx を読み込んで、編集して、送信する、ということができそうですがどうでしょうか?

1

解決策が見つかったので

2016/09/07 07:59

投稿

twck
twck

スコア314

test CHANGED
@@ -14,34 +14,38 @@
14
14
 
15
15
 
16
16
 
17
- 開いたファイルを書き換えるのは普通にできるので、MemoryStreamから開いてみたらどうだろうとやってみました。
17
+ 開いたファイルを書き換えるのは普通にできるので、ファイルの代わりにBufferedStreamから開いてみたらどうだろうとやってみたら出来ました。ソースがVBなのは申し訳ないですが。
18
18
 
19
- ```C#
19
+ ```VB.NET
20
20
 
21
- String fn = Server.MapPath("~/App_Data/Template.xlsx");
21
+ Dim filename = Server.MapPath("~/App_Data/Template.xlsx")
22
22
 
23
- MemoryStream ms = new MemoryStream(System.IO.File.ReadAllBytes(fn), True);
23
+ Dim inStream = New System.IO.FileStream(filename, FileMode.Open)
24
24
 
25
+ Dim ioStream = New BufferedStream(inStream)
26
+
27
+
28
+
25
- SpreadsheetDocument document = SpreadsheetDocument.Open(ms, true)
29
+ Using document As SpreadsheetDocument = SpreadsheetDocument.Open(ioStream, True)
30
+
31
+ 'この中で編集する
32
+
33
+ End Using
34
+
35
+
36
+
37
+ Dim size = CType(ioStream.Length, Integer)
38
+
39
+ Dim bytes(size) As Byte
40
+
41
+ ioStream.Position = 0
42
+
43
+ ioStream.Read(bytes, 0, size)
44
+
45
+ Dim outStream = New MemoryStream(bytes)
26
46
 
27
47
  ```
28
48
 
29
- 読み込むのはうまくいきましたが、documentを閉じる時点で「MemoryStreamには書き込みできない」と例外が発生したのでこの方法もダメ。
30
49
 
31
50
 
32
-
33
- というわけで今のところ以下の手順しか思いつきません。
34
-
35
- 0. Template.xlsx を一時ファイルとしてコピーする。
36
-
37
- 1. 一時ファイルを Open XML SDK で開いて、編集して、保存する。
38
-
39
- 2. 保存した一時ファイルを ASP.NET で送信する。
40
-
41
-
42
-
43
- 質問者さんはこの質問の後に [ダウンロードさせた完了した後に一時ファイルを削除したい](https://teratail.com/questions/46821) という質問を上げているので、おそらく同じように一時ファイルを使う手段を考え付いたのだと思いますが・・・
44
-
45
-
46
-
47
- で、解決できなかった分際で何が言いたいかというと「Open XML SDK は習得するのに時間が掛かるので、NPOI や ClosedXML や EPPlus にしませんか?」というと。私は NPOI を使用していますが、これなら Template.xlsx を読み込んで、編集して、MemoryStreamに書き出して、送信する、ということができ。よろければぜひ。
51
+ これなら Template.xlsx を読み込んで、編集して、MemoryStreamに書き出して、送信する、ということができそうでがどうでょうか?