替换docx文件外面的 ${} 字符串


public class Main {    public static void main(String[] args) throws Exception {        String template = "C:\\Users\\lzh\\Desktop\\模板.docx";        String outSrc = "C:\\Users\\lzh\\Desktop\\简历.docx";        var is = new FileInputStream(template);        var os = new FileOutputStream(outSrc);        editDocx(os, is, xml -> {            Map<String,String> map = new HashMap<>();            map.put("${name}", "李**");            map.put("${sex}", "男");            map.put("${age}", "21");            Pattern p = Pattern.compile("(\\$\\{)([\\w]+)(\\})");            Matcher m = p.matcher(xml);            StringBuffer sb = new StringBuffer();            while (m.find()) {                String group = m.group();                m.appendReplacement(sb, map.get(group));            }            m.appendTail(sb);            xml = sb.toString();            return xml;        });    }    public static void editDocx(OutputStream bos,InputStream is, Process process){        ZipInputStream zin = new ZipInputStream(is);        ZipOutputStream zos = new ZipOutputStream(bos);        try {            ZipEntry entry;            while((entry = zin.getNextEntry()) != null) {                //把输出流的文件传到输入流中 如果是word/document.xml由咱们输出                zos.putNextEntry(new ZipEntry(entry.getName()));                if("word/document.xml".equals(entry.getName())){                    String xml = new BufferedReader(new InputStreamReader(zin)).lines().collect(Collectors.joining(System.lineSeparator()));                    xml = process.process(xml);                    ByteArrayInputStream byteIn = new ByteArrayInputStream(xml.getBytes());                    int c;                    while ((c = byteIn.read()) != -1) {                        zos.write(c);                    }                    byteIn.close();                }else {                    int c;                    while ((c = zin.read()) != -1) {                        zos.write(c);                    }                }            }        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                zos.close();                zin.closeEntry();                zin.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}interface Process {    String process(String xml);}