Java excel无法通过jsp打开下载的文件

Java excel无法通过jsp打开下载的文件,java,excel,jsp,apache-poi,database-connection,Java,Excel,Jsp,Apache Poi,Database Connection,这是在浏览器上下载excel文件的代码,但当我打开它时,excel会抛出一个错误“excel无法打开文件'Location.xlsx',因为文件格式或文件扩展名无效。请验证文件是否已损坏,以及文件扩展名是否与文件格式匹配”但是当我简单地创建这个文件时,当我执行下载操作并且使用poi jar创建excel文件时,只会出现这个错误 <html> <body> <% LocationDownload.downloadLocation();

这是在浏览器上下载excel文件的代码,但当我打开它时,excel会抛出一个错误“excel无法打开文件'Location.xlsx',因为文件格式或文件扩展名无效。请验证文件是否已损坏,以及文件扩展名是否与文件格式匹配”但是当我简单地创建这个文件时,当我执行下载操作并且使用poi jar创建excel文件时,只会出现这个错误

<html>

    <body>
        <%
   LocationDownload.downloadLocation();
%>
<% 
  String filename = "Location.xlsx";   
  String filepath = "C:\\Users\\dsingh\\GlassFish_Server\\glassfish\\domains\\domain1\\config\\";   
  response.setContentType("application/vnd.ms-excel");   
  response.setHeader("Content-Disposition","attachment; filename=" + filename);   

  java.io.FileInputStream fileInputStream=new java.io.FileInputStream(filepath + filename);  

  int i;   
  while ((i=fileInputStream.read()) != -1) {  
    out.write(i);   
   }   
  fileInputStream.close();   
%>   

    </body>
</html>

首先将文件下载编码移动到Servlet(不要在JSP文件内执行此操作)

请检查此代码,它会有所帮助。。它与我合作的目的与你的要求相同

package edu.zukrah.servlets;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class FileDownload
 */
@WebServlet("/FileDownload")
public class FileDownload extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         File f = new File ("E:/pdftest/" + request.getParameter("file") );
         //set the content type(can be excel/word/powerpoint etc..)

         String type = request.getParameter("type");
         response.setContentType (type);

         //set the header and also the Name by which user will be prompted to save
         response.setHeader ("Content-Disposition", "attachment; filename=\""+request.getParameter("file")+"\"");

         //get the file name
         String name = f.getName().substring(f.getName().lastIndexOf("/") + 1, f.getName().length());

         //OPen an input stream to the file and post the file contents thru the 
         //servlet output stream to the client m/c
          InputStream in = new FileInputStream(f);

        try{
              ServletOutputStream outs = response.getOutputStream();

              int bytesRead;
              byte[] buf = new byte[4 * 1024]; // 4K buffer

              try {
                   while ((bytesRead = in.read(buf)) != -1){ 
                       outs.write(buf, 0, bytesRead);
                   }

              } catch (IOException ioe) {
                  ioe.printStackTrace(System.out);
              }

              System.out.printf(name + ",  %.2f kbs downloaded, %.2f mbs downloaded   \n", 
                                (f.length()/((double)(1024))), 
                                (f.length()/((double)(1024*1024))));

              outs.flush();
              outs.close();
              in.close(); 
        }catch(Exception e){
            e.printStackTrace();
        }
    }


}

JSP使用字符编写器动态生成HTML,而不是二进制输出流,这将损坏excel文件可能与JSP文件的编码重复。。它调用上面的servlet。