word 包括列表的 套打 (已经解决有的可以 有的不可以) 针对拆分到两个甚至更多的XWPFRun中问题

public class XwpfTest {
 
   /**
    * 用一个docx文档作为模板,然后替换其中的内容,再写入目标文档中。
    * @throws Exception
    */
   @Test
   public void testTemplateWrite() throws Exception {
      Map<String, Object> params = new HashMap<String, Object>();
      params.put("reportDate", "2014-02-28");
      params.put("appleAmt", "100.00");
      params.put("bananaAmt", "200.00");
      params.put("totalAmt", "300.00");
      String filePath = "D:\\word\\template.docx";
      InputStream is = new FileInputStream(filePath);
      XWPFDocument doc = new XWPFDocument(is);
      //替换段落里面的变量
      this.replaceInPara(doc, params);
      //替换表格里面的变量
      this.replaceInTable(doc, params);
      OutputStream os = new FileOutputStream("D:\\word\\write.docx");
      doc.write(os);
      this.close(os);
      this.close(is);
   }
 
   /**
    * 替换段落里面的变量
    * @param doc 要替换的文档
    * @param params 参数
    */
   private void replaceInPara(XWPFDocument doc, Map<String, Object> params) {
      Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
      XWPFParagraph para;
      while (iterator.hasNext()) {
         para = iterator.next();
         this.replaceInPara(para, params);
      }
   }
 
