准备poi所依赖的jar包.
放到工程的lib文件夹下.本文中项目所使用的jar包为:
- poi-3.15.jar,
- poi-ooxml-3.15.jar,
- poi-ooxml-schemas-3.15.jar
场景描述:
前台用easyui框架(这里博主用的是easyui框架,其他框架道理一样),选中一条数据,进行方案导出.效果截图如下:
利用poi导出excel大体思路:
利用poi导出excel大体思路:
1,需要导出的原始数据.即根据实际需求查询得到的结果集作为原始数据.可能是一个list,map...看你封装成什么样了(这里是封装成list了)
2,将原始的数据转换到excel中,具体根据数据形式不同,写法也会不同.不过这些都是大同小异的.
3,将生产好的excel文件写到一个路径下(这里都是放到tomcat服务器目录下的download下).
4,根据上一步的路径找到excel文件进行下载操作(就是文件下载...网上一大片)
下面看各个层的代码,以及excel工具类.具体步骤,代码中注释已经写到很明白了.
Controller层代码:
/**
* 导出新闻方案
* @param Integer[] newsScheme方案id数组
* @throws Exception
*/
@RequestMapping(value = "newsSchemes/export/{newsSchemesId}",method = RequestMethod.POST)
public void exportNewsScheme(@PathVariable("newsSchemesId") Integer newsSchemesId) throws Exception{
System.err.println("导出的方案的id:"+newsSchemesId);
//切换到rsdb数据库
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_RSDB);
//查询的结果集,list为需要在表格中展示的数据
List<NewsMediaCategory> list = this.newsMediaCategoryService.listNewsMediaCateBySid(new NewsMediaCategory(newsSchemesId));
//循环将自定义媒体对应的新闻源集合存入到list中.
if(list != null && list.size()>0){
for(int i=0;i<list.size();i++){
//切换到rsdb数据库
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_RSDB);
//获取site_id数组
Integer[] sIds = this.newsMediaCategoryService.listSidsByNewsMediaCateId(list.get(i).getId());
//切换到RSNews数据库
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_RSNEWS);
List<Site> siteList = this.siteService.listBySids(new Site(sIds));
//List<Site> site = this.siteMapper.listBySids(null)
list.get(i).setSiteList(siteList);
list.get(i).setSids(sIds);
}
}
for(NewsMediaCategory nmc : list){
System.err.println(nmc.getName()+"--------"+nmc.getSiteList().size());
}
//切换到rsdb数据库
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_RSDB);
//根据方案id查询方案基本信息,主要是为了获取导出时候的默认名为(当前方案名+时间戳)
NewsSchemes newsScheme = this.newsSchemesService.selNewsSchemesBySchemesId(newsSchemesId);
//获取欲下载的文件路径
String filePath =this.newsSchemesService.createNewSchemesExcel(newsScheme,list,this.request);
//执行下载操作
ExcelUtils.download(filePath , this.request , this.response);
}
service层代码:
这里需要说明下:步骤大体是这么搞,但是样式需要根据不同需求来设定,其中的逻辑也会不一样的.此处导出的样式如下图:
代码如下:
1,需要导出的原始数据.即根据实际需求查询得到的结果集作为原始数据.可能是一个list,map...看你封装成什么样了(这里是封装成list了)
2,将原始的数据转换到excel中,具体根据数据形式不同,写法也会不同.不过这些都是大同小异的.
3,将生产好的excel文件写到一个路径下(这里都是放到tomcat服务器目录下的download下).
4,根据上一步的路径找到excel文件进行下载操作(就是文件下载...网上一大片)
下面看各个层的代码,以及excel工具类.具体步骤,代码中注释已经写到很明白了.
Controller层代码:
/**
* 导出新闻方案
* @param Integer[] newsScheme方案id数组
* @throws Exception
*/
@RequestMapping(value = "newsSchemes/export/{newsSchemesId}",method = RequestMethod.POST)
public void exportNewsScheme(@PathVariable("newsSchemesId") Integer newsSchemesId) throws Exception{
System.err.println("导出的方案的id:"+newsSchemesId);
//切换到rsdb数据库
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_RSDB);
//查询的结果集,list为需要在表格中展示的数据
List<NewsMediaCategory> list = this.newsMediaCategoryService.listNewsMediaCateBySid(new NewsMediaCategory(newsSchemesId));
//循环将自定义媒体对应的新闻源集合存入到list中.
if(list != null && list.size()>0){
for(int i=0;i<list.size();i++){
//切换到rsdb数据库
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_RSDB);
//获取site_id数组
Integer[] sIds = this.newsMediaCategoryService.listSidsByNewsMediaCateId(list.get(i).getId());
//切换到RSNews数据库
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_RSNEWS);
List<Site> siteList = this.siteService.listBySids(new Site(sIds));
//List<Site> site = this.siteMapper.listBySids(null)
list.get(i).setSiteList(siteList);
list.get(i).setSids(sIds);
}
}
for(NewsMediaCategory nmc : list){
System.err.println(nmc.getName()+"--------"+nmc.getSiteList().size());
}
//切换到rsdb数据库
DataSourceContextHolder.setDbType(DataSourceType.SOURCE_RSDB);
//根据方案id查询方案基本信息,主要是为了获取导出时候的默认名为(当前方案名+时间戳)
NewsSchemes newsScheme = this.newsSchemesService.selNewsSchemesBySchemesId(newsSchemesId);
//获取欲下载的文件路径
String filePath =this.newsSchemesService.createNewSchemesExcel(newsScheme,list,this.request);
//执行下载操作
ExcelUtils.download(filePath , this.request , this.response);
}
service层代码:
这里需要说明下:步骤大体是这么搞,但是样式需要根据不同需求来设定,其中的逻辑也会不一样的.此处导出的样式如下图:
代码如下: