【问题标题】:how to create excel sheet without return ModelAndView?如何在不返回 ModelAndView 的情况下创建 excel 工作表?
【发布时间】:2013-08-23 11:12:47
【问题描述】:

您好,我使用扩展 AbstractExcelView 创建 excel 表,我编写以下代码

public ModelAndView exportToExcel(HttpServletRequest request, @RequestParam Map<String, ? extends Object> params, ShipmentDetailsSearchInput shipmentDetailsInputType) throws ParseException
    {

        Map<String, Object> excelMap = new HashMap<String, Object>();
        return new ModelAndView("ExcelReport", UIErrorMessages.DATA, excelMap);
    }

我不会在 Extjs Ajax 响应中获得文件下载成功的 Ajax 响应,因为 ModelAndView 在提交 ajax 调用中没有给出任何响应。

我们如何在 spring 3 中编写没有 modeandview 的 restful excel-download 组件

【问题讨论】:

  • 你的问题对我来说不是很清楚。但是您可以将HttpServletResponse 作为参数传递并直接将Excel 文件写入输出流。是你要找的吗?
  • 不,我使用 AbstractExcelView 创建动态 excel 文件
  • 好的,但是您可以使用 Apache POI 直接在给定的 OutputStream 上写入 Excel 文件。
  • 你有很好的链接,然后与我分享。
  • Apache POI -> poi.apache.org

标签: java spring excel spring-mvc


【解决方案1】:

如果您想创建动态 excel 文件表,那么您可以使用 Apache POI。您可以创建、更新和修改 Excel 表。

【讨论】:

  • 在这种情况下,我不会下载这两个文件并获取一个我无法获得的 AJAX 调用的状态
【解决方案2】:

我正在使用 Apache POI 生成一个 Excel 文件并进行填充。 更多细节可以在hereexample link和另一个example link找到。

请注意,您不必使用 Ajax,可以直接将 GET 请求映射到方法 exportToExcel

为避免返回 ModelAndView 对象,您可以直接将生成的文件写入响应流。 您必须将 ContentTypeHttpServletResponse 标头设置为适当的格式, 如下图:

public void exportToExcel(HttpServletRequest request, @RequestParam Map<String, ? extends Object> params, ShipmentDetailsSearchInput shipmentDetailsInputType, 
HttpServletResponse response) throws ParseException
    {

 //  Map<String, Object> excelMap = new HashMap<String, Object>();
 //  return new ModelAndView("ExcelReport", UIErrorMessages.DATA, excelMap);
      String fileName = "RandomFile";
      HttpHeaders header = new HttpHeaders();
      header.setContentType(new MediaType("application", "vnd.ms-excel"));
      response.setHeader("Content-disposition", "attachment; filename=" + fileName);
//method to create Workbook
      Workbook book = createFileAndFillDetails();

       try {
        book.write(response.getOutputStream());
    }
    catch (IOException e) {
        //Handle error
    }
}

【讨论】:

  • 嗨,但我不会在 Ajax 响应中返回消息,无效消息返回不起作用。
【解决方案3】:

如果您必须使用 Ajax,则没有直接的解决方案。你剩下的选择是:

1) 使用How to download file from server using jQuery AJAX and Spring MVC 3中提到的隐藏框架

2) 重定向浏览器

3) 根本不要使用 ajax,因为 ajax/jquery 对处理这种情况没有用处。带有 GET 请求的 url 提供了简单的方法,如建议的其他解决方案中所述。

【讨论】:

    【解决方案4】:

    如果我没有正确理解您的问题,您希望在对控制器进行异步调用时创建一个 excel 电子表格(因此通过 AJAX)。

    首先,我认为通过 ajax 调用下载文件不是一个好主意。如果您的问题是生成 Excel 电子表格的时间很长,我建议您异步生成它(例如在单独的线程中),而不是通过经典的 GET 请求下载生成的文件。

    我正在一个生成大型 CSV 文件的 Web 应用程序中做类似的事情。我正在使用这个简单的方法来获取生成的文件:

    @RequestMapping(value = "/file", method = RequestMethod.GET)
    public void getFile(
            @RequestParam(value = "token", required = false) String token,
            HttpServletResponse response) throws Exception {
    
            // my logic...
    
            String formattedDataString = exportTask.getResults());
    
            response.setHeader("Content-Disposition", "attachment; filename=\""
                    + exportTask.getExportFileName() + "\"");
            response.setContentType("text/plain; charset=utf-8");
            IOUtils.copy(
                    new ByteArrayInputStream(formattedDataString.getBytes()),
                    response.getOutputStream());
            response.flushBuffer();
        }
    }
    

    在我的页面中,我有一个这样的简单链接:

    <c:url var="fileUrl" value="results/file">
            <c:param name="token" value="${token}" />
        </c:url>
    <a href='<c:out value="${fileUrl}" />'>Get File</a>
    

    在我的例子中,token 参数标识了生成的文件,该文件存储在本地数据库中。

    不过,如果你还想用ajax,建议你看看@ResponseBody注解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多