- PR -

【ASP.NET】Webサーバ側で複数Excelを圧縮したい

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-22 16:39
ASP.NET(VB.NET)で開発しています。

クライントからボタンが押されたタイミングで、
Webサーバ上にある複数のExcelファイルをZIP形式で圧縮して1つのファイルにし、そのファイルをクライアント側にダウンロードさせるような仕組みを考えております。

http://www.atmarkit.co.jp/fdotnet/dotnettips/361aspzipfile/aspzipfile.html

で、やり方は分かったのですが、上記ページの例ではテキストファイルを読み込み、バイト配列に出力していますが、私の場合、既に存在するExcelファイルをそのまま圧縮したいので、どのように変更すればよいのか困っています。

zipStream.write の第1引数はバイト配列であることから、既存Excelファイルをバイト配列にセットし直さないといけないのでしょうか・・・

何かヒントでもいただけると幸いです。よろしくお願い致します。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-22 16:57
引用:

ひろれいさんの書き込み (2006-03-22 16:39) より:

私の場合、既に存在するExcelファイルをそのまま圧縮したいので、
どのように変更すればよいのか困っています。


ふむ、J# の ZipOutputStream ですか。

zipStream.putNextEntry メソッドで ZipEntry のインスタンスを加えていくことになるかな。
Reader でファイルの中身を読み取り、Writer で zipStream を指定して Write していく。

試したいところなんですが、環境がないので試せません。
多分、こんな感じでしょうということで。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-22 17:36
じゃんぬさん、お返事ありがとうございます。
引用:

じゃんぬねっとさんの書き込み (2006-03-22 16:57) より:

zipStream.putNextEntry メソッドで ZipEntry のインスタンスを加えていくことになるかな。
Reader でファイルの中身を読み取り、Writer で zipStream を指定して Write していく。

試したいところなんですが、環境がないので試せません。
多分、こんな感じでしょうということで。



すいません。あまりイメージが湧かないもので・・・
こんな感じなのでしょうか。

Dim zipStream As New ZipOutputStream(New FileOutputStream(Server.MapPath(ZIPファイル名)))
圧縮したいExcelファイルがある間、以下の処理を行なう。
Dim zEntry As New ZipEntry(Excelファイル名)
zEntry.setMethod(ZipOutputStream.DEFLATED)
  zipStream.putNextEntry(zEntry)

  ExcelファイルをOPEN
  Excelファイルにデータがある間、以下の処理を行なう。
    Excelファイルからデータを読み込む
    zipStream.write(読み込んだデータ)
  ここまで繰り返し
  ExcelファイルをCLOSE
  zipStream.closeEntry()
ここまで繰り返し
zipStream.flush()
zipStream.close()

イメージ出来てますか?
この場合、ExcelファイルはバイナリモードでOPENしなければいけないんですよね?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-22 17:59
引用:

ひろれいさんの書き込み (2006-03-22 17:36) より:

イメージ出来てますか?


ええ、そんな感じだと思います。
Entry は Close しなくて良かったかな? > closeEntry();

引用:

この場合、ExcelファイルはバイナリモードでOPENしなければいけないんですよね?


ですかね、このあたりは試してみてください。(試したことがないのでワカリマセンw)

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-23 11:51
引用:

じゃんぬねっとさんの書き込み (2006-03-22 17:59) より:

ですかね、このあたりは試してみてください。(試したことがないのでワカリマセンw)



早速試しているのですが、どうもうまく読み込めません。単純に、
コード:
Dim s_Script As New System.Text.StringBuilder
Dim i_FileNo As Integer
Dim s_ExcelData As String

s_Script.Append("C:\\報告書_200603.xls")
i_FileNo = FreeFile()

FileOpen(i_FileNo, s_Script.ToString, OpenMode.Binary)
Do Until EOF(i_FileNo)
  FileGet(i_FileNo, s_ExcelData)
  zipStream.write(s_ExcelData)
Loop
FileClose(i_FileNo)
zipStream.closeEntry()
zipStream.flush()


とすると、FileGet時に読み込む「s_ExcelData」がNothingになり、無限ループに陥ります(;_;)

FileGetして取得したデータは、バイト配列に設定する必要があるのでしょうか?
と言うより、ExcelファイルからFileGetでデータを取得できるのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-23 12:15
引用:

ひろれいさんの書き込み (2006-03-23 11:51) より:

FileGet時に読み込む「s_ExcelData」がNothingになり、無限ループに陥ります(;_;)


FileGet ときましたか... (;^-^)
BufferedInputStream などを使いましょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-23 14:26
引用:

じゃんぬねっとさんの書き込み (2006-03-23 12:15) より:

FileGet ときましたか... (;^-^)
BufferedInputStream などを使いましょう。



じゃんぬさん、ご指摘ありがとうございます(^o^)
BufferedInputStream を勉強しまして、以下のページを参考にソースを変更しましたが、やはりうまくいきません。
[参考]http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13200&forum=7

コード:
Dim ls_Script3 As New System.Text.StringBuilder
Dim filename As String = "data\\" & Session.SessionID & ".zip"

ls_Script3.Append("C:\\報告書_200603.xls")

Dim fis As New java.io.FileInputStream(ls_Script3.ToString)
Dim bis As New java.io.BufferedInputStream(fis)
Dim zipStream As New ZipOutputStream(New FileOutputStream(Server.MapPath(filename)))

Dim zEntry As New ZipEntry(ls_Script3.ToString)
zEntry.setMethod(ZipOutputStream.DEFLATED)
zipStream.putNextEntry(zEntry)

Dim buf(4096) As SByte
Dim li_byteCount As Integer

While (li_byteCount = bis.read(buf, 0, buf.Length)) > -1
   zipStream.write(buf, 0, li_byteCount)
End While

zipStream.closeEntry()
zipStream.flush()
zipStream.close()


やはり、While内でループしてしまいます。
データの取得方法が間違っているのでしょうか?
<li_byteCount=0、buf.Length=4097>
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-03-23 14:48
怒られる前に、訂正します。
引用:

ひろれいさんの書き込み (2006-03-23 14:26) より:

While (li_byteCount = bis.read(buf, 0, buf.Length)) > -1
   zipStream.write(buf, 0, li_byteCount)
End While



そりゃ、動きません(^_^;)
以下のように修正しました。
コード:
Do
   li_Len = bis.read(buf, 0, buf.Length)
   If li_Len = -1 Then Exit Do
   zipStream.write(buf, 0, li_byteCount)
Loop


修正したところ、処理は終了しましたが、作成されたZIPファイルの中身は空でした。read もしくは write で失敗しているってことでしょうか。もう少し調べてみます。

スキルアップ/キャリアアップ(JOB@IT)