回答編集履歴
2
解決方法の変更
answer
CHANGED
@@ -6,21 +6,23 @@
|
|
6
6
|
```
|
7
7
|
質問文に出てきたこの部分はワークブックではなくワークシートの出力を行っているようです。つまり Template.xlsxファイルの中の一部分しか出力されない。じゃあ Workbook.Saveならどうだとやってみましたが、今度はワークブックの基本情報だけ出力されて、ワークシートが出力されない。しばらく調べてみたのですが、どうにも全体をMemoryStreamに書き出す方法が見つからない。
|
8
8
|
|
9
|
-
開いたファイルを書き換えるのは普通にできるので、ファイルの代わりに
|
9
|
+
開いたファイルを書き換えるのは普通にできるので、ファイルの代わりにMemoryStreamから開いてみたらどうだろうとやってみたら出来ました。
|
10
|
-
```
|
10
|
+
```C#
|
11
|
+
// テンプレートファイルのパス
|
11
|
-
|
12
|
+
var filename = Server.MapPath("~/App_Data/Template.xlsx");
|
12
|
-
Dim inStream = New System.IO.FileStream(filename, FileMode.Open)
|
13
|
-
Dim ioStream = New BufferedStream(inStream)
|
14
13
|
|
14
|
+
// ファイルをMemoryStreamに読み込み
|
15
|
+
var bytes = System.IO.File.ReadAllBytes(filename);
|
16
|
+
using (MemoryStream ms = new MemoryStream(bytes))
|
17
|
+
{
|
18
|
+
// MemoryStream上のExcelドキュメントを開く
|
15
|
-
|
19
|
+
using (SpreadsheetDocument document = SpreadsheetDocument.Open(ms, true))
|
20
|
+
{
|
16
|
-
|
21
|
+
// 編集する
|
17
|
-
|
22
|
+
}
|
18
23
|
|
19
|
-
|
24
|
+
return File(ms.ToArray(), "application/ms-excel", "ダウンロード時のファイル名.xlsx");
|
20
|
-
Dim bytes(size) As Byte
|
21
|
-
|
25
|
+
}
|
22
|
-
ioStream.Read(bytes, 0, size)
|
23
|
-
Dim outStream = New MemoryStream(bytes)
|
24
26
|
```
|
25
27
|
|
26
|
-
これなら Template.xlsx を読み込んで、編集して、
|
28
|
+
これなら Template.xlsx を読み込んで、編集して、送信する、ということができそうですがどうでしょうか?
|
1
解決策が見つかったので
answer
CHANGED
@@ -6,19 +6,21 @@
|
|
6
6
|
```
|
7
7
|
質問文に出てきたこの部分はワークブックではなくワークシートの出力を行っているようです。つまり Template.xlsxファイルの中の一部分しか出力されない。じゃあ Workbook.Saveならどうだとやってみましたが、今度はワークブックの基本情報だけ出力されて、ワークシートが出力されない。しばらく調べてみたのですが、どうにも全体をMemoryStreamに書き出す方法が見つからない。
|
8
8
|
|
9
|
-
開いたファイルを書き換えるのは普通にできるので、
|
9
|
+
開いたファイルを書き換えるのは普通にできるので、ファイルの代わりにBufferedStreamから開いてみたらどうだろうとやってみたら出来ました。ソースがVBなのは申し訳ないですが。
|
10
|
-
```
|
10
|
+
```VB.NET
|
11
|
-
|
11
|
+
Dim filename = Server.MapPath("~/App_Data/Template.xlsx")
|
12
|
-
|
12
|
+
Dim inStream = New System.IO.FileStream(filename, FileMode.Open)
|
13
|
-
|
13
|
+
Dim ioStream = New BufferedStream(inStream)
|
14
|
-
```
|
15
|
-
読み込むのはうまくいきましたが、documentを閉じる時点で「MemoryStreamには書き込みできない」と例外が発生したのでこの方法もダメ。
|
16
14
|
|
15
|
+
Using document As SpreadsheetDocument = SpreadsheetDocument.Open(ioStream, True)
|
17
|
-
|
16
|
+
'この中で編集する
|
18
|
-
0. Template.xlsx を一時ファイルとしてコピーする。
|
19
|
-
1. 一時ファイルを Open XML SDK で開いて、編集して、保存する。
|
20
|
-
|
17
|
+
End Using
|
21
18
|
|
22
|
-
|
19
|
+
Dim size = CType(ioStream.Length, Integer)
|
20
|
+
Dim bytes(size) As Byte
|
21
|
+
ioStream.Position = 0
|
22
|
+
ioStream.Read(bytes, 0, size)
|
23
|
+
Dim outStream = New MemoryStream(bytes)
|
24
|
+
```
|
23
25
|
|
24
|
-
|
26
|
+
これなら Template.xlsx を読み込んで、編集して、MemoryStreamに書き出して、送信する、ということができそうですがどうでしょうか?
|