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

YLG*_*YLG 1 java excel apache-poi oracle-adf

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

\n\n

我已经编写了使用 Java 在 ADF 中的 Apache POI 中生成 excelsheet 的代码,并且需要在浏览器中下载它,因为应用程序将在服务器端而不总是在我的本地计算机中。

\n\n

最初我尝试了代码:

\n\n
Desktop.getDesktop().open(new File(home + "/Downloads/" + "excel1" + filename + ".xls"));\n
Run Code Online (Sandbox Code Playgroud)\n\n

正在下载。但它只在我的机器上下载。它没有在其他机器上下载。

\n\n

另一个解决方案:

\n\n
file = new File(home + "/Downloads/" + "excel" + filename + ".xls");\nRuntime.getRuntime().exec("cmd.exe /C start " + file);\n
Run Code Online (Sandbox Code Playgroud)\n\n

但它不起作用..

\n\n

另一个解决方案:

\n\n
FacesContext fc = FacesContext.getCurrentInstance();\nHttpServletResponse response = (HttpServletResponse) fc.getExternalContext().getResponse();\nresponse.reset();\nresponse.setContentType(\xe2\x80\x9capplication/vnd.ms-excel\xe2\x80\x9d);\nresponse.setHeader(\xe2\x80\x9cContent-Disposition\xe2\x80\x9d, \xe2\x80\x9cattachment; filename=\\"excel.xlsx");\nworkbook.write(response.getOutputStream());\nfc.responseComplete();\n
Run Code Online (Sandbox Code Playgroud)\n\n

但这个解决方案也行不通。

\n

小智 5

我有一个建议来尝试解决您的问题。

我通常创建一个 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

因此,您可以通过 URL 调用您的 servlet:

http://localhost:8080/downloadServlet?fileName=myExcel.xls

或表格:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

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

我希望我有所帮助。