Excel.xlsx文件在java中从服务器下载后未打开

Excel.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

这是我的示例代码。我正在使用eclipse,tomcat服务器.Browser作为IE9

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
    \r\n
    (CR+LF)行结束。可能服务器是Linux并提供
    \n
    (LF)
  • 定义的编码
然后

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