我正试图用reactJS下载一个xlsx文件,但当我在下载后试图打开我的文件时,我收到了这条消息:
“Excel无法打开文件‘file.xlsx’,因为文件格式或文件扩展名无效。请验证文件是否已损坏,以及文件扩展名是否与文件格式匹配。”
这是前端代码:
const REST_DOWNLOAD_URL = REST_URL + '/token';
Rest.ajaxPromise('GET', REST_DOWNLOAD_URL).then(function (res) {
var FILE_URL = "/supermarket/token/" + res;
Rest.ajaxPromise('GET', FILE_URL).then(function (my_file) {
let blob = new Blob([my_file._body], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' });
if (navigator.msSaveOrOpenBlob) {
navigator.msSaveBlob(blob, 'file.xlsx');
} else {
let link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.setAttribute('download', 'file.xlsx');
document.body.appendChild(link);
link.download = '';
link.click();
document.body.removeChild(link);
}
});
});
为什么我得到这个错误?请谁来帮帮我,我被困在这个3周
[编辑1]
我尝试下载的文件是在后端构建的,基本上我获取数据库上的值并使用Apache poi工作簿创建excel表。我将向您展示代码的主要部分:
1) 该方法在前端第一次获取请求时由前端调用,目的是在下载之前准备文件。非常简单,只需创建一个令牌(buildToken())并将一个临时文件与该令牌(createTempFile(randomBackendToken))关联。临时文件中填充了我在数据库中获得的内容(createFile(os))
@RequestMapping(value = "/token", method = RequestMethod.GET)
public String returnToken() throws IOException {
String randomBackendToken = tokenGenerator.buildToken();
OutputStream os = tokenGenerator.createTempFile(randomBackendToken);
tokenGenerator.createFile(os);
return randomBackendToken;
}
2) 创建临时文件的方法:
public OutputStream createTempFile(String randomBackendToken) throws IOException {
OutputStream os = null;
File file = File.createTempFile(randomBackendToken, ".xlsx");
os = new FileOutputStream(file);
return os;
}
3) 我接收空临时文件并在数据库中填充数据的方法:
public void createFile(OutputStream os) throws IOException {
List<Supermakets> supermarkets = service.findAllSupermarkets();
Workbook workbook = writeExcel.createSheet(supermarkets);
workbook.write(os);
IOUtils.closeQuietly(os);
}
4) 构建xlsx文件的WriteExcel类:
private static String[] columns = {"Code", "Name", "Type"};
public Workbook createSheet(List<Supermarket> supermarkets) throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("file");
[....]
// Row for Header
Row headerRow = sheet.createRow(0);
// Header
for (int col = 0; col < columns.length; col++) {
Cell cell = headerRow.createCell(col);
cell.setCellValue(columns[col]);
cell.setCellStyle(headerCellStyle);
}
//Content
int rowIdx = 1;
for (Supermarket supermarket : supermarkets) {
Row row = sheet.createRow(rowIdx++);
row.createCell(0).setCellValue(supermarket.getCode());
row.createCell(1).setCellValue(supermarket.getName());
row.createCell(2).setCellValue(supermarket.getType());
}
return workbook;
}
因此,以上所有内容仅适用于第一次获取申请。我再做一个,下面的方法保存第二个请求。我只是验证前端为我和他们返回的令牌,基于验证,我允许下载我在上一步创建的文件:
public void export(@PathVariable(value = "frontendToken") String frontendToken, HttpServletResponse response) throws IOException {
if (StringUtils.isNotBlank(frontendToken)) {
String tmpdir = System.getProperty("java.io.tmpdir");
File folder = new File(tmpdir);
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
boolean fileIsValid = tokenGenerator.validateToken(frontendToken, listOfFiles[i]);
if (fileIsValid) {
InputStream input = new FileInputStream(listOfFiles[i]);
OutputStream output = response.getOutputStream();
int data = input.read();
while (data != -1) {
output.write(data);
data = input.read();
}
input.close();
output.flush();
output.close();
String mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
response.setContentType(mimeType);
listOfFiles[i].delete();
}
}
}
}
}
这就是我正在做的一切。找不到问题或丢失的内容。当我按导航器上的F12以查看请求的响应时,会向我显示一些编码的内容,例如:
PK@SM_rels/.rels’ÁjÃ0†_ÅèÞ8í`ŒQ·—2èmŒî4[ILbËØÚ–½ýÌ.[Kì($}ÿÒv?‡I½Q.ž£uÓ‚¢hÙùØx>=¬î@ÁèpâH"Ã~·}¢
有什么怀疑吗?
伙计们!
问题是:我的二进制数据被javascript转换成字符串,这破坏了我的excel文件。我解决了将后端的二进制数据转换为文本的问题,然后在前端进行反向转换。以下链接帮助了我:
java将inputStream转换为base 64字符串
在JavaScript中从base64字符串创建Blob
谢谢大家的帮助。我希望我的问题能帮助别人
作为我工作的一部分,我一直在制作python脚本,这些脚本读取各种格式(例如Excel、Csv、Txt)的输入,并将信息解析为更标准化的文件。这不是我第一次打开或使用Excel文件。 有一个特殊的文件给我带来了问题,我只是打不开它。当我尝试使用xlrd(版本0.9.3)时,它给了我以下错误: XLRDERROR:不支持的格式,或损坏的文件:BOF不是工作簿/工作表:OP=0x0009 vers=0
嗨,我一直试图写代码,这样我就可以生成一个excel表,也可以下载当用户点击下载按钮.....我已经成功地生成了excel表,但我尝试下载同样的,但我没有成功。 我使用的方法是:
我目前正在做一个个人投资组合,我试图制作一个按钮,如果你点击它,应该下载一份简历。 代码 让用户下载该文件。 我在REACTJS中工作,创建react应用程序
问题内容: 有写Excel 2007+文件的Python模块吗? 我对编写长度超过65535行的文件感兴趣,只有Excel 2007+支持它。 问题答案: 您可以查看两个库。 Python-xlsx和 PyXLSX 编辑:正如评论所提到的,编写时请检查openpyxl
使用Cordova/PhoneGap 3.3.0,我使用FileTransfer插件下载一个文件,然后尝试使用InAppBrowser插件打开它。我可以成功下载该文件,并将其放置在临时目录中。由于文件插件现在使用URL模式,我无法确定如何将正确的URL/路径传递到<code>窗口。打开InAppBrowser插件的方法。我也找不到任何相关文件。我能找到的所有“下载并打开”文档都是过时的,并且是UR
我使用Apache POI框架生成了一个xlsx密码保护文件,下面添加了我的代码。然而,我无法使用Excel工具打开生成的文件。我可以使用Plan Maker免费工具打开它。欢迎任何建议。 我有以下jars使用,commons-collections4-4.4.jar,commons-compress-1.20.jar,commons-math3-3.0.jar,poi-4.1.2.jar,poi