使用Spring MVC控制器返回excel xlsx电子表格的“正确”方法是什么?

时间:2014-11-19 17:27:16

标签: java excel spring spring-mvc

我已经提出了至少三种不同的方法来解决这个问题。

1)我可以使用@ResponseBody并返回一个字符串,就像我对这个csv一样:

@RequestMapping(value = "googleStoreReport", produces = "text/csv")
@ResponseBody
public String googleStoreReport(HttpServletRequest request, HttpServletResponse response, Model model) {
    List<Store> stores = storeService.getActiveStores();
    List<SapStore> sapStores = sapStoreService.getAllSapStores();
    response.setHeader("Content-Disposition", "attachment; filename=\"Google_Places_Bulk_Store_Upload.csv\"");
    response.setContentType("text/csv");
    StringBuilder sb = new StringBuilder();
.... create file contents ....
    return sb.toString();
}

2)我可以使用这里描述的视图:(我将不得不创建自己的Spring AbstractExcelView版本)http://www.technicalkeeda.com/spring-tutorials/generate-excel-using-spring-mvc这里的方法是让控制器返回一个带有List对象的ModelAndView对象包含行数据。然后你有一个View对象,它使用Poi将List转换为电子表格,并将电子表格作为流写入响应对象。

3)我可以使用MappingJackson2HttpMessageConverter作为模板扩展AbstractHttpMessageConverter。我返回列表而不是ModelAndView对象。 MessageConverter的工作方式与ViewResolver相同,但适用于Request Lifecycle的不同部分。 (将列表转换为电子表格数据流)

我主要建议:扩展AbstractView或AbstractHttpMessageConverter。我确实找到了三年前这篇不错的帖子http://java.dzone.com/articles/rest-spring,但作者遇到了同样的问题。为了让事情更加混乱,Spring MVC似乎使用了两种方法..

3 个答案:

答案 0 :(得分:0)

您是否考虑过扩展您的第一个解决方案以包含一些其他基于xml的api,例如Jasper报告,以便您将数据与视图分离?

答案 1 :(得分:0)

刚刚和同事谈过这个问题并制定了一个指导我决定的规则。消息转换器似乎被设计为获取对象或对象集合并应用一组规则。这种格式化适用于Json,或者如果您有一个可以帮助转换器格式化XML的模式。另一方面,如果您输出的数据可能具有多个没有架构的严格格式,那么视图效果很好。您可以创建基本视图类来处理Excel Spread表。然后为每个单独的电子表格类型扩展基类。

这回答了我的具体问题。我相信我还没有充分探讨这个问题,并欢迎任何进一步的意见。

答案 2 :(得分:0)

根据经验,我会使用输出格式的消息转换器很简单,而在其他情况下使用视图。

如果控制器方法总是生成相同的输出格式(总是CSV),因为不需要模板来生成CSV文件,我会使用MessageConverter

相反,如果你想生成一个xlsx文件,我宁愿使用一个视图,因为一个视图可以使用一个模板。