目录
i.首先加载WordParseService、OfficeTemService接口
iiii.调用WordParseService中的expFileToWord方法,并传入参数;
b.名称、编码对应数据源主表中的字段名、字段编码;或者您自定义方法中的字段编码;
一、引入依赖
<!--org.apache.poi-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
<exclusions>
<exclusion>
<artifactId>commons-codec</artifactId>
<groupId>commons-codec</groupId>
</exclusion>
<exclusion>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
</exclusion>
<exclusion>
<artifactId>commons-collections4</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-excelant</artifactId>
<version>4.1.2</version>
<exclusions>
<exclusion>
<artifactId>ant</artifactId>
<groupId>org.apache.ant</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
<exclusion>
<artifactId>poi</artifactId>
<groupId>org.apache.poi</groupId>
</exclusion>
</exclusions>
</dependency>
<!--xml解析-->
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>3.1.0</version>
</dependency>
二、后端代码
i.首先加载WordParseService、OfficeTemService接口、拷贝到所需的项目中;
ii.获取导出数据的模板
/**
* 获取模版对象
* @param temCode
* @param refresh
* @return
*/
public DynaBean getTemplate(String temCode, String refresh);
iii.获取导出模板的所需参数
/***
* 根据文档模板拿到需要导出的数据Map
* @param template
* @param whereSql 导出数据的whereSql
* @return Map<String, Object> String-数据源NAME,Object--数据(DynaBean或List<DynaBean></>)
*/
Map<String, Object> assembleDatas(DynaBean template,String whereSql);
/***
* 根据文档模板拿到数据源字段Map
* @param template
* @return Map<String, Map<String, DynaBean>> --Map<数据源NAME,Map<字段名,字段DynaBean></>></>
*/
Map<String, Map<String, DynaBean>> assembleFieldData(DynaBean template);
/***
* 根据文档模板拿到数据源Map
* @param template
* @return Map<String, DynaBean> --String -数据源Name,DynaBean-数据源Bean
*/
Map<String, DynaBean> assembleDataSource(DynaBean template);
iiii.调用WordParseService中的expFileToWord方法,并传入参数;
/****
* word导出
* @param template 文档模板
* @param officeDataSource 数据源Map
* @param officeDatas 需要导出的数据Map
* @param officeField 数据源字段Map
* @param returnObj
* @return
*/
public InputStream expFileToWord(DynaBean template,Map<String,DynaBean> officeDataSource,Map<String,Object> officeDatas, Map<String,Map<String,DynaBean>> officeField, JSONObject returnObj);
iiiii.示例
@RequestMapping(value = "/downloadWord")
@ResponseBody
public void downloadWord(MethodArgument param){
JSONObject returnObj=new JSONObject();
HttpServletRequest request=param.getRequest();
//获取全部参数
String dataStr = request.getParameter("data");
if(StringUtil.isEmpty(dataStr)){
throw new PlatformException("参数格式错误", PlatformExceptionEnum.JE_CORE_EXCEL_EXP_ERROR, request);
}
//base64转码
dataStr = Base64.decodeStr(dataStr);
//获取参数集
com.alibaba.fastjson.JSONObject params = com.alibaba.fastjson.JSONObject.parseObject(dataStr);
String code="";
if(params.containsKey("code")){
code=params.getString("code");
}
String fileName="";
if(params.containsKey("fileName")){
fileName=params.getString("fileName");
}
String whereSql="";
if(params.containsKey("whereSql")){
whereSql=params.getString("whereSql");
}
//模板
DynaBean template=officeTemService.getTemplate(code,"0");
//数据源
Map<String,DynaBean> officeDataSource =wordParseService.assembleDataSource(template);
//根据模板文件,拿到数据源,然后根据数据源拿到所有的数据
Map<String,Object> officeDatas = wordParseService.assembleDatas(template,whereSql);
//拿到字段展示方式
Map<String,Map<String,DynaBean>> officeField = wordParseService.assembleFieldData(template);
//模板替换
try {
InputStream inputStream = wordParseService.expFileToWord(template, officeDataSource,officeDatas, officeField, returnObj);
if(returnObj.containsKey("errorMsg")){
throw new PlatformException(returnObj.getString("errorMsg"), PlatformExceptionEnum.JE_DOC_ERROR,new Object[]{code,officeDatas});
}else{
HttpServletResponse response=param.getResponse();
response.reset();
if(StringUtil.isEmpty(fileName)){
fileName=returnObj.getString("fileName");
}
fileName = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
response.setHeader("Content-Length", String.valueOf(inputStream.available()));
//写入文件流
response.setContentType("application/octet-stream");
OutputStream toClient = response.getOutputStream();
IoUtil.copy(inputStream, toClient);
IoUtil.close(inputStream);
toClient.flush();
toClient.close();
}
}catch (PlatformException e){
throw e;
} catch (Exception e) {
throw new PlatformException("生成输出流文件报错", PlatformExceptionEnum.JE_DOC_ERROR,new Object[]{code,officeDatas});
}
}
三、功能配置
i.创建数据源(主表)
注意:
a.数据方式:单条数据、多条数据
单条数据--表单内的所有数据一一对应;
示例:
多条数据--导出为列表;
示例:
aa.读取方式:业务表、自定义
业务表:填写表名称、表编码、过滤条件(没有可以不填),系统自动读取;
自定义:填写类名、方法名,由开发人员自主实现;数据格式为:单条数据返回DynaBean;多条数据返回List<DynaBean>;
ii.创建数据字段(子表)
注意:
b.名称、编码对应数据源主表中的字段名、字段编码;或者您自定义方法中的字段编码;
bb.字段类型:文本、数据字典、图片、word文档
文本:普通文本,不具有特殊性;配置信息为空;
示例:
数据字典:导出为多选框并选中;配置信息为:数据字典编码,是否换行;
示例:
图片:导出为图片;配置信息为:宽、高;
示例:
word文档:导出为在指定位置拼接当前字段的word文档;配置信息为空;
示例:
iii.文档模板
c.新建文档模板
注意:
d.模板文件编辑
新建word文档(.docx),将数据源中的数据源编码+数据源字段填入到你想导出word的相应位置;然后上传至文档模板;
示例:
dd.主表编码:要导出表数据的主表的表编码;
ddd.数据源编码:选择刚才创建的相应的数据源;
示例:
iiii.前端代码
e.点击下载代码,全选复制到相应按钮,保存即可;