Excel.xlsx文件在java中从服务器下载后未打开
这是我的示例代码。我正在使用eclipse,tomcat服务器.Browser作为IE9Excel.xlsx文件在java中从服务器下载后未打开,java,excel,jakarta-ee,servlets,Java,Excel,Jakarta Ee,Servlets,这是我的示例代码。我正在使用eclipse,tomcat服务器.Browser作为IE9 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("application/vnd.openxmlformats-officedo
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
ServletContext context = request.getServletContext();
@SuppressWarnings("unchecked")
List<Student> students = (List<Student>) context.getAttribute("students");
PrintWriter out = response.getWriter();
for(Student student:students){
out.println(student.getId()+"\t"+student.getName());
}
out.close();
}
protectedvoid服务(HttpServletRequest),
HttpServletResponse响应)引发ServletException,IOException{
setContentType(“application/vnd.openxmlformats of icedocument.spreadsheetml.sheet”);
ServletContext=request.getServletContext();
@抑制警告(“未选中”)
List students=(List)context.getAttribute(“students”);
PrintWriter out=response.getWriter();
用于(学生:学生){
out.println(student.getId()+“\t”+student.getName());
}
out.close();
}
我正在得到学生名单。但是当我打开下载的文件时,会出现错误,说文件格式或扩展名无效。我下载的文件是.xlsx。我强烈建议您使用类创建excel文件。创建后(有关创建过程,请参见:),您可以将其内容写入响应,如下所示:
Workbook workbook = new XSSFWorkbook();
// Add sheet(s), colums, cells and its contents to your workbook here ...
// First set response headers
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=YourFilename.xlsx");
// Get response outputStream
ServletOutputStream outputStream = response.getOutputStream();
// Write workbook data to outputstream
workbook.write(outputStream);
与其说它是一个.xlsx文件,不如说它是一个CSV或制表符分隔值文本文件。它假装是一个Excel文件;是的,Excel会正确打开它 试着用记事本读。你也可以用记事本制作一个.xlsx文件来检查这个技巧是否有效 以下尝试:
- .xls
- Windows
(CR+LF)行结束。可能服务器是Linux并提供\r\n
(LF)\n
- 定义的编码
response.setEncoding(“UTF-8”);
response.setContentType(“application/vnd.ms excel”);
ServletContext=request.getServletContext();
@抑制警告(“未选中”)
List students=(List)context.getAttribute(“students”);
PrintWriter out=response.getWriter();
out.print(“\uFEFF”);//UTF-8物料清单,冗余且丑陋
用于(学生:学生){
out.printf(“%s\t%s\r\n”、student.getId()、student.getName());
}
//out.close();
请注意,您发送的不是xslx文件。发送以制表符作为分隔符的csv。请尝试应用程序/vnd.ms-excel@Jens你从哪里知道他发送了一个csv文件???@navin一个xlsx文件通常是一个zip存档文件。你测试过它没有损坏吗?这样我将创建一个.xls文件而不是.xlsx文件。在这里,我想创建一个.xlsx文件。我误解了这个要求。然后您只需使用XSSFWorkbook
类,并将文件扩展名更改为xlsx。
HSSFWorkbook`和XSSForkbook
都在实现Wokbook接口,因此其api将是相同的。请参阅更新应答我保留了response.setContentType(“application/vnd.openxmlformats of cedocument.spreadsheetml.sheet”);未更改。当我在记事本++中打开相同的下载(.xlsx)文件时,可以查看内容。response.setHeader(“内容处置”,“文件名=\”test.xsl\”;
左右?双击(下载、编辑的)文本文件作为.xsl和.xslx。
response.setEncoding("UTF-8");
response.setContentType("application/vnd.ms-excel");
ServletContext context = request.getServletContext();
@SuppressWarnings("unchecked")
List<Student> students = (List<Student>) context.getAttribute("students");
PrintWriter out = response.getWriter();
out.print("\uFEFF"); // UTF-8 BOM, redundant and ugly
for(Student student:students){
out.printf("%s\t%s\r\n", student.getId(), student.getName());
}
//out.close();