Web サーバーから Excel ファイルを保存する際の [1] IE のバグを回避するにはどうすればよいですか?
質問
Internet Explorer がインターネットからダウンロードしたファイルに角括弧内の数字 (通常は [1]) を追加することに気付きました。Excel ワークシート名内の角括弧は有効なファイル名文字ではないため、これにより Excel スプレッドシートのダウンロード時に大きな問題が発生します。この問題は IE 固有の問題であり、他のブラウザでは同じファイル名が維持されます。
したがって、たとえば、ファイルを開いたときにピボット テーブルが自動更新される場合、「file[1].yourPivotTableName」という名前が無効であるというエラー メッセージが表示されます。
その問題に対する解決策はありますか?
編集 :それは何であれ、 HTTP ディレクティブによって提案されたファイル名, IE はすべての場合に [1] を追加するため、問題が発生します。(その場合、ファイル名に関する回答は役に立ちません)
編集 :ファイルを開いたときに別の名前でファイルを保存するためのVBAコードをいくつか試しました。ただし、機能しません(前と同じエラーメッセージが表示されます)。VBA でそれを修正する方法はあると思いますか?
解決
このクールな人 (彼のことを懐かしく思っています) が提供してくれた VBA を使用して、これを動作させました。ファイルの名前を変更し、ピボットを再接続します。
http://php.kennedydatasolutions.com/blog/2008/02/05/internet-explorer-breaks-excel-pivot-tables/
他のヒント
これは、IE でスプレッドシートを開いて、IE がそれを一時ファイルに保存したときに発生すると思います。そして、それはスプレッドシートのファイル名に複数のドットが含まれている場合にのみ発生すると思います。シンプルな「sample.xls」で試してみてください。別の回避策は、ファイルをデスクトップに保存してから開くようにユーザーに指示することです。
これは Internet Explorer の組み込み機能です。
ファイルのダウンロード ウィンドウで [開く] の使用をやめ、[保存] を使用し始めます。そうしないと、IE は一時フォルダーに保存するファイルのファイル名に「[1]」を追加します。
次を使用して、.NET アプリケーションを構築できます。 System.IO.FileSystemWatcher ダウンロードされたファイルなどの作成イベントをキャッチし、ファイルの名前を変更します。
私は 3 つのパラメータを渡すメソッドを使用してこの問題を解決しました。ファイル名、ファイル拡張子 (.dot を除く)、および HTTP リクエスト)。次に、ファイル名と拡張子の UTF-8 エンコードを実行します。サンプルコード:
public static String encoding(String fileName, String extension, HttpServletRequest request)
{
String user = request.getHeader( "user-agent" );
boolean isInternetExplorer = ( user.indexOf( "MSIE" ) > -1 );
String var = "";
try
{
fileName = URLEncoder.encode( fileName, "UTF-8" );
fileName = fileName.trim().replaceAll( "\\+", " " );
extension = URLEncoder.encode( extension, "UTF-8" );
extension = extension.trim().replaceAll( "\\+", " " );
if ( isInternetExplorer )
{
disposition = "attachment; filename=\"" + fileName+"."+extension+"\"";
}
else
{
var = "attachment; filename*=UTF-8''" + fileName+"."+extension;
}
}
catch ( UnsupportedEncodingException ence )
{
var = "attachment; filename=\"" + fileName+"."+extension;
ence.printStackTrace();
}
return var;
}
私の場合はこれでうまくいきました。皆さんのお役に立てれば幸いです。
実際、正しい .NET コードは次のとおりです。
Response.AppendHeader("content-disposition", "attachment;filename=file.xls");
Response.ContentType = "application/vnd.ms-excel";
注記: ヘッダーの追加, 、 ない ヘッダーの追加, 、これはデバッグWebサーバーとIIS7でのみ機能すると思います。
以下は私にとってうまくいきました:
private string EncodeFileName(string fileName)
{
fileName = HttpUtility.UrlEncode(fileName, Encoding.UTF8).Replace("+", " ");
if (HttpContext.Current.Request.UserAgent.ToLower().Contains("msie"))
{
var res = new StringBuilder();
var chArr = fileName.ToCharArray();
for (var j = 0; j < chArr.Length; j++)
{
if (chArr[j] == '.' && j != fileName.LastIndexOf("."))
res.Append("%2E");
else
res.Append(chArr[j]);
}
fileName = res.ToString();
}
return "\"" + fileName + "\"";
}
ピボットのオプション ボックスで自動更新がオフになっていることを確認するだけで済みます。サーバーから開いた場合でもピボットが完全に機能するようになりました。
私も同じ問題に遭遇しましたが、VBA を必要としないより良い解決策を思いつきました。
「Content-Disposition」ヘッダーを「attachment;」に設定すると、「inline;」の代わりに「filename=<...>」filename=<...>" 通常のブラウザでは、ヘッダーで定義されたファイル名でファイルを保存したり開いたりできるダイアログが開きますが、Internet Explorer は一種の奇妙な動作をします。ファイルのダウンロードダイアログが開きます。 保存 ヘッダーで定義されているファイル名が提案されますが、 開ける ファイルを一時フォルダーに保存し、次の名前で開きます。 URNと同じです (「名前空間」なし)、例:あなたのURIが http://サーバー/フォルダー/ファイル.html, そのため、IE はファイルを次のように保存します ファイル.html (括弧はありません、うわー!)。これにより、次のような解決策が得られます。
からのリクエストを処理するスクリプトを作成します。 http://サーバー/フォルダー/* そして、XLS ファイルを提供する必要がある場合は、次のようにしてそのスクリプトにリダイレクトします (アスタリスクの代わりにファイル名を使用します)。 コンテンツの配置 に設定 列をなして.
コードに次の 4 行を追加します。
response.reset();
response.setHeader("Expires", "0");
response.setHeader("Cache-Control","must-revalidate,post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
お役に立てれば。
.NETでは、経験からこれだけが私にとってうまくいくようです:
Response.AddHeader("Content-Disposition", "attachment; filename=excel.xls");
Response.AddHeader("Content-Type", "application/vnd.ms-excel");
Response.ContentType = "application/vnd.ms-excel";
重複は臭いですが、これまでのところ私はその真相に到達したことはありません(おそらくSebsの投稿がこれを説明しています)。また、「content-Disposition」値は次のように使用すると非常に扱いにくいようです。; の代わりにまたは、それと「ファイル名」の間のスペースを省略すると、問題が発生します。
また、IIS で圧縮を有効にしている場合は、これで問題が解決する可能性があります。
Response.ClearHeaders()