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

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

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

18286閲覧

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

DgRp_08

総合スコア56

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2016/02/08 14:26

編集2016/02/09 16:56

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

![イメージ説明

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

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

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

VB.NET

1'================================================== 2'asapxA.aspx(呼び出し元) 3'================================================== 4<a runat="server" id="linkDL" name="linkDL" href="#dummy" onclick="return linkDL_Click"> 5 Download 6</a> 7'// [javaScript] 8function linkDl_Click(){ 9 var returnVal = window.showModalDialog( 10 "aspxB.aspx", "_self" 11 ); 12 13 '// 取得データが有る場合 14 if(typeof returnVal != 'undefind' && returnVal != '' { 15 window.open('DownLoad.aspx?path=' + returnVal, 'DownLoad'); 16 } 17 return false; 18} 19 20 21'================================================== 22'aspxB.aspx 23'================================================== 24'// JavaScript 25function funcOnLoad() { 26 window.returnValue = document.getElementById("hdn_DownloadPath").value; 27 window.close(); 28} 29 30<body onload="funcOnLoad()"> 31 <form id="aspxB" runat="server"> 32 <asp:HiddenField runat="server" ID="hdn_DownloadPath"> 33 </form> 34</body> 35 36 37'-------------------------------------------------- 38'aspxB.aspx.vb(aspxB.aspxから呼び出される) 39'-------------------------------------------------- 40Dim strNewName As string '// 出力ファイル名 41Dim strTempPath As string '// テンプレートパス 42Dim strOutputPath As string '// 出力先パス 43Dim xlApp As Excel.Application 44Dim wkBook As Excel.WorkBook 45Dim wkSheet As Excel.WorkSheet 46 47' [代入記述省略] 48 49System.IO.File.Copy(strTempPath,strOutputPath) 50xlApp = CreateObject("Excel.Application") 51wkBook = xlApp.WorkBooks.Open(strOutputPath) 52wkSheet = wkBook.WorkSheets("Sheet1") '// 実際は名前設定済の9シートが存在しています 53 54' [DBデータ取得(処理詳細省略)] 55' [指定シート、指定セルへデータを出力(処理詳細省略)] 56' [入力規則の設定(処理詳細省略)] 57 58System.Runtie.InteropServices.Marshal.ReleaseComObject(wkSheet) 59wkBook.Close(SaveChanges:=True) 60System.Runtie.InteropServices.Marshal.ReleaseComObject(wkBook) 61System.Runtie.InteropServices.Marshal.ReleaseComObject(xlApp) 62wkSheet = Nothing 63wkBook = Nothing 64xlApp = Nothing 65GC.Collect() 66Me.hdn_DownloadPath.Value = newFileName 67 68 69'================================================== 70'DownLoad.aspx 71'================================================== 72Dim strDownloadPath As string 73 74strDownloadPath = Request.Querystring("path") 75 76'//Excel返却処理 77Response.Buffer = turue 78Response.ContentType = "application/octet.stream" 79 '// ContentTypeは下記2つも試し済み 80 '// application/vnd.ms-excel 81 '// application/msexcel 82Response.ContentEncoding = Encoding.GetEncoding("UTF-8") 83Response.AddHeader("content-disposition", "attachement;filename=" + strDownloadPath) 84Response.TransmitFile([出力先パス] + strDownloadPath) 85Response.Flush()

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hsk

2016/02/09 04:07 編集

>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
guest

回答3

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 03:32

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DgRp_08

2016/02/10 03:34

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

2016/02/10 06:05 編集

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

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サーバー用互換ソフトを検討する。

投稿2016/02/08 21:05

編集2016/02/08 21:11
daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

投稿2016/02/08 19:45

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問