需求:需要导出一个excele,导出包含两部分内容(1.jsp界面table 指定的两个列(非全部) 2.手动绘制的一部分其他内容。)最后要将两部分内容合并成一个新的excele并导出。
实现思路:首先通过页面上<a>标签或者按钮触发,传递参数到后台,参数完成处理后在服务端生成一个.xls 文件,随后客户端使用response对象调用getOutPutStream() 返回给浏览器一个输出流晚上文件下载。(注意:此种方式不可使用ajax ,因为ajax 不能识别后台返回给前台的输出流信息,造成无法下载的结果)。
框架:SpringMVC(功能跟框架实质没关系,只需要关注一点,将所需要的参数传递到对应方法中或者向需要导出的方法发出请求即可)。
由于是变看POI 文档边做,dome 写的不好,现将优化前dome 贴出作为笔记,供后参考。
前端界面使用<a>标签使用href带参 向Controller发起请求: dome 如下;
<c:if test="${empty childNodeOperations}">
<a style="color:red"
href='${ctxPath}/system/specimen/toExport/${mrmcatalogsortapptemplatebo.id}/${mrmcatalogsortapptemplatebo.tempName}' id='export'>模板导出</a>
</c:if>
Controller 后台接收参数做处理,调用模板生成类生成模板:dome 如下;
/***
* 导出配置模板
* **/
@ResponseBody
@RequestMapping(value = "/toExport/{id}/{tempName}",method =RequestMethod.GET)
public void get(@PathVariable("id") String id,@PathVariable("tempName") String tempName,HttpServletRequest request,HttpServletResponse response){
POIExport poi = new POIExport();
MrmCatalogSortAppTemplateBo bo = null;
List<String> descNames = new ArrayList<String>();
List<String> dateTypes = new ArrayList<String>();
try {
//文件设置
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.reset();
response.setContentType("application/x-msexcel");
String fileName = URLEncoder.encode(tempName+"藏品配置模板", "utf-8");
response.addHeader("Content-Disposition", "attachment; filename="
+ new String(fileName.getBytes("utf-8"), "ISO8859-1") + ".xls");
bo = cataSortAppTeService.getByTreeId(id);
for( int j =0 ;j<bo.getOperations().size();j++){
descNames.add(bo.getOperations().get(j).getDescName());
dateTypes.add(bo.getOperations().get(j).getDateType());
}
if (bo != null && !"".equals(bo)) {
if (!"0".equals(bo.getParentId())) {