354798ggg
2023-05-16 68aae14c5c33b525effd4fe18a6ce14ea6ec90ae
打印变更word下载
已修改3个文件
187 ■■■■ 文件已修改
src/main/java/com/product/print/controller/PrintRealizeController.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/print/service/PrintRealizeService.java 157 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/print/service/ide/IPrintRealizeService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/product/print/controller/PrintRealizeController.java
@@ -58,5 +58,33 @@
            return error(CmnCode.GET_PRINT_CONFIG_LIST_FAIL, e);
        }
    }
    @PostMapping("/printWord/{version}")
    @ApiVersion(1)
    public String printWord(HttpServletRequest request, HttpServletResponse response) {
        try {
            FieldSetEntity fse = null;
            Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
            if (bean != null) {
                RequestParameterEntity reqp = (RequestParameterEntity) bean;
                fse = reqp.getFormData();
            }
            if (bean == null || fse == null) {
                return this.error(CmnCode.SYSTEM_FORM_NODATA);
            }
//            if (!CmnConst.TABLE_PRINT_CONFIG.equals(fse.getTableName())) {
//                return error(CmnCode.SYSTEM_TABLE_NODATA);
//            }
            if (StringUtils.isEmpty(CmnConst.PRINT_TEMP)) {
                return error(CmnCode.SYSTEM_FORM_COUNT);
            }
            printRealizeService.printWord(fse, response);
            return OK();
        } catch (BaseException e) {
            return error(e);
        } catch (Exception e) {
            return error(CmnCode.GET_PRINT_CONFIG_LIST_FAIL, e);
        }
    }
}
src/main/java/com/product/print/service/PrintRealizeService.java
@@ -13,11 +13,16 @@
import com.product.print.config.CmnCode;
import com.product.print.config.CmnConst;
import com.product.print.service.ide.IPrintRealizeService;
import com.product.util.BaseUtil;
import com.product.util.SystemParamReplace;
import com.product.util.config.SystemParamSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
@@ -34,7 +39,7 @@
    @Autowired
    FileManagerService fileManagerService;
