您的位置:首页 > 其它

前后端分离项目之数据导出为word实例

2017-07-11 12:22 218 查看
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);
}
}


业务层代码

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());
}
}


导出的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);
}
}


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();
}
}


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;
}


最后输出文件流

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;
}


前端vue代码片段;

<Button type="warning" size="small" @click="exports(item.projectId)" icon="share" v-if="btnData.indexOf('export')!==-1">导出</Button>


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();
}


小结:针对文件流的操作,尽量用提交form表单的形式处理请求。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: