在Angularjs和WebApi中下载Excel文件xlsx
本文关键字:Excel 文件 xlsx 下载 Angularjs WebApi | 更新日期: 2023-09-27 18:00:25
我正在执行一项任务,其中我必须下载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形成应用程序,并且文件打开时也没有任何错误。
谢谢。
我希望您的$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;
}
我遇到了同样的错误,内容是hexa格式,所以我添加了一个响应类型作为arraybuffer,问题得到了解决。请参阅下文。
$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);
});
您只需要做一件事。包括以下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;
}
我在使用Javascript库ExcelBuilder编写excel时遇到了类似的问题。最后,我发现原因是数据中包含了一个控制字符"''u001a"。
解决方案是以Excel的方式将控制字符编码为'_x001a_'。
我诊断问题的方式是这样的:
.xlsx文件只是一个压缩的xml文件。你可以用7号拉链打开它。在xl/
文件夹中有一个包含所有字符串的文件sharedString.xml
。提取文件并用Notepad++打开。如果你看到任何控制字符,那么这可能是原因。
首先安装这些模块
import * as Excel from 'exceljs';
import * as fs from 'file-saver';
在你的功能中写下这些
const workbook = new Excel.Workbook();
var worksheet = workbook.addWorksheet('sheet');
worksheet.columns = [
{ header: 'Id', key: 'id', width: 10 },
{ header: 'Name', key: 'name', width: 32 }
];
var buff = workbook.xlsx.writeBuffer().then(function (data) {
var blob = new Blob([data], {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
fs.saveAs(blob, "publications.xlsx");
});
Fs用于访问文件系统和下载文件。您也可以插入imghttps://www.npmjs.com/package/exceljs#images