| | |
| | | package com.ruoyi.web.controller.tool; |
| | | |
| | | import org.apache.poi.xwpf.usermodel.*; |
| | | import java.io.*; |
| | | import java.util.*; |
| | | |
| | | public class WordTemplateProcessor { |
| | | |
| | | public static void fillTemplate(String templatePath, String outputPath,Map<String, String> dataMap) { |
| | | try { |
| | | // 读取模板文件 |
| | | FileInputStream fis = new FileInputStream(templatePath); |
| | | XWPFDocument document = new XWPFDocument(fis); |
| | | |
| | | // 替换段落中的标记 |
| | | for (XWPFParagraph paragraph : document.getParagraphs()) { |
| | | replaceParagraph(paragraph, dataMap); |
| | | } |
| | | |
| | | // 替换表格中的标记 |
| | | for (XWPFTable table : document.getTables()) { |
| | | for (XWPFTableRow row : table.getRows()) { |
| | | for (XWPFTableCell cell : row.getTableCells()) { |
| | | for (XWPFParagraph paragraph : cell.getParagraphs()) { |
| | | replaceParagraph(paragraph, dataMap); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 保存文件 |
| | | FileOutputStream fos = new FileOutputStream(outputPath); |
| | | document.write(fos); |
| | | |
| | | // 关闭资源 |
| | | fos.close(); |
| | | fis.close(); |
| | | document.close(); |
| | | |
| | | System.out.println("模板填充完成!文件保存在: " + outputPath); |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | private static void replaceParagraph(XWPFParagraph paragraph, Map<String, String> dataMap) { |
| | | String paragraphText = paragraph.getText(); |
| | | for (Map.Entry<String, String> entry : dataMap.entrySet()) { |
| | | if (paragraphText.contains(entry.getKey())) { |
| | | List<XWPFRun> runs = paragraph.getRuns(); |
| | | TextSegment found = paragraph.searchText(entry.getKey(), new PositionInParagraph()); |
| | | if (found != null) { |
| | | // 替换文本 |
| | | int beginRun = found.getBeginRun(); |
| | | int endRun = found.getEndRun(); |
| | | |
| | | if (beginRun >= 0 && endRun >= 0) { |
| | | // 删除原有runs |
| | | for (int runPos = beginRun; runPos <= endRun; runPos++) { |
| | | paragraph.removeRun(runPos); |
| | | } |
| | | // 创建新run |
| | | XWPFRun newRun = paragraph.insertNewRun(beginRun); |
| | | newRun.setText(entry.getValue()); |
| | | // 复制原有格式 |
| | | if (runs.size() > 0 && runs.get(0) != null) { |
| | | XWPFRun styleRun = runs.get(0); |
| | | newRun.setFontFamily(styleRun.getFontFamily()); |
| | | newRun.setFontSize(styleRun.getFontSize()); |
| | | newRun.setBold(styleRun.isBold()); |
| | | newRun.setItalic(styleRun.isItalic()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | |
| | | String templatePath = "/path/to/template.docx"; |
| | | String outputPath = "/path/to/output.docx"; |
| | | |
| | | // fillTemplate(templatePath, outputPath, user); |
| | | } |
| | | } |
| | | //package com.ruoyi.web.controller.tool; |
| | | // |
| | | //import org.apache.poi.xwpf.usermodel.*; |
| | | //import java.io.*; |
| | | //import java.util.*; |
| | | // |
| | | //public class WordTemplateProcessor { |
| | | // |
| | | // public static void fillTemplate(String templatePath, String outputPath,Map<String, String> dataMap) { |
| | | // try { |
| | | // // 读取模板文件 |
| | | // FileInputStream fis = new FileInputStream(templatePath); |
| | | // XWPFDocument document = new XWPFDocument(fis); |
| | | // |
| | | // // 替换段落中的标记 |
| | | // for (XWPFParagraph paragraph : document.getParagraphs()) { |
| | | // replaceParagraph(paragraph, dataMap); |
| | | // } |
| | | // |
| | | // // 替换表格中的标记 |
| | | // for (XWPFTable table : document.getTables()) { |
| | | // for (XWPFTableRow row : table.getRows()) { |
| | | // for (XWPFTableCell cell : row.getTableCells()) { |
| | | // for (XWPFParagraph paragraph : cell.getParagraphs()) { |
| | | // replaceParagraph(paragraph, dataMap); |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // |
| | | // // 保存文件 |
| | | // FileOutputStream fos = new FileOutputStream(outputPath); |
| | | // document.write(fos); |
| | | // |
| | | // // 关闭资源 |
| | | // fos.close(); |
| | | // fis.close(); |
| | | // document.close(); |
| | | // |
| | | // System.out.println("模板填充完成!文件保存在: " + outputPath); |
| | | // |
| | | // } catch (Exception e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // } |
| | | // |
| | | // private static void replaceParagraph(XWPFParagraph paragraph, Map<String, String> dataMap) { |
| | | // String paragraphText = paragraph.getText(); |
| | | // for (Map.Entry<String, String> entry : dataMap.entrySet()) { |
| | | // if (paragraphText.contains(entry.getKey())) { |
| | | // List<XWPFRun> runs = paragraph.getRuns(); |
| | | // TextSegment found = paragraph.searchText(entry.getKey(), new PositionInParagraph()); |
| | | // if (found != null) { |
| | | // // 替换文本 |
| | | // int beginRun = found.getBeginRun(); |
| | | // int endRun = found.getEndRun(); |
| | | // |
| | | // if (beginRun >= 0 && endRun >= 0) { |
| | | // // 删除原有runs |
| | | // for (int runPos = beginRun; runPos <= endRun; runPos++) { |
| | | // paragraph.removeRun(runPos); |
| | | // } |
| | | // // 创建新run |
| | | // XWPFRun newRun = paragraph.insertNewRun(beginRun); |
| | | // newRun.setText(entry.getValue()); |
| | | // // 复制原有格式 |
| | | // if (runs.size() > 0 && runs.get(0) != null) { |
| | | // XWPFRun styleRun = runs.get(0); |
| | | // newRun.setFontFamily(styleRun.getFontFamily()); |
| | | // newRun.setFontSize(styleRun.getFontSize()); |
| | | // newRun.setBold(styleRun.isBold()); |
| | | // newRun.setItalic(styleRun.isItalic()); |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // } |
| | | // |
| | | // public static void main(String[] args) { |
| | | // |
| | | // String templatePath = "/path/to/template.docx"; |
| | | // String outputPath = "/path/to/output.docx"; |
| | | // |
| | | //// fillTemplate(templatePath, outputPath, user); |
| | | // } |
| | | //} |