使用 java 在浏览器中下载 Excel 文件
Download Excel file in browser using java
这个问题我在很多地方都看到了,还是没能解决我的需求
我已经使用 Java 编写代码在 ADF 中的 Apache POI 中生成 excelsheet 并且需要在浏览器中下载它,因为应用程序将在服务器端而不总是在我的本地机器上。
最初我试过代码:
Desktop.getDesktop().open(new File(home + "/Downloads/" + "excel1" + filename + ".xls"));
正在下载。但它只在我的机器上下载。不是在其他机器上下载。
另一个解决方案:
file = new File(home + "/Downloads/" + "excel" + filename + ".xls");
Runtime.getRuntime().exec("cmd.exe /C start " + file);
但是没用..
另一个解决方案:
FacesContext fc = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();
response.reset();
response.setContentType(“application/vnd.ms-excel”);
response.setHeader(“Content-Disposition”, “attachment; filename=\"excel.xlsx");
workbook.write(response.getOutputStream());
fc.responseComplete();
但是这个解决方案也行不通。
我有一个建议可以尝试解决你的问题。
我通常会创建一个 servlet,负责下载各种格式的文件:xls、pdf...
这是一个如何做到这一点的例子:
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String fileName = request.getParameter("fileName");
String contentType = null;
if (fileName.endsWith("xls")) {
contentType = "application/octet-stream";
} else if (fileName.endsWith("pdf")) {
contentType = "application/pdf";
} else {
throw new RuntimeException("File type not found");
}
byte[] file = getFileOnServer(fileName);
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
response.setHeader("charset", "iso-8859-1");
response.setContentType(contentType);
response.setContentLength(file.length);
response.setStatus(HttpServletResponse.SC_OK);
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
outputStream.write(file, 0, file.length);
outputStream.flush();
outputStream.close();
response.flushBuffer();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
private byte[] getFileOnServer(String fileName) {
//implement your method to get the file in byte[]
return null;
}
}
因此,您可以通过 URL:
调用您的 servlet
http://localhost:8080/downloadServlet?fileName=myExcel.xls
或表格:
<form id="myDownloadServlet" action="downloadServlet" method="post">
<input type="text" id="fileName" name="fileName" />
<input type="submit" id="btnDownload" name="btnDownload" value="Download File" />
</form>
不要忘记配置您的 web.xml 或使用注释 @WebServlet。
希望对您有所帮助。
更 "professional" 的解决方案是将 Excel Api 用于 java,作为 Apache POI 或 JXL。
这里有一个使用 JXL 的例子:
还有一个使用 Apache POI 的:
https://programtalk.com/java/download-excel-using-servlet/
希望对您有所帮助。
祝福!
这个问题我在很多地方都看到了,还是没能解决我的需求
我已经使用 Java 编写代码在 ADF 中的 Apache POI 中生成 excelsheet 并且需要在浏览器中下载它,因为应用程序将在服务器端而不总是在我的本地机器上。
最初我试过代码:
Desktop.getDesktop().open(new File(home + "/Downloads/" + "excel1" + filename + ".xls"));
正在下载。但它只在我的机器上下载。不是在其他机器上下载。
另一个解决方案:
file = new File(home + "/Downloads/" + "excel" + filename + ".xls");
Runtime.getRuntime().exec("cmd.exe /C start " + file);
但是没用..
另一个解决方案:
FacesContext fc = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();
response.reset();
response.setContentType(“application/vnd.ms-excel”);
response.setHeader(“Content-Disposition”, “attachment; filename=\"excel.xlsx");
workbook.write(response.getOutputStream());
fc.responseComplete();
但是这个解决方案也行不通。
我有一个建议可以尝试解决你的问题。
我通常会创建一个 servlet,负责下载各种格式的文件:xls、pdf...
这是一个如何做到这一点的例子:
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String fileName = request.getParameter("fileName");
String contentType = null;
if (fileName.endsWith("xls")) {
contentType = "application/octet-stream";
} else if (fileName.endsWith("pdf")) {
contentType = "application/pdf";
} else {
throw new RuntimeException("File type not found");
}
byte[] file = getFileOnServer(fileName);
response.setHeader("Content-disposition", "attachment;filename=" + fileName);
response.setHeader("charset", "iso-8859-1");
response.setContentType(contentType);
response.setContentLength(file.length);
response.setStatus(HttpServletResponse.SC_OK);
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
outputStream.write(file, 0, file.length);
outputStream.flush();
outputStream.close();
response.flushBuffer();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
private byte[] getFileOnServer(String fileName) {
//implement your method to get the file in byte[]
return null;
}
}
因此,您可以通过 URL:
调用您的 servlethttp://localhost:8080/downloadServlet?fileName=myExcel.xls
或表格:
<form id="myDownloadServlet" action="downloadServlet" method="post">
<input type="text" id="fileName" name="fileName" />
<input type="submit" id="btnDownload" name="btnDownload" value="Download File" />
</form>
不要忘记配置您的 web.xml 或使用注释 @WebServlet。
希望对您有所帮助。
更 "professional" 的解决方案是将 Excel Api 用于 java,作为 Apache POI 或 JXL。
这里有一个使用 JXL 的例子:
还有一个使用 Apache POI 的:
https://programtalk.com/java/download-excel-using-servlet/
希望对您有所帮助。 祝福!