中扬CRM客户关系管理系统
#
LSH
2023-11-24 2c7a0b5c9cded118d3c3c46211adf40fe558d67b
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
package com.zy.crm.manager.controller;
 
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STMerge;
import org.springframework.core.io.InputStreamResource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@RestController
public class WordController {
 
    @GetMapping("/generateWord")
    public ResponseEntity<InputStreamResource> generateWord() throws IOException {
        // 读取 Word 模板文件
        String fileName = this.getClass().getClassLoader().getResource("word1.docx").getPath();//获取文件路径
        File file = new File(fileName);
        FileInputStream inputStream = new FileInputStream(file);
        XWPFDocument document = new XWPFDocument(inputStream);
 
        insertTab("${table}", document);
 
        HashMap<String, Object> map = new HashMap<>();
        map.put("${table}", "");
        map.put("${name}", "张三");
        processParagraphs(document.getParagraphs(), map, document);
 
        // 将文档写入输出流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        document.write(outputStream);
        outputStream.close();
 
        // 创建响应实体,将输出流作为文件内容返回
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        headers.setContentDispositionFormData("attachment", "output.docx");
        InputStreamResource resource = new InputStreamResource(new ByteArrayInputStream(outputStream.toByteArray()));
        return ResponseEntity.ok()
                .headers(headers)
                .body(resource);
    }
 
    /**
     * 处理段落中文本,替换文本中定义的变量;
     * @param paragraphList 段落列表
     * @param param 需要替换的变量及变量值
     * @param doc 需要替换的DOC
     */
    public static void processParagraphs(List<XWPFParagraph> paragraphList, HashMap<String, Object> param, XWPFDocument doc) {
        if (paragraphList != null && paragraphList.size() > 0) {
            for (XWPFParagraph paragraph : paragraphList) {
                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun run : runs) {
                    String text = run.getText(0);
                    if (text != null) {
                        boolean isSetText = false;
                        for (Map.Entry<String, Object> entry : param.entrySet()) {
                            String key = entry.getKey();
                            if (text.indexOf(key) != -1) {
                                isSetText = true;
                                Object value = entry.getValue();
                                if (value instanceof String) {// 文本替换
                                    text = text.replace(key, value.toString());
                                }
                            }
                        }
                        if (isSetText) {
                            run.setText(text, 0);
                        }
                    }
                }
            }
        }
    }
 
    /**
     * 在定位的位置插入表格
     */
    public static void insertTab(String key, XWPFDocument doc2) {
        List<XWPFParagraph> paragraphList = doc2.getParagraphs();
        if (paragraphList != null && paragraphList.size() > 0) {
            for (XWPFParagraph paragraph : paragraphList) {
                List<XWPFRun> runs = paragraph.getRuns();
                for (XWPFRun run : runs) {
                    String text = run.getText(0);
                    if (text != null) {
                        if (text.indexOf(key) >= 0) {
                            XmlCursor cursor = paragraph.getCTP().newCursor();
                            XWPFTable tableOne = doc2.insertNewTbl(cursor);// ---这个是关键
                            String test = "[\n" +
                                    "  [\"序号\",\"品名\",\"数量\",\"单位\",\"单价(元)\",\"合计(元)\",\"备注\"],\n" +
                                    "  [\"1\",\"自动化立体仓库设备\",\"1\",\"套\",\"130000\",\"130000\",\"备注\"],\n" +
                                    "  [\"合计(大写金额):\",\"\",\"\",\"\",\"合计:\",\"\",\"\"]\n" +
                                    "]";
 
                            JSONArray row = JSON.parseArray(test);
                            ArrayList<List<String>> list = new ArrayList<>();
                            for (Object o : row) {
                                ArrayList<String> arrayList = new ArrayList<>();
                                JSONArray objects = JSON.parseArray(o.toString());
                                for (Object object : objects) {
                                    arrayList.add(object.toString());
                                }
                                list.add(arrayList);
                            }
 
                            int rows = list.size();
                            int cols = list.get(0).size();
                            for (int i = 0; i < rows; i++) {
                                XWPFTableRow tableRow = null;
                                if (i == 0) {
                                    tableRow = tableOne.getRow(i);
                                }else {
                                    tableRow = tableOne.createRow();
                                }
 
                                for (int j = 0; j < cols; j++) {
                                    if (i == 0 && j == 0) {
                                        tableRow.getCell(j).setText(list.get(i).get(j));
                                    }else {
                                        XWPFTableCell cell = tableRow.getCell(j);
                                        if (cell == null) {
                                            tableRow.addNewTableCell().setText(list.get(i).get(j));
                                        }else {
                                            cell.setText(list.get(i).get(j));
                                        }
                                    }
                                }
                            }
 
                            //合并最后一行单元格
                            tableOne.getRow(rows - 1).getCell(0).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
                            tableOne.getRow(rows - 1).getCell(1).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
                            tableOne.getRow(rows - 1).getCell(2).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
                            tableOne.getRow(rows - 1).getCell(4).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
                            tableOne.getRow(rows - 1).getCell(5).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
                        }
                    }
                }
            }
        }
    }
 
}