利用java相关技术把页面导出成word文档

1.前端页面功能实现

function dc(){
        var xhh = new XMLHttpRequest();
        xhh.open("post", 'xxx/xxx/downloadDoc');//url
        xhh.responseType = 'blob';
        xhh.setRequestHeader("Authorization",sessionStorage.getItem("token"));//写入token
        xhh.setRequestHeader("Uuid",generateUUID());//写入uuid
        xhh.onreadystatechange = function () {
            if (xhh.readyState === 4 && xhh.status === 200) {
                var name = xhh.getResponseHeader("Content-disposition");
                name = decodeURI(clean(name).substring(21));
                var blob = new Blob([xhh.response]);
                var csvUrl = URL.createObjectURL(blob);
                var link = document.createElement('a');
                link.href = csvUrl;
                link.download = name;
                link.click();
            }
        };
        var params = {"xmid":fVue.xmid,"zpbgid":fVue.zpbgid};
        xhh.send(JSON.stringify(params));//把需要的参数传入到后端
    }

2.后端技术

2.1 controller

    @PostMapping("/downloadDocZpbg")
    public void downloadDocZpbg (HttpServletRequest request, HttpServletResponse response,  @RequestParam Map map) throws IOException {
        Map new_map = (Map) JSON.parseObject(map);
        //处理需要的参数
        cxxmYspgService.downloadDocZpbg(response,xxx);//service需要用到response的IO技术
    }

2.2 service

	public void downloadDoc( HttpServletResponse response, String xxx) throws IOException {
        OutputStream os = null;
        try {
            String docFilePath = config.getDocFilePathdcdb_cxxm_xmys();//本地word文档地址,此处需要配置在springboot启动时能扫描的配置类中
            //System.err.println(docFilePath);
            Map map = xxx;
            XWPFDocument xwpfDocument = new XWPFDocument(POIXMLDocument.openPackage(docFilePath));
            List<XWPFParagraph> paras = xwpfDocument.getParagraphs();
            //获取所有表
            List<XWPFTable> xwpfTables = xwpfDocument.getTables();
            for (XWPFTable xwpfTable : xwpfTables) {
           	    //获取一个表中所有行
                List<XWPFTableRow> xwpfTableRows = xwpfTable.getRows();
                for (XWPFTableRow xwpfTableRow : xwpfTableRows) {
                	//获取一个表中所有列
                    List<XWPFTableCell> xwpfTableCells = xwpfTableRow.getTableCells();
                    for (XWPFTableCell xwpfTableCell : xwpfTableCells) {
                    	//获取一格里面的内容
                        List<XWPFParagraph> paragraphs = xwpfTableCell.getParagraphs();
                        for (XWPFParagraph paragraph : paragraphs) {
                        	//获取一个段落中的所有Runs
                            List<XWPFRun> runs = paragraph.getRuns();
                            //一个段落包含多个Runs,一个Runs包含多个Run
                            for (XWPFRun run : runs) {
                                if (run.toString().trim().contains("${xmmc}")) {//此处${xmmc}是你需要从数据库查询的内容(此方法会找到本地word中含有${xmmc}的位置替换成map.get("XM_MC")的值)
                                    String xmmc = run.toString().trim().replace("${xmmc}", XDataConvert.TryToString(map.get("XM_MC")));
                                    run.setText(xmmc, 0);
                                }else if (run.toString().trim().contains("${name}")) {
                                    String name= run.toString().trim().replace("${name}", XDataConvert.TryToString(map.get("NAME")));
                                    run.setText(name, 0);
                                }

                            }
                        }
                    }
                }
            }
            response.reset();
            os = response.getOutputStream();
            response.setContentType("multipart/form-data");
            response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode("文件名.docx", "utf-8"));

            xwpfDocument.write(os);
            os.flush();
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2.3 根据自己功能要求写mapper和sql

2.4 properties文件配置

#本地word所在文件路径,自己取名字
configs.doc.filePath.cxxm.zjwyhzxdf=D:/xxx/downloadDoc/xxx.docx

2.5 配置类(springboot能扫描到的)

@ConfigurationProperties(prefix="configs")
@Component
public class Config(){
	@Value("${configs.doc.filePath.xxx.xx}")//在pro文件中配置的动态路径
	private String downloadDoc_xxx;
	//生成getter和setter方法
	public String getDownloadDoc_xxx() {
		return getDownloadDoc_xxx;
	}
	public void setDownloadDoc_xxx(String downloadDoc_xxx) {
		this.downloadDoc_xxx= downloadDoc_xxx;
	}
}

2.6 本地word书写格式

例如:下载一个个人信息,根据数据库内容填写名字和对应数据${xxx}

重点中的重点:这步不做前面白费
在word中定义’’${xx}’'的时候需要在txt中写好粘贴到word中,否则会出现替换失败的情况!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值