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