java程序数据替换doc文档中的文字

应客户需求,需要将excel导入的数据按照查找内容把doc文档中的文字替换成需要替换的文字,以下为主要代码。(注:有时候doc文档中的某些词组获取到的时候是单个文字或者整个词组分开的,这样会使某些内容不能替换成功,可以将此词组复制到text文件中,然后再复制进doc文档中,猜测可能出现这个原因是doc文档的底层代码里,这个词组分裂了,待验证。)

public class ModuleReplace {
    private static PrintXWPFDocument doc = null; 
    private static  Log log = LogFactory.getLog(ModuleReplace.class);
    public static PrintXWPFDocument replaceContent(InputStream inputStream, List<BloodModuleDetail> list) throws IOException{
        //获取doc文件中的所有的内容
        getXWPFdoc(inputStream);
//        getParagraphs(inputStream,list);
        replaceInPara(list);
        loadTableBookMark(doc.getTables(),list);
//        replaceInTable(list);
        return doc; 
    }

    private static PrintXWPFDocument getParagraphs(InputStream inputStream, List<BloodModuleDetail> list) throws IOException { 
            if (doc != null) { 
                    if (doc.getParagraphs() != null) {
                        for (XWPFParagraph paragraph : doc.getParagraphs()) {  
                            if(paragraph!=null && paragraph.getText() !=null) { 
                                System.out.println(paragraph.getText());
                                int num = 0;
                                String paraText = paragraph.getText();
                                for (BloodModuleDetail detail : list) {
                                    if(paraText.contains(detail.getFindContent())&&!StringUtil.isNullStr(detail.getReplaceContent())) {  
                                        System.out.println(detail.getFindContent()+"#########"+detail.getReplaceContent());
                                        num++;
                                        paraText = paraText.replaceAll(detail.getFindContent(), detail.getReplaceContent()); 
                                    }
                                }
                                if(num > 0) {
                                    List<XWPFRun> runs = paragraph.getRuns(); 
                                    XWPFRun run1 = paragraph.createRun(); 
                                    run1.setText(paraText);  
                                    for (int i = 0; i < runs.size(); i++) { 
                                        paragraph.removeRun(i);
                                    }
                                    System.out.println(paraText+"===========");
                                    paragraph.addRun(run1); 
                                }
                            }
                        }  
                    }
                    loadTableBookMark(doc.getTables(),list);
            } 
        return doc;
    }
    
    private static void loadTableBookMark(List<XWPFTable> tables,List<BloodModuleDetail> list) {
        if (tables == null) {
            return;
        }
        // 遍历表格
        for (XWPFTable table : tables) {
            List<XWPFTableRow> rows = table.getRows();
            if (rows == null) {
                continue;
            }
            // 遍历行
            for (XWPFTableRow row : rows) {
                List<XWPFTableCell> cells = row.getTableCells();
                if (cells == null) {
                    continue;
                }
                // 遍历单元格
                for (XWPFTableCell cell : cells) {
                    // 递归遍历单元格中的表格
                    List<XWPFTable> cellTables = cell.getTables();
                    if (cellTables != null && cellTables.size() > 0) {
                        loadTableBookMark(cellTables,list);
                    }
                    List<XWPFParagraph> cellParagraphs = cell.getParagraphs();
                    if (cellParagraphs == null) {
                        continue;
                    } 
                    for (XWPFParagraph paragraph : cellParagraphs) { 
                        if(paragraph!=null && paragraph.getText() !=null) { 
                            System.out.println(paragraph.getText());
                            int num = 0;
                            String paraText = paragraph.getText();
                            for (BloodModuleDetail detail : list) {
                                if(paraText.contains(detail.getFindContent())&&!StringUtil.isNullStr(detail.getReplaceContent())) {  
                                    System.out.println(detail.getFindContent()+"#########"+detail.getReplaceContent());
                                    num++;
                                    paraText = paraText.replaceAll(detail.getFindContent(), detail.getReplaceContent()); 
                                }
                            }
                            if(num > 0) {
                                System.out.println(paraText);
                                List<XWPFRun> runs = paragraph.getRuns(); 
                                for (int i = 0; i < runs.size(); i++) { 
                                    paragraph.removeRun(i);
                                }
                                XWPFRun run1 = paragraph.createRun(); 
                                run1.setText(paraText);  
                                paragraph.addRun(run1); 
                            }
                        }
                    } 
                }
            }
        }
    } 
    private static void getXWPFdoc(InputStream inputStream) {
        try {
            doc = new PrintXWPFDocument(inputStream);
            inputStream.close();
        } catch (Exception e) {
            log.info(e);
        }
    }
    
     /** 
     * 替换段落里面的变量 
     * @param doc 要替换的文档 
     * @param params 参数 
     */  
    private static void replaceInPara(List<BloodModuleDetail> list) {  
        for (XWPFParagraph paragraph : doc.getParagraphs()) {  
            replaceInPara(paragraph, list);  
        }
    }  
    /** 
     * 替换段落里面的变量 
     * @param para 要替换的段落 
     * @param params 参数 
     */  
    private static void replaceInPara(XWPFParagraph para, List<BloodModuleDetail> list){  
       List<XWPFRun> runs;    
          runs = para.getRuns();  
          for (int i=0; i<runs.size(); i++) {
             XWPFRun run = runs.get(i);  
             String runText = run.toString();  
             System.out.println(runText+"===");
             for (BloodModuleDetail detail : list) {
                    if(runText.contains(detail.getFindContent())&&!StringUtil.isNullStr(detail.getReplaceContent())) {   
                         System.out.println(runText+"==="+detail.getFindContent()+"---"+detail.getReplaceContent());
                        runText = runText.replace(detail.getFindContent(), detail.getReplaceContent());
                         para.removeRun(i);    
                         XWPFRun newRun = para.insertNewRun(i);  
                         newRun.setText(runText);
                         newRun.setUnderline(UnderlinePatterns.SINGLE);
                         run.removeCarriageReturn();
                    }
                } 
          }   
    }  
    
    private static void replaceInPara1(XWPFParagraph para, List<BloodModuleDetail> list){ 
        List<XWPFRun> runs = para.getRuns();  
           for (int i=0; i<runs.size(); i++) {
              XWPFRun run = runs.get(i);  
              String runText = run.getText(0);  
              for (BloodModuleDetail detail : list) {
                     if(runText.contains(detail.getFindContent())&&!StringUtil.isNullStr(detail.getReplaceContent())) {   
                         System.out.println(runText+"==="+detail.getFindContent()+"---"+detail.getReplaceContent());
                         runText = runText.replace(detail.getFindContent(), detail.getReplaceContent());
                          para.removeRun(i);  
                          para.insertNewRun(i).setText(runText);  
                     }
                 } 
           }   
     }  

    /** 
     * 替换表格里面的变量 
     * @param doc 要替换的文档 
     * @param params 参数 
     */  
    private static void replaceInTable(List<BloodModuleDetail> list) {  
       Iterator<XWPFTable> iterator = doc.getTablesIterator();  
       XWPFTable table;  
       List<XWPFTableRow> rows;  
       List<XWPFTableCell> cells;  
       List<XWPFParagraph> paras;  
       while (iterator.hasNext()) {  
          table = iterator.next();  
          rows = table.getRows();  
          for (XWPFTableRow row : rows) {  
             cells = row.getTableCells();  
             for (XWPFTableCell cell : cells) {  
                 paras = cell.getParagraphs();  
                 for (XWPFParagraph para : paras) {  
                    replaceInPara1(para, list);  
                 }  
             }  
          }  
       }  
    }    
}
 

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值