web-dev-qa-db-ja.com

AngularjsおよびWebApiでExcelファイルxlsxをダウンロードする


タスクに取り組んでおり、xlsx形式のレポートをダウンロードする必要があります。レポートファイルはサーバーから正常に生成され、クライアント側でも受信されます。ただし、無効な形式エラーを開いたり生成したりすることはありません。

以下はサーバー側のコードです。

var output = await reportObj.GetExcelData(rParams);
    if (output != null){
        var result = new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new ByteArrayContent(output.ConentBytes)
        };
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
        {
            FileName = output.FileName
        };
 return result;
 }


クライアント側のコードは次のとおりです。

        var saveData = function (response) {

        if (response.status === 200) {
            var reportData = response.data;

            var b = new Blob([reportData], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" });
            saveAs(b,"ReportFile.xlsx");//this is FileSaver.js function
        } else {
            console.log(response.statusText);
        }

    };


    $scope.getExcelFile = function(reportName, reportParams) {

        reportDataService.getExcelReportData(reportName, reportParams, saveData);

    }


エラーメッセージは次のとおりです
一部のコンテンツが読めないため、ExcelはnewFile.xlsxを開けませんでした。このワークブックを開いて修復しますか?

修復をクリックすると、次のエラーが表示されます: Excelはこのファイルを開けません。
ファイル形式またはファイル拡張子が無効です。ファイルが破損していないこと、およびファイル拡張子がファイルの形式と一致していることを確認してください。

誰かが私が間違っていることを教えてもらえますか?一方、同じサーバー側のファイルジェネレーターオブジェクトはASP.Netフォームアプリケーションでスムーズに動作し、ファイルもエラーなしで開きます。
ありがとうございました。

13
Nadeem Jamali

$http呼び出しには、応答タイプの構成がありません。これは私がオフィスファイルをダウンロードする方法です:

function download(url, defaultFileName) {
    var self = this;
    var deferred = $q.defer();
    $http.get(url, { responseType: "arraybuffer" }).then(
        function (data, status, headers) {
            var type = headers('Content-Type');
            var disposition = headers('Content-Disposition');
            if (disposition) {
                var match = disposition.match(/.*filename=\"?([^;\"]+)\"?.*/);
                if (match[1])
                    defaultFileName = match[1];
            }
            defaultFileName = defaultFileName.replace(/[<>:"\/\\|?*]+/g, '_');
            var blob = new Blob([data], { type: type });
            saveAs(blob, defaultFileName);
            deferred.resolve(defaultFileName);                    
        }, function (data, status) {
            var e = /* error */
            deferred.reject(e);
        });
    return deferred.promise;
}
36
hansmaad

あなただけのことをする必要があります。次のjsを含めて、ファイルをローカルに保存します。 「 https://github.com/eligrey/FileSaver.js/ 」からダウンロードします。応答データはblobタイプである必要があります。

私はそれとその動作を実装しました。

function downloadfile(url,defaultFileName){
  var self = this;
    var deferred = $q.defer();
    $http.get(url, { responseType: "blob" }).then(
       function (data){
          saveAs(data.data, defaultFileName)
          deferred.resolve(defaultFileName);                    
        }, function (data) {
           var e = /* error */
            deferred.reject(e);
        });
        return deferred.promise;
}
2
Pradeep Korriya

私は同じエラーに直面していました、コンテンツはヘキサ形式でしたので、配列バッファとして応答タイプを追加し、問題は解決しました。下記を参照してください。

$http({
    url: '/api/sendPMOToBackendUpdate',
    method: "POST",
    headers: {'Content-type': 'application/json'},
    data: backendTsData,
    responseType: 'arraybuffer'
}).success(function(data, status, headers){
    var file = new Blob([ data ], { type : 'application/vnd.ms-Excel'});
    var defaultFileName ="TSC-"+$scope.user.name+"-"+$scope.user.ohrId+".xls";
    saveAs(file,defaultFileName);
}).error(function(err) {
    console.log('Error: ' + err);
});
0
Mithun Kumar

JavascriptライブラリExcel Builderを使用してExcelを作成するときに、同様の問題が発生しました。最後に、制御文字「\ u001a」がデータに含まれていることが原因であることがわかりました。

解決策は、Excelの方法で制御文字をエンコードするとして '_x001a_'です。

問題を診断する方法は次のとおりです。

.xlsxファイルは、zip形式のxmlファイルです。 7-Zipで開くことができます。 xl/フォルダーにはファイルがありますsharedString.xmlすべての文字列を含む。ファイルを抽出し、Notepad ++で開きます。制御文字が表示される場合、それが原因である可能性があります。

0
gm2008