excel文件下载下来损坏 js_使用Java / javascript和apache POI导出.xls文件时获取损坏的文件...

我正在尝试从Web应用程序下载浏览器中的.xls文件。下面是相同的代码。

try(FileInputStream inputStream = new FileInputStream("C:\\Users\\Desktop\\Book1.xls")){

response.setContentType("application/vnd.ms-excel");

//response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

response.setHeader("Content-Disposition", "attachment; filename=Book1.xls");

outputStream = response.getOutputStream();

byte[] buffer = new byte[BUFFERSIZE];

int bytesRead = -1;

while ((bytesRead = inputStream.read(buffer)) != -1) {

outputStream.write(buffer, 0, bytesRead);

}

}

以下是用于下载文件内容的JavaScript代码。

success: function(response, status, xhr) {

let type = xhr.getResponseHeader('Content-Type');

let blob = new Blob([response], { type: type });

if (typeof window.navigator.msSaveBlob !== 'undefined') {

// IE workaround for "HTML7007: One or more blob URLs were revoked by closing the blob for which they were created.

//These URLs will no longer resolve as the data backing the URL has been freed."

window.navigator.msSaveBlob(blob, filename);

} else {

let URL = window.URL || window.webkitURL;

let downloadUrl = URL.createObjectURL(blob);

if (filename) {

// use HTML5 a[download] attribute to specify filename

let a = document.createElement("a");

// safari doesn't support this yet

if (typeof a.download === 'undefined') {

window.location = downloadUrl;

} else {

a.href = downloadUrl;

a.download = filename;

document.body.appendChild(a);

a.click();

}

} else {

window.location = downloadUrl;

}

setTimeout(function () {

URL.revokeObjectURL(downloadUrl);

}, 100); // cleanup

}

}

我可以下载文件,但是下载的文件内容不是可读格式。如果它是csv文件,则我可以在我的javascript响应对象中看到内容,至于.xls文件,javascript响应对象包含无法读取的格式化数据。

有人可以帮我吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中,你可以使用 Apache POI 库来读取和写入 Excel 文件,并且可以使用 JSoup 库将 Excel 文件转换为 HTML 格式。在 Excel 中,间被存储为日期间的数字表示,因此你需要将其转换为字符串格式并在 HTML 中进行呈现。下面是一个示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; public class ExcelToHtml { public static void main(String[] args) throws IOException { // 读取Excel文件 FileInputStream inputStream = new FileInputStream(new File("input.xls")); Workbook workbook = new HSSFWorkbook(inputStream); // 转换为HTML Document html = Jsoup.parse("<table></table>"); Element table = html.select("table").first(); Sheet sheet = workbook.getSheetAt(0); for (Row row : sheet) { Element tr = table.appendElement("tr"); for (Cell cell : row) { Element td = tr.appendElement("td"); switch (cell.getCellType()) { case NUMERIC: if (HSSFDateUtil.isCellDateFormatted(cell)) { Date date = cell.getDateCellValue(); String dateString = String.format("%tF %<tT", date); td.text(dateString); } else { double number = cell.getNumericCellValue(); td.text(String.valueOf(number)); } break; case STRING: td.text(cell.getStringCellValue()); break; case BOOLEAN: td.text(String.valueOf(cell.getBooleanCellValue())); break; default: td.text(""); } } } // 写入HTML文件 FileOutputStream outputStream = new FileOutputStream(new File("output.html")); outputStream.write(html.outerHtml().getBytes()); outputStream.close(); // 关闭资源 workbook.close(); inputStream.close(); } } ``` 在上面的代码中,我们使用 HSSFDateUtil 类中的 isCellDateFormatted 方法来判断单元格是否包含日期间,并将其转换为字符串格式。如果单元格包含日期间,我们使用 String 类中的 format 方法将其格式化为“年-月-日 :分:秒”的字符串格式。最后,我们使用 FileOutputStream 类将 HTML 写入文件中。 请注意,上面的代码仅适用于.xls格式的Excel文件,如果你要处理.xlsx格式的文件,需要使用 XSSFWorkbook 类代替 HSSFWorkbook 类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值