質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

ASP.NET VB Excelファイルダウンロードにてファイルが壊れる

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 7,615

DgRp_08

score 52

仕事で初めてASP.NETでVB.NETを使用しています。
テキストリンクをクリック後にテンプレートExcelファイルをコピーしてExcelにデータ出力、そしてExcelファイルをダウンロードするよくある機能を実装していますが、ブラウザでダウンロード保存したExcelファイルを開くと下の画像のメッセージが表示されます。

![イメージ説明

「はい」を押下すると「読み取れなかった内容を修復または削除することにより、ファイルを開くことができました」というメッセージが表示され、出力内容自体は問題なく出力されています。

原因も解決方法も分からないのですが、これはどう対処すれば良いのでしょうか。
ちなみに、テンプレート及び出力ファイルには入力規則が設定されていますが試しにそれを省いても解決しませんでした。
セル範囲の名前定義もありますが、そちらも省いても解決されませんでした。
また、ダウンロードして開いたExcelファイルではなくサーバ上に出力された方のExcelファイルは破損せず正常に開くことができます。

参考として細かいところを省いたコードを下記に記載致しますので、ご助力いただければ幸いです。

'==================================================
'asapxA.aspx(呼び出し元)
'==================================================
<a runat="server" id="linkDL" name="linkDL" href="#dummy" onclick="return linkDL_Click">
  Download
</a>
'// [javaScript]
function linkDl_Click(){
  var returnVal = window.showModalDialog(
    "aspxB.aspx", "_self"
  );

 '// 取得データが有る場合
  if(typeof returnVal != 'undefind' && returnVal != '' {
    window.open('DownLoad.aspx?path=' + returnVal, 'DownLoad');
  }
  return false;
}


'==================================================
'aspxB.aspx
'==================================================
'// JavaScript
function funcOnLoad() {
  window.returnValue = document.getElementById("hdn_DownloadPath").value;
  window.close();
}

<body onload="funcOnLoad()">
  <form id="aspxB" runat="server">
    <asp:HiddenField runat="server" ID="hdn_DownloadPath">
  </form>
</body>


'--------------------------------------------------
'aspxB.aspx.vb(aspxB.aspxから呼び出される)
'--------------------------------------------------
Dim strNewName As string  '// 出力ファイル名
Dim strTempPath As string  '// テンプレートパス
Dim strOutputPath As string '// 出力先パス
Dim xlApp As Excel.Application
Dim wkBook As Excel.WorkBook
Dim wkSheet As Excel.WorkSheet

' [代入記述省略]

System.IO.File.Copy(strTempPath,strOutputPath)
xlApp = CreateObject("Excel.Application")
wkBook = xlApp.WorkBooks.Open(strOutputPath)
wkSheet = wkBook.WorkSheets("Sheet1")  '// 実際は名前設定済の9シートが存在しています

' [DBデータ取得(処理詳細省略)]
' [指定シート、指定セルへデータを出力(処理詳細省略)]
' [入力規則の設定(処理詳細省略)]

System.Runtie.InteropServices.Marshal.ReleaseComObject(wkSheet)
wkBook.Close(SaveChanges:=True)
System.Runtie.InteropServices.Marshal.ReleaseComObject(wkBook)
System.Runtie.InteropServices.Marshal.ReleaseComObject(xlApp)
wkSheet = Nothing
wkBook = Nothing
xlApp = Nothing
GC.Collect()
Me.hdn_DownloadPath.Value = newFileName


'==================================================
'DownLoad.aspx
'==================================================
Dim strDownloadPath As string

strDownloadPath = Request.Querystring("path")

'//Excel返却処理
Response.Buffer = turue
Response.ContentType = "application/octet.stream"
                    '// ContentTypeは下記2つも試し済み
                    '// application/vnd.ms-excel
                    '// application/msexcel
Response.ContentEncoding = Encoding.GetEncoding("UTF-8")
Response.AddHeader("content-disposition", "attachement;filename=" + strDownloadPath)
Response.TransmitFile([出力先パス] + strDownloadPath)
Response.Flush()

追記・修正:
コードの抜き出すべき所が分かっておりませんでした。
コード記載を修正したのでご参照いただけると幸いです。
お客様の要望、また作業場所の環境など諸事情で他ツール等の使用はできません。
この条件だと、[.xlsx]のままでExcelファイルダウンロードはできないのでしょうか?
宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hsk

    2016/02/09 13:05 編集

    >Excelファイルをダウンロードする...
    は、どのように実現していますか?
    むかしむかし、docxファイルをダウンロードしようとすると、zipファイル展開されてしまう(docx形式やxlsx形式の実体が、zip圧縮形式なため)症状がありました。
    http://www.webernote.net/webinfo/docx-xlsx-pptx.html
    MIME形式が、zipではないとしても、text/xmlなどに解釈されてしまって、若干のコード変換が走ってしまったりした結果、このような症状が出るのかもしれません。
    https://technet.microsoft.com/ja-jp/library/ee309278.aspx





    daiveさんの仰るとおり、私もOffice製品を直接いじらない方向をおすすめします。PHPなら、PHPEXCELなど使えるかもしれませんね。http://qiita.com/ao_love/items/33f4509654d3a19fe53e

    キャンセル

回答 3

checkベストアンサー

0

まずResponse.Buffer = turueが気になりますが、これは転記の際のミスでしょうか?

以下ではどうでしょう?

’Response情報クリア
    Response.ClearContent()

    ’バッファリング
    Response.Buffer = True

    ’HTTPヘッダー情報・MIMEタイプ設定
    Response.AddHeader("Content-Disposition", String.Format("attachment;filename={0}", strDownloadPath))
    Response.ContentType = "application/msexcel"

    ’ファイルを書き出し
    Response.WriteFile([出力先パス] + strDownloadPath)
    Response.Flush()
    Response.End()


参考サイト

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/10 12:34

    すみません、タイプミスでした。
    全部手書きで書き写してきたのを自宅で打ち込んだので…
    会社でためしてみます!

    キャンセル

  • 2016/02/10 15:05 編集

    ご教示いただいたコードを記載したら見事に実現出来ました!
    どの記述が一番ネックだったか調べたところ、「Response.End()」があることで、ファイルが壊れることなくダウンロードできるようになりました。
    まだ、どういう役目化など把握できていないので勉強したいと思います。
    本当にありがとうございました!

    キャンセル

0

これってコード云々ではなくExcelの定番どころのトラブルじゃないですか?

あとサーバーで生成したファイルが正常に開けるなら、ダウンロードしたものとバイナリ比較してみるとか

MSってこういうところをほったらかしにしていること多い気がします
特にOffice製品で
ユーザーから何世代も前のバージョンから指摘されているのに一向に直している気配がない
トラブルにあたって流石にこれはもう直ってるはずと検索すると現行バージョンでも症例が書き込まれている

Windows10にバージョンアップしろってしつこく告知を出すより、こういうところを地道に改善して欲しい
トラブルの対処法が、「〇〇のバージョン以降は直っているのでアプリケーションをバージョンアップしてください」でもいいと思うんですが(もちろんそれが有償であっても)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

WEBサーバーアプリから、サーバー側のEXCELオートメーションを実行している
と、解釈すると、
1.WEBアプリで、サーバーサイドのOFFICEを駆動する場合、ライセンス問題が発生します。
  特定少数でも、アクセス人数分のライセンスが必要なはず。
  むかーしの記憶ですが、OFFICEサーバーライセンスが1000万~だったような様な記憶が。
(OFFICE WEB コンポーネントが廃止された時に、調べた記憶。)
2.OFFICEオートメーションは、無人での動作を推奨していない。
  エラー表示や、フォーム表示もサーバー側でしか表示されない。
3.WEBアプリで、リクエストがあってから、EXCELのブックを準備するのでは、
  レスポンスのタイミングが不安定になって、掲示の現象が起きる場合があり、
  使用方法としては、推奨されない。
  ⇒エクセルソフトなどの、WEBサーバー用互換ソフトを使用するか、
   作成済みのブックを、正しいアクセス権を設定したWEB用フォルダから
   ダウンロードする。
4.無料版であれば、Microsoft Report を 使う事を検討する。
  サーバサイドでExcelブックを生成するいくつかの方法
  http://qiita.com/matarillo/items/549493f6bb7e36c99443
  にある方法を検討する。
  有料版であれば、WEBサーバー用互換ソフトを検討する。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる