wake-up-neo.com

Excel-Datei xlsx in Angularjs und WebApi herunterladen


Ich arbeite an einer Aufgabe, bei der ich einen Bericht im xlsx-Format herunterladen muss. Die Berichtsdatei wird erfolgreich vom Server generiert und auch auf der Clientseite empfangen. Es wird jedoch kein ungültiger Formatfehler geöffnet.

Unten ist der Code der Serverseite.

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;
 }


Hier ist der Code für die Clientseite:

        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);

    }


Unten ist die Fehlermeldung:
Excel konnte newFile.xlsx nicht öffnen, da einige Inhalte nicht lesbar sind. Möchten Sie dieses Arbeitsbuch öffnen und reparieren?

Beim Klicken auf die Reparatur wird der folgende Fehler angezeigt: Excel kann diese Datei nicht öffnen.
.__ Das Dateiformat oder die Dateierweiterung ist nicht gültig. Stellen Sie sicher, dass die Datei nicht beschädigt wurde und dass die Dateierweiterung dem Format der Datei entspricht.

Kann jemand mich leiten, was ich falsch mache? In der ASP.Net-Formularanwendung funktionieren die gleichen serverseitigen Dateigeneratorobjekte problemlos, und die Datei wird ebenfalls ohne Fehler geöffnet.
Vielen Dank.

13
Nadeem Jamali

Ich gehe davon aus, dass bei Ihrem Aufruf $http die Konfiguration des Antworttyps fehlt. So lade ich Office-Dateien herunter:

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

Sie müssen nur eine Sache tun, die nur Folgendes enthält: j. Fügen Sie folgende js ein, um die Datei lokal zu speichern. Laden Sie es von " https://github.com/eligrey/FileSaver.js/ " Herunter. Ihre Antwortdaten sollten vom Typ Blob sein.

Ich habe es umgesetzt und es funktioniert.

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

Ich war mit dem gleichen Fehler konfrontiert, der Inhalt war im Hexa-Format, also fügte ich einen Antworttyp als Arraypuffer hinzu, das Problem wurde behoben. siehe unten.

$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

Beim Schreiben von Excel mit der Javascript-Bibliothek Excel Builder ist ein ähnliches Problem aufgetreten. Am Ende stellte ich fest, dass in den Daten ein Steuerzeichen '\ u001a' enthalten war. 

Die Lösung besteht darin, das Steuerzeichen auf Excel-Weise zu codieren als '_x001a_'. 

So habe ich das Problem diagnostiziert: 

Die .xlsx-Datei ist nur eine gezippte XML-Datei. Sie können es mit 7-Zip öffnen. Im Ordner xl/ befindet sich eine Datei sharedString.xml, die alle Zeichenfolgen enthält. Extrahieren Sie die Datei und öffnen Sie sie mit Notepad ++. Wenn Sie ein Steuerzeichen sehen, kann dies die Ursache sein. 

0
gm2008