从GWT客户端下载Excel文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从GWT客户端下载Excel文件相关的知识,希望对你有一定的参考价值。

我需要在我的GWT应用程序上生成一个xls文件(在服务器端使用apache-poi生成)来自客户端。我希望当用户点击一个按钮时,出现一个文件选择器,允许他保存生成的文件。

首先,我创建了我的servlet:

public class DownloadServlet extends HttpServlet
{

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        // What I have to insert here?!
    }

    public void getXlsFile()
    {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("Datatypes in Java");
        Object[][] datatypes = { { "Datatype", "Type", "Size(in bytes)" }, { "int", "Primitive", 2 }, { "float", "Primitive", 4 }, { "double", "Primitive", 8 }, { "char", "Primitive", 1 }, { "String", "Non-Primitive", "No fixed size" } };

        int rowNum = 0;

        for (Object[] datatype : datatypes) {
            Row row = sheet.createRow(rowNum++);
            int colNum = 0;
            for (Object field : datatype) {
                Cell cell = row.createCell(colNum++);
                if( field instanceof String ) {
                    cell.setCellValue((String) field);
                }
                else if( field instanceof Integer ) {
                    cell.setCellValue((Integer) field);
                }
            }
        }

        try {
            FileOutputStream outputStream = new FileOutputStream("MyFirstExcel.xlsx");
            workbook.write(outputStream);
            workbook.close();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

现在的问题是:

  • 我如何填写doGet方法?
  • 我如何从客户端调用这个servlet?

请注意,客户端我不知道xls文件路径,因为我想在服务器端“动态”创建xls文件。

答案

您已经创建了一个servlet并准备好了xls文件。您所要做的就是将数据推送到HttpServletResponse对象。

首先,您不需要保存文件。更改getXlsFile()方法以返回XSSFWorkbook并删除最后的try / catch块。

现在,doGet方法:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    HSSFWorkbook workbook = getXlsFile();
    String fileName = "MyFirstExcel.xlsx";

    resp.setStatus(HttpServletResponse.SC_OK);
    resp.setHeader("Content-disposition", "attachment; filename="" + fileName + """);
    resp.setContentType("application/vnd.ms-excel");
    resp.getOutputStream().write(workbook.getBytes());
    resp.getOutputStream().close();
    resp.flushBuffer();

    workbook.close();
}

如何调用服务器?

您需要在web.xml文件中添加servlet映射:

<servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>fully.qualified.className</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>/path/to/the/servlet</url-pattern>
</servlet-mapping>

简而言之:servlet映射将url映射到servlet类。所以,当你打开/path/to/the/servlet时,会调用fully.qualified.className servlet。

以上是关于从GWT客户端下载Excel文件的主要内容,如果未能解决你的问题,请参考以下文章

GWT:从客户端下载文件,无需服务器干预

使用 GWT RemoteServiceServlet 下载文件

在 GWT 中从服务器向客户端发送文件

如何使用 fileUpload 在 GWT 中将文件从客户端传输到服务器

生成动态文件并在 GWT 中下载

在 GWT 中下载时使用 servlet 发送字符串