2017-03-26 24 views
1

ユーザーがボタンをクリックすると、Excelファイルを生成しようとしていて、ブラウザにダウンロードしようとしています。document.locationはファイルを生成しません

var vFullExportContent = getExcelXmlNew(includeHidden, fullPageStore); 

これはXMLでExcelファイルデータを生成しました。

と私はBase64を使用してそれをエンコードし、以下のコード行を使用してdocument.locationを使用してファイルをダウンロードしたかったのです。そして、これは私のエクセルレコードが1000行以上あるときにファイルを生成しません。 1000行以下であればOKです。

document.location='data:application/vnd.ms-excel;base64,' + Base64.encode(vFullExportContent); 

また、エンコードの問題のために私のすべての(3259行)データを検証しましたが、何も観察されません。つまり、アプリケーションでフィルタを適用して、1000未満の一意の行を取得し、3回すべてのレポートのダウンロードを取得します。

大変助かります。

+0

あなたのアプローチはすべてのデータを含む 'data:' 'URI'を生成します。したがって、この「URI」はデータが巨大であるため膨大なものになるので、[URLの最大長]を打つことができます(http://stackoverflow.com/questions/417142/what-is-the -max-length-of-a-url-in-different-browser)。だからあなたはどのブラウザを使っていて、Firefoxブラウザで試してみましたか?一般的に、このアプローチは避け、実際にダウンロードできる「Excel」ファイルを実際に作成できるライブラリを使用する必要があります。 –

答えて

1

最近、Base64は必要なくなりました。代わりに、XMLをBlobにラップし、ユーザにObject URLをダウンロードしてダウンロードすることができます。

まず、BLOBは、JavaScriptのテキスト、バイナリデータのブロックではありませんので、我々はUint8Array(ブラウザでpolyfill TextEncoderする必要があります)にテキストを変換します

var encoder = new TextEncoder('utf8') 
var blob = new Blob(encoder.encode(vFullExportContent), {type: "application/xml"}) 

、URLを生成する(それ)

var url = URL.createObjectURL(blob) 

とそれにリンクを表示する(またはあなたがしなければならない場合window.locationのを使用します。ブロブ、データのない表現)を参照し、短いURLになります。

ユーザーがファイルをダウンロードしたら、URL.revokeObjectURL(blob)に電話して、BLOBをガベージコレクションできるようにしてください。

関連する問題