从 GWT 客户端下载 Excel 文件

Download Excel file from GWT client

我需要在我的 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();
        }
    }
}

现在的问题是:

请注意,客户端我不知道 xls 文件路径,因为我想在服务器端创建 xls 文件 "on the fly"。

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

首先,您不需要保存文件。将 getXlsFile() 方法更改为 return 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 class。因此,当您打开 /path/to/the/servlet 时,将调用 fully.qualified.className servlet。