代码之家  ›  专栏  ›  技术社区  ›  YLG

用Java下载浏览器中的Excel文件

  •  0
  • YLG  · 技术社区  · 6 年前

    我见过这么多地方,但还是不能解决我的要求。

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

    最初我尝试代码:

    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();
    

    但这个解决方案也不起作用。

    2 回复  |  直到 5 年前
        1
  •  1
  •   Mr. Polywhirl    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;
        }
    
    }
    

    因此,您可以通过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。

    我希望我能帮上忙。

        2
  •  0
  •   Arsensys    6 年前

    一个更专业的解决方案是使用Java API作为Apache POI或。

    下面是使用JXL的示例:

    https://www.java-tips.org/other-api-tips-100035/93-jexcel/418-how-do-i-output-an-excel-file-from-a-servlet.html

    这里还有一个使用apache poi的方法:

    https://programtalk.com/java/download-excel-using-servlet/

    我希望这能帮助你。 最美好的祝福!