这是在浏览器上下载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>
答案 0 :(得分:0)
首先将文件下载编码移动到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();
}
}
}