使用java在浏览器中下载Excel文件

使用java在浏览器中下载Excel文件,java,excel,apache-poi,oracle-adf,Java,Excel,Apache Poi,Oracle Adf,我已经在很多地方看到了这个问题,但仍然无法解决我的要求 我已经用Java编写了用ApachePOI在ADF中生成excelsheet的代码,需要在浏览器中下载,因为应用程序将位于服务器端,而不总是在本地机器中 最初我尝试了以下代码: Desktop.getDesktop().open(new File(home + "/Downloads/" + "excel1" + filename + ".xls")); 它正在下载。但它只在我的机器上下载。它没有在其他机器上下载 另一个解决方案: fil

我已经在很多地方看到了这个问题,但仍然无法解决我的要求

我已经用Java编写了用ApachePOI在ADF中生成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();
但是它不起作用

另一个解决方案:

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 http://localhost:8080/downloadServlet?fileName=myExcel.xls 或形式:


不要忘记配置web.xml或使用注释@WebServlet


希望我能帮上忙。

我有一个建议,想办法解决你的问题

我通常创建一个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 http://localhost:8080/downloadServlet?fileName=myExcel.xls 或形式:


不要忘记配置web.xml或使用注释@WebServlet

希望我有所帮助。

一个更“专业”的解决方案是使用Excel Api for java,如Apache POI或JXL

下面是使用JXL的示例:

这里还有一个使用Apache POI的示例:

我希望这能帮助你。 致以最良好的祝愿

更“专业”的解决方案是使用Excel Api for java,如Apache POI或JXL

下面是使用JXL的示例:

这里还有一个使用Apache POI的示例:

我希望这能帮助你。
致以最良好的祝愿

带有
response.getOutputStream()
的最后一个解决方案应该可以工作;在使用
fc.responseComplete()断言之前,似乎需要
workbook.flush()或类似的东西所有内容都已编写。实际上我尝试了工作簿.flush()。但它没有下载。我删除了fc.responseComplete();从代码中。。但即使它没有下载@JoopEggenLast解决方案,对我来说也几乎没问题。。。您是否尝试关闭()工作簿并刷新()输出流?拆分问题以查找原因(暂时)。将工作簿存储为服务器文件并进行检查。交付一个静态Excel文件。很痛苦,但即使是tom似乎也相信您的上一个解决方案看起来是正确的。带有
response.getOutputStream()
的上一个解决方案应该可以工作;在使用
fc.responseComplete()断言之前,似乎需要
workbook.flush()或类似的东西所有内容都已编写。实际上我尝试了工作簿.flush()。但它没有下载。我删除了fc.responseComplete();从代码中。。但即使它没有下载@JoopEggenLast解决方案,对我来说也几乎没问题。。。您是否尝试关闭()工作簿并刷新()输出流?拆分问题以查找原因(暂时)。将工作簿存储为服务器文件并进行检查。交付一个静态Excel文件。很痛苦,但即使是汤姆似乎也相信你最后的解决方案看起来是正确的。