Загрузить файл Excel из клиента GWT - PullRequest
1 голос
/ 29 апреля 2019

Мне нужно сгенерировать в моем приложении GWT файл xls (сгенерированный на стороне сервера с помощью apache-poi) от клиента.Я хочу, чтобы когда пользователь нажимал на кнопку, появлялось окно выбора файла, позволяющее ему сохранить сгенерированный файл.

Для начала я создал свой сервлет:

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?
  • И как я могу вызвать этот сервлет со стороны клиента?

Обратите внимание, что клиентсторона Я не знаю путь к файлу xls, потому что я хочу создать файл xls "на лету" на стороне сервера.

1 Ответ

1 голос
/ 29 апреля 2019

Вы создали сервлет и у вас есть готовый файл 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-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>

Вкратце: отображение сервлета отображение URL-адрес класса сервлета. Итак, когда вы открываете /path/to/the/servlet, вызывается сервлет fully.qualified.className.

...