2

VB で記述された ASP.NET WebForms アプリケーションを変更するように依頼されました (通常は C# を使用します)。

1 つのタスクは、Excel のダウンロードを試して修正することです。クライアントは、スプレッドシートを Excel で開こうとすると、スプレッドシートが破損しているというエラーが表示されると報告しました。

Excel ダウンロードをエクスポートするコードは、専用の ASPX ページの Load イベントに表示されます。そして、次のようになります。

Dim mytable As New HtmlTable
mytable = [Populate HTML Table Here]

mytable = returnclass.displaytable
mytable.Border = 1
mytable.BorderColor = "#CCCCCC"

HttpContext.Current.Response.Clear()
HttpContext.Current.Response.Buffer = True

Response.Write("<html xmlns:x=""urn:schemas-microsoft-com:office:excel"">")
Response.Write("<head>")
Response.Write("<!--[if gte mso 9]><xml>")
Response.Write("<x:ExcelWorkbook>")
Response.Write("<x:ExcelWorksheets>")
Response.Write("<x:ExcelWorksheet>")
Response.Write("<x:Name>" & worksheetTitle & "</x:Name>")
Response.Write("<x:WorksheetOptions>")
Response.Write("<x:Print>")
Response.Write("<x:ValidPrinterInfo/>")
Response.Write("</x:Print>")
Response.Write("</x:WorksheetOptions>")
Response.Write("</x:ExcelWorksheet>")
Response.Write("</x:ExcelWorksheets>")
Response.Write("</x:ExcelWorkbook>")
Response.Write("</xml>")
Response.Write("<![endif]--> ")
Response.Write("</head>")
Response.Write("<body>")

HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=hhexport.xls ")
HttpContext.Current.Response.Charset = ""

'ouput table to html so excel can interperet.
Me.EnableViewState = False
Dim stringWriter As New System.IO.StringWriter()
Dim htmlWriter As New System.Web.UI.HtmlTextWriter(stringWriter)
mytable.RenderControl(htmlWriter)

HttpContext.Current.Response.Write(stringWriter.ToString)

これが何をしようとしているのか本当に理解できません。

質問:

  1. このコードは通常の ASP.NETHtmlTableを生成し、それを に割り当てmytableます。Excel で HTML を開くことができる惑星はどこですか?

  2. 私は、ここの XML 全般と、<!--[if gte mso 9]コメントによって、本当にある種の損失を被っています。ここで何が起こっているのかを理解してくれる人はいますか。

結果は有効に見えますが、ここでの意図がよくわかりません。ヒントをいただければ幸いです。

編集

さらにテストすると、問題はファイルに付けられた拡張子 (xls) に関連しているようです。現在のバージョンの Excel は、私が指定した場合に先に進み、ファイルを読み込みます。ただし、すべてのフォーマットが失われます。これがどのタイプのファイルになるかについて何か提案はありますか?

編集

元の作者はhereからアイデアを得たようですが、そのページでは実際に何が起こっているのかを説明していません.

アップデート

みんなの反応に感謝します。上記の質問にどのように対処したかに従って、それらの回答を評価します。ただし、私の目的では、コードはずっと機能しているように見えます。新しいバージョンの Excel では、HTML を含む XLS ファイルは、ファイル拡張子が示すものとは異なる種類のファイルであるとユーザーに警告しているようです。そして、CSV、OpenXML、またはその他のアプローチを使用してエクスポートする以外に、これについてできることはないようです。このブログで詳細を見つけました。

4

2 に答える 2

1

私の知る限り、Excel はかなり前から HTML を読み取ることができました。この特定のアプローチはかなり一般的ですが、ベスト プラクティスとは言えません。

このロジックの重要な部分は次のとおりです。

HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=hhexport.xls ")
HttpContext.Current.Response.Charset = ""

'ouput table to html so excel can interperet.
Me.EnableViewState = False
Dim stringWriter As New System.IO.StringWriter()
Dim htmlWriter As New System.Web.UI.HtmlTextWriter(stringWriter)    
mytable.RenderControl(htmlWriter)

HttpContext.Current.Response.Write(stringWriter.ToString)

Response.Writeロジックは、出力されるワークブックとワークシートを制御するために使用されています。そのロジックが存在しない場合、ファイルは、新しい Excel ワークブックと同様の 3 つのワークシートで開きます。

于 2013-09-27T20:00:16.043 に答える
1

このコードは基本的に、Excel に関連するいくつかの特別な XML タグで HTML テーブルをラップします (ワークブックやワークシートの定義など)。これにより、出力を Excel またはブラウザーで開くことができるようになります。

質問に答えるには:

  1. このコードは、通常の ASP.NET HtmlTable を生成し、それを mytable に割り当てます。Excel で HTML を開くことができる惑星はどこですか? 実際、それはExcelの機能です。XML タグと HTML タグの特別な組み合わせを使用して、Web および Excel で開くことができるファイルを作成できます。この MSDN の記事を参照してください: MIME コンテンツのストリーミング中に Excel ワークブックをフォーマットする方法
  2. 私は、ここの XML 全般と、<!--[if gte mso 9]コメントによって、本当にある種の損失を被っています。ここで何が起こっているのかを理解してくれる人はいますか。 その特定のコメントは、MS Excel の可用性 (Excel で開いているか、ブラウザーで開いているか) を確認していると思います。XML は、MS Excel で特別な意味を持つ特定のタグです。ここからダウンロードできるリファレンスがあります: Microsoft® Office HTML and XML Reference

このタイプのコードを理解するには、C# コーナーに関するこの記事が非常に役立つことがわかりまし

于 2013-09-27T20:01:09.060 に答える