您好我使用扩展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组件
答案 0 :(得分:0)
如果要创建动态Excel文件表,则可以使用Apache POI。您可以创建,更新和修改Excel工作表。
答案 1 :(得分:0)
我正在使用Apache POI生成excel文件并填充它。 可以找到更多详细信息here,example link和另一个example link。
请注意,您不必使用Ajax,并且可以直接将GET请求映射到方法exportToExcel
。
为避免返回ModelAndView对象,可以直接将生成的文件写入响应流。
您必须将ContentType
和HttpServletResponse
标头设置为适当的格式,
如下所示:
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
}
}
答案 2 :(得分:0)
如果必须使用Ajax,则没有直接的解决方案。您剩下的选择是:
1)使用How to download file from server using jQuery AJAX and Spring MVC 3
中提到的隐藏框架2)重定向浏览器
3)根本不要使用ajax,因为ajax / jquery对处理这种情况没有用。具有GET请求的URL提供了简单的方法,如提出的其他解决方案中所述。
答案 3 :(得分:0)
如果我没有正确理解您的问题,您需要在对控制器进行异步调用时创建excel电子表格(通过AJAX)。
首先,我不认为通过ajax调用下载文件是个好主意。如果您的问题需要很长时间来生成Excel电子表格,我建议您异步生成(例如,在单独的线程中),而不是通过经典的GET请求下载生成的文件。
我在Web应用程序中执行类似的操作,生成大型CSV文件。我正在使用这个简单的方法来获取生成的文件:
@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
注释。