回答編集履歴
2
解決方法の変更
test
CHANGED
@@ -14,38 +14,42 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
開いたファイルを書き換えるのは普通にできるので、ファイルの代わりに
|
17
|
+
開いたファイルを書き換えるのは普通にできるので、ファイルの代わりにMemoryStreamから開いてみたらどうだろうとやってみたら出来ました。
|
18
18
|
|
19
|
-
```
|
19
|
+
```C#
|
20
20
|
|
21
|
-
|
21
|
+
// テンプレートファイルのパス
|
22
22
|
|
23
|
-
|
23
|
+
var filename = Server.MapPath("~/App_Data/Template.xlsx");
|
24
|
-
|
25
|
-
Dim ioStream = New BufferedStream(inStream)
|
26
24
|
|
27
25
|
|
28
26
|
|
29
|
-
|
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
|
-
|
41
|
+
// 編集する
|
42
|
+
|
43
|
+
}
|
34
44
|
|
35
45
|
|
36
46
|
|
37
|
-
|
47
|
+
return File(ms.ToArray(), "application/ms-excel", "ダウンロード時のファイル名.xlsx");
|
38
48
|
|
39
|
-
Dim bytes(size) As Byte
|
40
|
-
|
41
|
-
|
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 を読み込んで、編集して、
|
55
|
+
これなら Template.xlsx を読み込んで、編集して、送信する、ということができそうですがどうでしょうか?
|
1
解決策が見つかったので
test
CHANGED
@@ -14,34 +14,38 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
開いたファイルを書き換えるのは普通にできるので、
|
17
|
+
開いたファイルを書き換えるのは普通にできるので、ファイルの代わりにBufferedStreamから開いてみたらどうだろうとやってみたら出来ました。ソースがVBなのは申し訳ないですが。
|
18
18
|
|
19
|
-
```
|
19
|
+
```VB.NET
|
20
20
|
|
21
|
-
|
21
|
+
Dim filename = Server.MapPath("~/App_Data/Template.xlsx")
|
22
22
|
|
23
|
-
|
23
|
+
Dim inStream = New System.IO.FileStream(filename, FileMode.Open)
|
24
24
|
|
25
|
+
Dim ioStream = New BufferedStream(inStream)
|
26
|
+
|
27
|
+
|
28
|
+
|
25
|
-
SpreadsheetDocument
|
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
|
-
|
51
|
+
これなら Template.xlsx を読み込んで、編集して、MemoryStreamに書き出して、送信する、ということができそうですがどうでしょうか?
|