/*
    public static void main(String[] args) {
        Map<String, Object> t = new HashMap<>();
        Integer a = 1;
@@ -44,34 +49,130 @@
        Map<String, String> cc = (Map<String, String>) (Map) t;
        System.out.println(cc);
    }
*/
/*
    public static void main(String[] args) throws Exception {
        Map<String, Object> map = new HashMap<>();
        List<Map<String, String>> subMapList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            Map<String, String> subMap = new HashMap<>();
            subMap.put("a1", "品名——" + (i + 1));
            subMap.put("a2", "单位——" + (i + 1));
            subMap.put("a3", "数量——" + (i + 1));
            subMap.put("a4", "用途——" + (i + 1));
            subMapList.add(subMap);
        }
        map.put("BGYPLYB_SUB", subMapList);
        HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();//创建一个列表的规则
        Configure config = Configure.newBuilder().customPolicy("BGYPLYB_SUB", policy).customPolicy("test_table", policy).build();
        File targetFile = new File("C:\\Users\\cheng\\Desktop\\replaceWord.docx");
        File file = new File("C:\\Users\\cheng\\Desktop\\办公用品领用表.docx");
        if (targetFile.exists()) {
            targetFile.delete();
        }
        targetFile.createNewFile();
        try (FileOutputStream is = new FileOutputStream(targetFile);
        ) {
            XWPFTemplate render = XWPFTemplate.compile(file, config).render(map);
            render.write(is);
            render.close();
        }
    }
*/
//    public static void main(String[] args) throws Exception {
//        Map<String, Object> map = new HashMap<>();
//        List<Map<String, String>> subMapList = new ArrayList<>();
//        for (int i = 0; i < 5; i++) {
//            Map<String, String> subMap = new HashMap<>();
//            subMap.put("a1", "品名——" + (i + 1));
//            subMap.put("a2", "单位——" + (i + 1));
//            subMap.put("a3", "数量——" + (i + 1));
//            subMap.put("a4", "用途——" + (i + 1));
//            subMapList.add(subMap);
//        }
//        map.put("BGYPLYB_SUB", subMapList);
//        HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();//创建一个列表的规则
//        Configure config = Configure.newBuilder().customPolicy("BGYPLYB_SUB", policy).customPolicy("test_table", policy).build();
//        File targetFile = new File("C:\\Users\\cheng\\Desktop\\replaceWord.docx");
//        File file = new File("C:\\Users\\cheng\\Desktop\\办公用品领用表.docx");
//        if (targetFile.exists()) {
//            targetFile.delete();
//        }
//        targetFile.createNewFile();
//        try (FileOutputStream is = new FileOutputStream(targetFile);
//        ) {
//            XWPFTemplate render = XWPFTemplate.compile(file, config).render(map);
//            render.write(is);
//            render.close();
//        }
//    }
    @Override
    public void printWord(FieldSetEntity fse, HttpServletResponse response) throws BaseException {
        // 打印配置uuid
        String print_uuid = fse.getString("~" + CmnConst.PRINT_TEMP + "~");
        //查询打印配置
        FieldSetEntity fieldSetEntity = getBaseDao().getFieldSetEntity(CmnConst.TABLE_PRINT_CONFIG, print_uuid, false);
        if (fieldSetEntity == null || StringUtils.isEmpty(fieldSetEntity.getString(CmnConst.PRINT_TEMPLATE))) {
            throw new BaseException(CmnCode.PRINT_CONFIG_NOT_EXIST.getValue(), CmnCode.PRINT_CONFIG_NOT_EXIST.getText());
        }
        // 打印模板附件uuid
        String template_uuid = fieldSetEntity.getString(CmnConst.PRINT_TEMPLATE);
        // 获取打印模板
        File file = getFile(template_uuid);
        // 加载参照 打印时使用显示值 而不是实际值
        getBaseDao().loadPromptData(fse);
        // 文件名前缀部分
        Object tempKey = UUID.randomUUID();
        // 替换后的word临时路径
        String localTempPathWord = Global.getSystemConfig("temp.dir", "") + File.separator + "temp_print_" + tempKey + ".docx";
        File wordTemp = new File(localTempPathWord);
        try {
            new File(Global.getSystemConfig("temp.dir", "")).mkdirs();
            wordTemp.createNewFile();
        } catch (Exception e) {
            e.printStackTrace();
            throw new BaseException(CmnCode.PRINT_CONTENT_FAIL.getValue(), CmnCode.PRINT_CONTENT_FAIL.getText() + (e.getMessage() != null ? e.getMessage() : ""));
        }
        //将模和当前fse的values放入进行替换
        try (FileOutputStream is = new FileOutputStream(wordTemp);
             OutputStream out = response.getOutputStream()) {
            Map<String, DataTableEntity> subData = fse.getSubData();
            Configure.ConfigureBuilder configureBuilder = null;
            if (subData != null && subData.size() > 0) {
                for (Map.Entry<String, DataTableEntity> vv :
                        subData.entrySet()) {
                    getBaseDao().loadPromptData(vv.getValue());
                    if (!DataTableEntity.isEmpty(vv.getValue())) {
                        List<Map> collect = vv.getValue().getData().stream().map(item -> (Map<String, String>) ((Map) item.getValues())).collect(Collectors.toList());
                        fse.setValue(vv.getKey(), collect);
                    } else {
                        fse.setValue(vv.getKey(), new ArrayList<>());
                    }
                    if (configureBuilder == null) {
                        configureBuilder = Configure.newBuilder();
                    }
                    configureBuilder.customPolicy(vv.getKey(), new HackLoopTableRenderPolicy());
                }
            }
            XWPFTemplate render = XWPFTemplate.compile(file, configureBuilder == null ? Configure.createDefault() : configureBuilder.build()).render(fse.getValues());
            render.write(is);
            render.close();
            response.setContentType("multipart/form-data");
            response.setHeader("Access-Control-Allow-Origin", "*"); // 允许所有
            //设置响应
            response.setContentType("application/octet-stream;charset=UTF-8");
            // 将响应头中的Content-Disposition暴露出来,不然前端获取不到
            response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
            String fileName = null;
            if(!BaseUtil.strIsNull(fieldSetEntity.getString("print_file_name"))) {
                fileName = SystemParamReplace.replaceParams(fieldSetEntity.getString("print_file_name"), fse);
            }else {
                fileName = fieldSetEntity.getString("print_name");
            }
            fileName+=".docx";
            // 在响应头中的Content-Disposition里设置文件名称
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            InputStream isPdf = new FileInputStream(wordTemp);
            int len;
            byte[] b = new byte[1024];
            // 输出
            while ((len = isPdf.read(b)) > 0) {
                out.write(b, 0, len);
            }
            isPdf.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new BaseException(CmnCode.PRINT_CONTENT_FAIL.getValue(), CmnCode.PRINT_CONTENT_FAIL.getText() + (e.getMessage() != null ? e.getMessage() : ""));
        } finally {
            //删除word临时文件
            if (wordTemp.exists()) {
                System.out.println(wordTemp.getPath());
//                wordTemp.delete();
            }
            if (file != null) {
                file.delete();
            }
        }
    }
    @Override
    public void print(FieldSetEntity fse, HttpServletResponse response) throws BaseException {
src/main/java/com/product/print/service/ide/IPrintRealizeService.java
@@ -14,6 +14,8 @@
 */
public interface IPrintRealizeService {
    void printWord(FieldSetEntity fse, HttpServletResponse response) throws BaseException;
    void print(FieldSetEntity fse, HttpServletResponse response) throws BaseException;
}