Java servlet 试图输出一个 xlsx 文件,但不断获取八位字节流

标签 java servlets

我正在尝试在 servlet 中创建一个 xlsx 文件并将其发送到浏览器,用户可以在浏览器中保存或下载该文件。目前它一直在发送应用程序/八位字节流而不是 excel 文件。

我做错了什么?

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        SXSSFWorkbook wb = new SXSSFWorkbook();
        Sheet sheet = wb.createSheet("Results");
        List<List<TableData>> results = (List<List<TableData>>) request.getSession().getAttribute("results");
        String tableName = (String) request.getSession().getAttribute("tableName");
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        String filename = tableName+"-"+df.format(date)+".xlsx";

        int rowCounter = 0;

        // Create the rows
        for(List<TableData> l : results) {

            int counter = 0;
            Row row = sheet.createRow(rowCounter);

            for(TableData td : l) {

                Cell cell = row.createCell(counter);

                // if we're on the first row, get the column description, else get the data
                if(rowCounter == 0) {
                    cell.setCellValue(td.getColumnDescription());
                } else {
                    cell.setCellValue(td.getData());
                }
                counter++;
            }
            rowCounter++;
        }

        try {
            OutputStream out = response.getOutputStream();
            wb.write(out);
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setHeader("Expires:", "0"); // eliminates browser caching
            response.setHeader("Content-Disposition", "attachment; filename="+filename);
            out.flush();
            out.close();

        } catch (Exception e) {
            LOG.debug(e.getStackTrace().toString());
        } 
    }

最佳答案

在发送正文之前设置内容类型和标题。它们被称为 headers 是有充分理由的 :-)

关于Java servlet 试图输出一个 xlsx 文件,但不断获取八位字节流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14448139/

相关文章:

java - 保护 Android 中的信息

java - 尝试在我的java代码中打印数组

java - 使用 OpenEJB 构建独立的可执行 JAR

java - 由较新版本的 Java Runtime(类文件版本 55.0)编译,此版本的 Java Runtime 只能识别 52.0 以下的类文件版本

java - 当我在jsp中调用request.getAttribute时它为null

java - Servlet 3.1 - 部件 - 方法 getParts() 未解决

java - 如何从 HttpServletRequest 获取 URL 的一部分?

Java .split() 不工作

java - 下载时显示空白 PDF

java - 如何以指定的时间间隔自动定期调用 servlet