   /**
    * 替换段落里面的变量
    * @param para 要替换的段落
    * @param params 参数
    */
   private void replaceInPara(XWPFParagraph para, Map<String, Object> params) {
      List<XWPFRun> runs;
      Matcher matcher;

String runText="";
      if (this.matcher(para.getParagraphText()).find()) {
         runs = para.getRuns();
         if (runs.size()>0){

      int j = runs.size();

      for (int i = 0;i<j;i++){

        XWPFRun run = runs.get(0);

        String i1 = run.toString;

        runText+=i1;

        para.removeRun(0);

      }

    }
            matcher = this.matcher(runText);

if (matcher.find()) {
                while ((matcher = this.matcher(runText)).find()) {
                   runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));
                }
                //直接调用XWPFRun的setText()方法设置文本时,在底层会重新创建一个XWPFRun,把文本附加在当前文本后面,
                //所以我们不能直接设值,需要先删除当前run,然后再自己手动插入一个新的run。
              
                para.insertNewRun(0).setText(runText);
            }
         }
      }
   }
 
   /**
    * 替换表格里面的变量
    * @param doc 要替换的文档
    * @param params 参数
    */
   private void replaceInTable(XWPFDocument doc, Map<String, Object> params) {
      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) {
                   this.replaceInPara(para, params);
                }
            }
         }
      }
   }
 
   /**
    * 正则匹配字符串
    * @param str
    * @return
    */
   private Matcher matcher(String str) {
      Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);
      Matcher matcher = pattern.matcher(str);
      return matcher;
   }
 
   /**
    * 关闭输入流
    * @param is
    */
   private void close(InputStream is) {
      if (is != null) {
         try {
            is.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
 
   /**
    * 关闭输出流
    * @param os
    */
   private void close(OutputStream os) {
      if (os != null) {
         try {
            os.close();
         } catch (IOException e) {
            e.printStackTrace();
         }
      }
   }
 
}

时间: 2024-08-24 14:30:03

word 包括列表的 套打 (已经解决有的可以 有的不可以) 针对拆分到两个甚至更多的XWPFRun中问题的相关文章

word多级列表设置参数

你不知道的word多级列表设置参数 - 阿德的文章 - 知乎 https://zhuanlan.zhihu.com/p/58622426 首发于办公图文编辑 关注专栏写文章 你不知道的word多级列表设置参数 阿德 从事图文工作的自由职业者. 20 人赞同了该文章 你不知道的word多级列表设置参数 多级列表是word中的一个常用的重要功能.其中一些常用的设置,大家应该是很熟悉的,不再多言.多级列表中还有一些不常用,但是也比较重要的设置值得说一说.通过点击“定义新的多级列表”,进入如下图的设置对

Ubuntu“无法解析或打开软件包的列表或是状态文件”的解决办法。_StarSasumi_新浪博客

Ubuntu"无法解析或打开软件包的列表或是状态文件"的解决办法. (2011-04-30 14:56:14) 转载▼ 标签: ubuntu apt 分类: Ubuntu/Linux 早上起来习惯性地打开更新管理器看看,结果出现"无法解析或打开软件包的列表或是状态文件"的错误,具体信息是: 初始化包信息时遇到无法解决的问题. 请汇报这个"update-manager"软件包的错误,并且将如下信息包含在报告中: 'E:Encountered a s

比对两个Word文件内容是否一致的C#解决办法

using System; using System.Windows.Forms; using System.Diagnostics; using Microsoft.Office.Interop.Word; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(obj

【SSH进阶之路】一步步重构容器实现Spring框架——解决容器对组件的“侵入式”管理的两种方案--主动查找和控制反转(九)

目录 [SSH进阶之路]一步步重构容器实现Spring框架--从一个简单的容器开始(八) [SSH进阶之路]一步步重构容器实现Spring框架--解决容器对组件的"侵入式"管理的两种方案--主动查找和控制反转(九) [SSH进阶之路]一步步重构容器实现Spring框架--配置文件+反射实现IoC容器(十)(未更新) [SSH进阶之路]一步步重构容器实现Spring框架--彻底封装,实现简单灵活的Spring框架(十一)(未更新) 对于IOC的原理,我们曾经写过一篇博文,[SSH进阶之路

通过freemarker出word的技术解决方案_通过点击一个按钮临时实现生成一个word,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表

 通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名改成ftl文件 详细步骤如下: 模板制作(将要动态显示的数据打上标记,这个标记是freemarker中的EL标记,要注意的是,要控制值为空的情况,下面${(site.wzmc)?default("")}标识当网站名称为空的时候显示空值,如果这里如果不做控制,在实际项目中会显示错误!) 另外

Word撤销键(Ctrl+z)无效的解决方法

最近翻译一本新书,Word2013用的较多,于是发现了一个奇怪的问题,撤销按钮一直是灰色.编辑的时候闪一下,又变为灰色.按Ctrl-Z也同样不管用.中文资源里面的解决方法都是用winword.exe /safe启动一次,再进入Word就恢复正常了(例如这篇文章).但是这个方法不是一劳永逸的.我又查了下英文资源,找到一个改注册表的方法. 关闭正在运行的所有程序. 按Win-R,在运行框中键入regedit,然后单击“确定”. 在注册表编辑器中,展开到下列注册表子项: Microsoft Offic

Office word 2007不能另存为pdf格式的解决方法

我们在使用Office word 2007时,经常会使用到另存为 PDF 或 XPS(P),遗憾的是,很多人都找不到这个选项, 或者在安装word的时候,并没有安装该加载项,需要你在后期安装,我们来怎么解决没有“另存为PDF或XPS”选项怎么办. 1.打开office word 2007,按快捷键F1打开帮助,在搜索框中输入pdf.点击启用对其他文件格式(如 PDF 和 XPS)的支持 2.在出现的页面中,翻到如下界面,点击连接,按相应的语言,下载 2007 Microsoft Office 加

奔五的人学ios:swift竟然没有字符串包括,找个简单的解决方法

swift关于字符串的推断中 有前导.有后缀 两个方法.竟然没有包括推断. 经过学习找了个简单的解决方法: extension String { func has(v:String)->Bool { return self.componentsSeparatedByString(v).count > 1 } }

python 基础,包括列表,元组,字典,字符串,set集合,while循环,for循环,运算符。

1.continue 的作用:跳出一次循环,进行下一次循环 2.break 跳出不再循环 3.常量 (全是大写)NAME = cjk  一般改了会出错 4.python的第三方库,先安装再导入.装模块:pip 命令 例如:pip install pandas 5.os.system(command)在linux 和window上都行 6.res  = os.popen('ipconfig').read() 7.pyc是个什么东西. 8.sys.exit()直接跳出所有 9.列表:name =