0

嗨,我使用扩展 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 组件

4

4 回答 4

0

如果要创建动态 excel 文件表,则可以使用 Apache POI。您可以创建、更新和修改 Excel 工作表。

于 2013-08-23T11:45:25.497 回答
0

如果我没有正确理解您的问题,您希望在对控制器进行异步调用时创建一个 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注解。

于 2013-08-26T15:51:30.687 回答
0

我正在使用 Apache POI 生成一个 excel 文件并填充它。可以在此处找到更多详细信息,示例链接和另一个示例链接

请注意,您不必使用 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
    }
}
于 2013-08-23T15:03:23.253 回答
0

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

1) 使用如何使用 jQuery AJAX 和 Spring MVC 3 从服务器下载文件中提到的隐藏框架

2)重定向浏览器

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

于 2013-08-26T15:19:19.247 回答