2015-06-30 11 views
12


Sto lavorando su un'attività, in cui devo scaricare un report in formato xlsx. Il file di report viene generato correttamente dal server e viene ricevuto anche dal lato client. Ma non si apre e produce errori di formato non validi.

Di seguito è riportato il codice del lato server.
Download di file Excel xlsx in Angularjs e WebApi

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


Ecco il codice per il lato client:

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

    } 


Di seguito si riporta il messaggio di errore:
Excel non ha potuto aprire newFile.xlsx perché alcuni contenuti è illeggibile. Vuoi aprire e riparare questa cartella di lavoro?

Quando si fa clic su Riparazione, viene visualizzato il seguente errore: Excel non può aprire questo file.
Il formato del file o l'estensione del file non è valido. Verificare che il file non sia stato danneggiato e che l'estensione del file corrisponda al formato del file.

Qualcuno può guidarmi cosa sto facendo male? Nel frattempo, gli stessi oggetti del generatore di file lato server funzionano senza problemi nell'applicazione di moduli ASP.Net e anche il file si apre senza errori.
Grazie.

+0

qual è la configurazione '$ http'? per favore aggiungi la riga di richiesta. – hansmaad

+0

config.headers.Authorization = "Bearer" + authData.token; Questo è solo a scopo di autorizzazione. –

risposta

33

Prevedo che alla chiamata $http manchi la configurazione del tipo di risposta. Questo è il modo in cui scarico i file dell'ufficio:

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

Grazie @hansmadd –

+0

Hai salvato la mia giornata, grazie! – Weibo

+1

Tutto ciò che ottengo attualmente è un file Excel con il contenuto "(oggetto)" nella sua prima cella –

2

Hai solo bisogno di fare solo una cosa. include i seguenti j per salvare il file localmente. Scaricalo da "https://github.com/eligrey/FileSaver.js/" i dati di risposta dovrebbero essere in blob type.

L'ho implementato e il suo funzionamento.

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

puoi rispondere a questo http://stackoverflow.com/questions/43894768/how-to-set-the-no-of-column-name-while-export-the-excel-using-angularjs – Vinoth

+0

1 questo è il migliore soluzione –

+0

cambiare il tipo di risposta in BLOB è ciò che alla fine ha funzionato per me – gary69

0

Ho riscontrato un problema simile durante la scrittura di Excel utilizzando la libreria JavaScript Excel Builder. Alla fine, ho scoperto che il motivo era che un carattere di controllo '\ u001a' era incluso nei dati.

La soluzione è codificare il controllo char in modo Excel come '_x001a_'.

Il modo in cui ho diagnosticato il problema era come questo:

file xlsx è solo un file XML zippato. Puoi aprirlo con 7-zip. All'interno della cartella xl/ c'è un file sharedString.xml contenente tutte le stringhe. Estrai il file e aprilo con Notepad ++. Se vedi qualche carattere di controllo, allora potrebbe essere la causa.

Problemi correlati