1.后台restful api,组装文件输出流对象到response响应包输出到前端(vue+webpack node管理)。
后台接口:根据projectId查询相关数据,并将相关字段封装到word模板中,最后用流输出文件。
控制层代码
@RequestMapping("/exportToWord")
@ResponseBody
public void exportToWord(HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value = "projectId", required = true) String projectId) {
try {
String path = request.getSession().getServletContext().getRealPath("\\");
projectDocService.exportToWord(response,projectId,path);
} catch (Exception e) {
logger.error("事项导出成word失败:", e);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
业务层代码
public void exportToWord(HttpServletResponse response,String projectId,String path) throws Exception{
HashMap<String,Object> params=new HashMap<String,Object>();
params.put("projectId", projectId);
HashMap<String, Object> projectMap = projectDao.queryProjectDetailByPid(params);
if(projectMap!=null){
// 导出基本信息
operatorProject(projectMap, path);
String downpath = path + "FileDownload/govsdm/Download/project.docx";
String erweimapath = path + "FileDownload/govsdm/QRCode/project.jpg";
String srcpath = path + "FileDownload/govsdm/Export/project.docx";
FileInputStream inputStream = new FileInputStream(erweimapath);
Map<String, FileInputStream> maps = new HashMap<String, FileInputStream>(
0);
maps.put("$erweima", inputStream);
CustomXWPFDocument customXWPFDocument = new CustomXWPFDocument();
// 插入二维码
customXWPFDocument.searchAndReplaceImg(srcpath, downpath,
erweimapath, maps);
download(downpath, response, projectMap.get("projectName").toString());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
导出的word模板如下图:
public void operatorProject(Map<String, Object> projectMap, String path) throws Exception {
HashMap<String, Object> map = new HashMap<String, Object>();
//事项基本信息
map.put("${projectNo}", projectMap.get("projectNo"));
map.put("${projectName}", projectMap.get("projectName"));
map.put("${PROJECTNAMEBIAOTI}", projectMap.get("projectName"));
map.put("${deptName}", projectMap.get("deptName"));
map.put("${itemName}", projectMap.get("itemName"));
map.put("${projectItemNo}", projectMap.get("projectItemNo"));
map.put("${projectShowNo}", projectMap.get("projectShowNo"));
map.put("${gridNo}", projectMap.get("gridNo"));
map.put("${PROJECT_TYPE_NAME}", projectMap.get("PROJECT_TYPE_NAME"));
map.put("${SERVICE_TYPE_NAME}", projectMap.get("SERVICE_TYPE_NAME"));
map.put("${CASE_TYPE_NAME}", projectMap.get("CASE_TYPE_NAME"));
map.put("${DEAL_TYPE_NAME}", projectMap.get("DEAL_TYPE_NAME"));
map.put("${TONGBAN_RANGE_NAME}", projectMap.get("TONGBAN_RANGE_NAME"));
map.put("${RUN_SYSTEM_TYPE_NAME}", projectMap.get("RUN_SYSTEM_TYPE_NAME"));
map.put("${POWER_UPDATE_TYPE_NAME}", projectMap.get("POWER_UPDATE_TYPE_NAME"));
map.put("${POWER_STATE_NAME}", projectMap.get("POWER_STATE_NAME"));
map.put("${ACCEPTING_RANGE_NAME}", projectMap.get("ACCEPTING_RANGE_NAME"));
map.put("${IMPLEMET_SUBJECT_NATURE_NAME}", projectMap.get("IMPLEMET_SUBJECT_NATURE_NAME"));
map.put("${AUTHORITY_DIVISION_NAME}", projectMap.get("AUTHORITY_DIVISION_NAME"));
map.put("${STREET_DEAL_AUTHORITY_NAME}", projectMap.get("STREET_DEAL_AUTHORITY_NAME"));
map.put("${DISTRIBUTE_SYS_TYPE_NAME}", projectMap.get("DISTRIBUTE_SYS_TYPE_NAME"));
map.put("${distributeSysUrl}", projectMap.get("distributeSysUrl"));
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String date =sdf.format(new Date());
map.put("${riqi}", date);
//查询字典表--审批类型
HashMap<String,Object> projectTypeMap = new HashMap<String,Object>();
projectTypeMap.put("dictCode", "1003");
List<HashMap<String, Object>> projectTypeList = sysDictInfoDao.findList(new RowBounds(), projectTypeMap);
String projectType = combinationString(projectTypeList, String.valueOf(projectMap.get("projectType")));
// 事项类型
map.put("${SHIXIANGLEIXING}", projectType);
//查询字典表--办理类型
HashMap<String,Object> dealTypeMap = new HashMap<String,Object>();
dealTypeMap.put("dictCode", "1004");
List<HashMap<String, Object>> dealTypeList = sysDictInfoDao.findList(new RowBounds(), dealTypeMap);
String dealType = combinationString(dealTypeList, String.valueOf(projectMap.get("dealType")));
// 办理类型
map.put("${BANLILEIXING}", dealType);
//办事指南基本信息
HashMap<String, Object> paramsMap = new HashMap<String, Object>();
paramsMap.put("projectId",String.valueOf(projectMap.get("projectId")));
HashMap<String, Object> summaryList = projectSummaryDao.queryProjectSummaryById(paramsMap);
summaryList=StringUtils.clobToStringByMap(summaryList);//办事指南信息
List<HashMap<String,Object>> projectFoundationList=projectFoundationDao.findList(new RowBounds(), paramsMap);
projectFoundationList=StringUtils.clobToStringByList(projectFoundationList);//设立依据信息
String foundation="";
if(projectFoundationList!=null && projectFoundationList.size()>0){
for(HashMap<String,Object> map1:projectFoundationList){
String categoryName=map1.get("categoryName")==null?"":map1.get("categoryName").toString();
String name=map1.get("name")==null?"":map1.get("name").toString();
String organization=map1.get("organization")==null?"":map1.get("organization").toString();
String issueOrderno=map1.get("issueOrderno")==null?"":map1.get("issueOrderno").toString();
foundation+="["+categoryName+"]"+name+"("+organization+issueOrderno+")"+";";
}
}
map.put("${foundation}", foundation);
// 申请材料清单
String applyMaterial=summaryList.get("applyMaterial")==null?"":summaryList.get("applyMaterial").toString();
map.put("${applyMaterial}", StringEscapeUtils.unescapeHtml(applyMaterial));
//受理标准(条件)
String acceptCondition=summaryList.get("acceptCondition")==null?"":summaryList.get("acceptCondition").toString();
map.put("${acceptCondition}", StringEscapeUtils.unescapeHtml(acceptCondition));
//办理(审批)条件
String premitCond=summaryList.get("premitCond")==null?"":summaryList.get("premitCond").toString();
map.put("${premitCond}", StringEscapeUtils.unescapeHtml(premitCond));
//材料审核标准
String materAuditStandard=summaryList.get("materAuditStandard")==null?"":summaryList.get("materAuditStandard").toString();
map.put("${materAuditStandard}", StringEscapeUtils.unescapeHtml(materAuditStandard));
//收费标准
String chargeStandard=summaryList.get("chargeStandard")==null?"":summaryList.get("chargeStandard").toString();
map.put("${chargeStandard}", StringEscapeUtils.unescapeHtml(chargeStandard));
//收费依据
String chargeFoundation=summaryList.get("chargeFoundation")==null?"":summaryList.get("chargeFoundation").toString();
map.put("${chargeFoundation}", StringEscapeUtils.unescapeHtml(chargeFoundation));
//法定办理期限
String statutoryDays=summaryList.get("statutoryDays")==null?"":summaryList.get("statutoryDays").toString();
map.put("${statutoryDays}", StringEscapeUtils.unescapeHtml(statutoryDays));
//法定办理期限描述
String statutoryDesc=summaryList.get("statutoryDesc")==null?"":summaryList.get("statutoryDesc").toString();
map.put("${statutoryDesc}", StringEscapeUtils.unescapeHtml(statutoryDesc));
//承诺办理期限
String promiseDays=summaryList.get("promiseDays")==null?"":summaryList.get("promiseDays").toString();
map.put("${promiseDays}", StringEscapeUtils.unescapeHtml(promiseDays));
//承诺办理期限描述
String promiseDesc=summaryList.get("promiseDesc")==null?"":summaryList.get("promiseDesc").toString();
map.put("${promiseDesc}", StringEscapeUtils.unescapeHtml(promiseDesc));
//业务主管部门
String examAppDept=summaryList.get("examAppDept")==null?"":summaryList.get("examAppDept").toString();
map.put("${examAppDept}", StringEscapeUtils.unescapeHtml(examAppDept));
//实施机构(实施主体)
String acceptName=summaryList.get("acceptName")==null?"":summaryList.get("acceptName").toString();
map.put("${acceptName}", StringEscapeUtils.unescapeHtml(acceptName));
//联办机构
String jointlyOrganize=summaryList.get("jointlyOrganize")==null?"":summaryList.get("jointlyOrganize").toString();
map.put("${jointlyOrganize}", StringEscapeUtils.unescapeHtml(jointlyOrganize));
//办理处(科)室
String dealMain=summaryList.get("dealMain")==null?"":summaryList.get("dealMain").toString();
map.put("${dealMain}", StringEscapeUtils.unescapeHtml(dealMain));
//办理地点
String acceptAddress=summaryList.get("acceptAddress")==null?"":summaryList.get("acceptAddress").toString();
map.put("${acceptAddress}", StringEscapeUtils.unescapeHtml(acceptAddress));
//所在窗口
String windowAddress=summaryList.get("windowAddress")==null?"":summaryList.get("windowAddress").toString();
map.put("${windowAddress}", StringEscapeUtils.unescapeHtml(windowAddress));
//办理时间
String workTime=summaryList.get("workTime")==null?"":summaryList.get("workTime").toString();
map.put("${workTime}", StringEscapeUtils.unescapeHtml(workTime));
//中介服务
String intermediaryService=summaryList.get("intermediaryService")==null?"":summaryList.get("intermediaryService").toString();
map.put("${intermediaryService}", StringEscapeUtils.unescapeHtml(intermediaryService));
//数量限制
String quantityRestriction=summaryList.get("quantityRestriction")==null?"":summaryList.get("quantityRestriction").toString();
map.put("${quantityRestriction}", StringEscapeUtils.unescapeHtml(quantityRestriction));
//行使内容(权限说明)
String acceptAuthorityDesc=summaryList.get("acceptAuthorityDesc")==null?"":summaryList.get("acceptAuthorityDesc").toString();
map.put("${acceptAuthorityDesc}", StringEscapeUtils.unescapeHtml(acceptAuthorityDesc));
//特别程序及期限
String specialProcedure=summaryList.get("specialProcedure")==null?"":summaryList.get("specialProcedure").toString();
map.put("${specialProcedure}", StringEscapeUtils.unescapeHtml(specialProcedure));
//责任事项
String responsibilityMatters=summaryList.get("responsibilityMatters")==null?"":summaryList.get("responsibilityMatters").toString();
map.put("${responsibilityMatters}", StringEscapeUtils.unescapeHtml(responsibilityMatters));
//责任事项依据
String responsibilityFoundation=summaryList.get("responsibilityFoundation")==null?"":summaryList.get("responsibilityFoundation").toString();
map.put("${responsibilityFoundation}", StringEscapeUtils.unescapeHtml(responsibilityFoundation));
//职责边界
String responsibilityBoundary=summaryList.get("responsibilityBoundary")==null?"":summaryList.get("responsibilityBoundary").toString();
map.put("${responsibilityBoundary}", StringEscapeUtils.unescapeHtml(responsibilityBoundary));
//平均去现场次数
String sceneNum=summaryList.get("sceneNum")==null?"":summaryList.get("sceneNum").toString();
map.put("${sceneNum}", StringEscapeUtils.unescapeHtml(sceneNum));
//办理流程
String process=summaryList.get("process")==null?"":summaryList.get("process").toString();
map.put("${process}", StringEscapeUtils.unescapeHtml(process));
//内部流程描述
String insideProcessDesc=summaryList.get("insideProcessDesc")==null?"":summaryList.get("insideProcessDesc").toString();
map.put("${insideProcessDesc}", StringEscapeUtils.unescapeHtml(insideProcessDesc));
//证照形式及有效期
String certName=summaryList.get("certName")==null?"":summaryList.get("certName").toString();
map.put("${certName}", StringEscapeUtils.unescapeHtml(certName));
//证照名称
String licenseName=summaryList.get("licenseName")==null?"":summaryList.get("licenseName").toString();
map.put("${licenseName}", StringEscapeUtils.unescapeHtml(licenseName));
//填报人
String reporter=summaryList.get("reporter")==null?"":summaryList.get("reporter").toString();
map.put("${reporter}", StringEscapeUtils.unescapeHtml(reporter));
//填报人联系方式
String reporterPhone=summaryList.get("reporterPhone")==null?"":summaryList.get("reporterPhone").toString();
map.put("${reporterPhone}", StringEscapeUtils.unescapeHtml(reporterPhone));
//备注
String remark=summaryList.get("remark")==null?"":summaryList.get("remark").toString();
map.put("${remark}", StringEscapeUtils.unescapeHtml(remark));
//预留字段1
String reserve1=summaryList.get("reserve1")==null?"":summaryList.get("reserve1").toString();
map.put("${reserve1}", StringEscapeUtils.unescapeHtml(reserve1));
//预留字段2
String reserve2=summaryList.get("reserve2")==null?"":summaryList.get("reserve2").toString();
map.put("${reserve2}", StringEscapeUtils.unescapeHtml(reserve2));
//预留字段3
String reserve3=summaryList.get("reserve3")==null?"":summaryList.get("reserve3").toString();
map.put("${reserve3}", StringEscapeUtils.unescapeHtml(reserve3));
//预留字段4
String reserve4=summaryList.get("reserve4")==null?"":summaryList.get("reserve4").toString();
map.put("${reserve4}", StringEscapeUtils.unescapeHtml(reserve4));
//预留字段5
String reserve5=summaryList.get("reserve5")==null?"":summaryList.get("reserve5").toString();
map.put("${reserve5}", StringEscapeUtils.unescapeHtml(reserve5));
//导出模板的文件路径
String srcPath = path + "FileDownload\\govsdm\\Masterplate\\project.docx";
//导出的word路径
String destPath = path + "FileDownload\\govsdm\\Export\\project.docx";
List<HashMap<String, Object>> projectMaterList =
projectMaterialsDao.queryProjectMaterialsByPid(paramsMap);
projectMaterList=StringUtils.clobToStringByList(projectMaterList);//将clob类型转换为string
if(projectMaterList!=null && projectMaterList.size()>0){
searchAndReplaceProject(srcPath, destPath, map,projectMaterList);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
public static void searchAndReplaceProject(String srcPath, String destPath,
HashMap<String, Object> map,
List<HashMap<String, Object>> projectMaterialsList) throws IOException {
try {
File srcDocument = new File(srcPath);
OPCPackage pack = POIXMLDocument.openPackage(srcDocument.toString());
XWPFDocument document = new XWPFDocument(pack);
// 替换表格中的指定文字
Iterator<XWPFTable> itTable = document.getTablesIterator();
while (itTable.hasNext()) {
XWPFTable table = (XWPFTable) itTable.next();
int rcount = table.getNumberOfRows();
for (int i = 0; i < rcount; i++) {
XWPFTableRow row = table.getRow(i);
List<XWPFTableCell> cells = row.getTableCells();
for (XWPFTableCell cell : cells) {
for (Entry<String, Object> e : map.entrySet()) {
if (cell.getText().equals(e.getKey())) {
cell.removeParagraph(0);
XWPFParagraph p=cell.addParagraph();
try {
p.createRun().setText(e.getValue().toString());
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
}
}
try {
List<XWPFTable> tableList=document.getTables();
if (tableList!=null&&tableList.size()>0) {
int length=tableList.size();
XWPFTable table = (XWPFTable) tableList.get(length-1);
for(int i=0;i<projectMaterialsList.size();i++){
XWPFTableRow row=table.createRow();
List<XWPFTableCell> cells = row.getTableCells();
for (int j = 0; j < cells.size(); j++) {
XWPFTableCell cell=cells.get(j);
cell.removeParagraph(0);
CTTcPr tcpr = cell.getCTTc().addNewTcPr();
CTTblWidth cellw = tcpr.addNewTcW();
cellw.setType(STTblWidth.DXA);
cellw.setW(BigInteger.valueOf(360*5));
if(j==0){
cell.setText(String.valueOf(projectMaterialsList.get(i).get("materialName")));
}if(j==1){
cell.setText(String.valueOf(projectMaterialsList.get(i).get("description")));
}if(j==2){
if("01".equals(projectMaterialsList.get(i).get("materialType")))
{
cell.setText("■文本类 □表格类 □结果文书类 □其它类");
}else if("02".equals(projectMaterialsList.get(i).get("materialType")))
{
cell.setText("□文本类 ■表格类 □结果文书类 □其它类");
}else if("03".equals(projectMaterialsList.get(i).get("materialType")))
{
cell.setText("□文本类 □表格类 ■结果文书类 □其它类");
}else
{
cell.setText("□文本类 □表格类 □结果文书类 ■其它类");
}
}
}
}
}
FileOutputStream outStream = null;
outStream = new FileOutputStream(destPath);
document.write(outStream);
outStream.close();
} catch (Exception e) {
e.printStackTrace();
}
/给WORD插入标题///
//获得第一个段落对象
XWPFParagraph paragraph = document.getParagraphs().get(3);
//段落的格式,下面及个设置,将使新添加的文字向左对其,无缩进.
paragraph.setIndentationLeft(0);
paragraph.setIndentationHanging(0);
paragraph.setWordWrap(true);
//在段落中新插入一个run,这里的run我理解就是一个word文档需要显示的个体,里面可以放文字,参数0代表在段落的最前面插入
XWPFRun run = paragraph.insertNewRun(0);
//设置run内容
run.setText(map.get("${PROJECTNAMEBIAOTI}")+"");
run.setFontFamily("宋体");
run.setBold(true);
run.setFontSize(20);
FileOutputStream outStream = null;
outStream = new FileOutputStream(destPath);
document.write(outStream);
outStream.flush();
outStream.close();
}catch (Exception e) {
e.printStackTrace();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
private String combinationString(List<HashMap<String, Object>> list, String type) {
String cString = "";
String[] typeArr = type.split(",");
boolean isSelected = false;
for (int i = 0; i < list.size(); i++) {
isSelected = false;
for(String type1 : typeArr){
if (list.get(i).get("dictId").equals(type1)) {
isSelected = true;
}
}
if (isSelected) {
cString += "■" + list.get(i).get("dictName") + " ";
}else{
cString += "□" + list.get(i).get("dictName") + " ";
}
}
return cString;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
最后输出文件流
public HttpServletResponse download(String path, HttpServletResponse response, String projectname) throws Exception {
// path是指欲下载的文件的路径。
File file = new File(path);
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename="
+ new String((projectname + ".docx").getBytes("gbk"),
"iso-8859-1"));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(
response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
return response;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
前端vue代码片段;
<Button type="warning" size="small" @click="exports(item.projectId)" icon="share" v-if="btnData.indexOf('export')!==-1">导出</Button>
- 1
js代码
//导出
exports(projectId){
let token = localStorage.getItem('token');
//自定义form标签,初始化相关参数
var form = $("<form>");
form.attr('style', 'display:none');
form.attr('target', '');
form.attr('method', 'post');
form.attr('action', window.config.api + '/projectDocController/exportToWord.do');
var input1 = $('<input>');
input1.attr('type', 'hidden');
input1.attr('name', 'projectId');
input1.attr('value', projectId);
var input2 = $('<input>');
input2.attr('type', 'hidden');
input2.attr('name', 'token');
input2.attr('value', token);
$('body').append(form);
form.append(input1);
form.append(input2);
form.submit();
form.remove();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
小结:针对文件流的操作,尽量用提交form表单的形式处理请求。