怎么用java输出控制word循环

package word;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.poi.POIXMLDocument;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;

/**

  • @author wei.jia
  • @Created on 2014-10-28
  • */
    public class ReplaceVarInWordImpl {

    // 返回Docx中需要替换的特殊字符,没有重复项
    // 推荐传入正则表达式参数"\$\{[^{}]+\}"
    public ArrayList getReplaceElementsInWord(String filePath,
    String regex) {
    String[] p = filePath.split("\.");
    if (p.length > 0) {// 判断文件有无扩展名
    // 比较文件扩展名
    if (p[p.length - 1].equalsIgnoreCase("doc")) {
    ArrayList al = new ArrayList();
    File file = new File(filePath);
    HWPFDocument document = null;
    try {
    InputStream is = new FileInputStream(file);
    document = new HWPFDocument(is);
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    } catch (IOException e) {
    e.printStackTrace();
    }
    Range range = document.getRange();
    String rangeText = range.text();
    CharSequence cs = rangeText.subSequence(0, rangeText.length());
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(cs);
    int startPosition = 0;
    while (matcher.find(startPosition)) {
    if (!al.contains(matcher.group())) {
    al.add(matcher.group());
    }
    startPosition = matcher.end();
    }
    return al;
    } else if (p[p.length - 1].equalsIgnoreCase("docx")) {
    ArrayList al = new ArrayList();
    XWPFDocument document = null;
    try {
    document = new XWPFDocument(
    POIXMLDocument.openPackage(filePath));
    } catch (IOException e) {
    e.printStackTrace();
    }
    // 遍历段落
    Iterator itPara = document
    .getParagraphsIterator();
    while (itPara.hasNext()) {
    XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
    String paragraphString = paragraph.getText();
    CharSequence cs = paragraphString.subSequence(0,
    paragraphString.length());
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(cs);
    int startPosition = 0;
    while (matcher.find(startPosition)) {
    if (!al.contains(matcher.group())) {
    al.add(matcher.group());
    }
    startPosition = matcher.end();
    }
    }
    // 遍历表
    Iterator itTable = document.getTablesIterator();
    while (itTable.hasNext()) {
    XWPFTable table = (XWPFTable) itTable.next();
    int rcount = table.getNumberOfRows();
    for (int i = 0; i < rcount; i++) {
    XWPFTableRow row = table.getRow(i);
    List cells = row.getTableCells();
    for (XWPFTableCell cell : cells) {
    String cellText = "";
    cellText = cell.getText();
    CharSequence cs = cellText.subSequence(0,
    cellText.length());
    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(cs);
    int startPosition = 0;
    while (matcher.find(startPosition)) {
    if (!al.contains(matcher.group())) {
    al.add(matcher.group());
    }
    startPosition = matcher.end();
    }
    }
    }
    }
    return al;
    } else {
    return null;
    }
    } else {
    return null;
    }
    }

    // 替换word中需要替换的特殊字符
    public static boolean replaceAndGenerateWord(String srcPath,
    String destPath, Map map) {
    String[] sp = srcPath.split("\.");
    String[] dp = destPath.split("\.");
    if ((sp.length > 0) && (dp.length > 0)) {// 判断文件有无扩展名
    // 比较文件扩展名
    if (sp[sp.length - 1].equalsIgnoreCase("docx")) {
    try {
    XWPFDocument document = new XWPFDocument(
    POIXMLDocument.openPackage(srcPath));
    // 替换段落中的指定文字
    Iterator itPara = document
    .getParagraphsIterator();
    while (itPara.hasNext()) {
    XWPFParagraph paragraph = (XWPFParagraph) itPara.next();
    List runs = paragraph.getRuns();
    for (int i = 0; i < runs.size(); i++) {
    String oneparaString = runs.get(i).getText(
    runs.get(i).getTextPosition());
    for (Map.Entry entry : map
    .entrySet()) {
    oneparaString = oneparaString.replace(
    entry.getKey(), entry.getValue());
    }
    runs.get(i).setText(oneparaString, 0);
    }
    }

                // 替换表格中的指定文字
                Iterator<XWPFTable> itTable = document.getTablesIterator();
                while (itTable.hasNext()) {
                    XWPFTable table = (XWPFTable) itTable.next();
                    int rcount = table.getNumberOfRows();
                    for (int i = 0; i < rcount; i++) {
                        XWPFTableRow row = table.getRow(i);
                        List<XWPFTableCell> cells = row.getTableCells();
                        for (XWPFTableCell cell : cells) {
                            String cellTextString = cell.getText();
                            for (Entry<String, String> e : map.entrySet()) {
                                if (cellTextString.contains(e.getKey()))
                                    cellTextString = cellTextString
                                            .replace(e.getKey(),
                                                    e.getValue());
                            }
                            cell.removeParagraph(0);
                            cell.setText(cellTextString);
                        }
                    }
                }
                FileOutputStream outStream = null;
                outStream = new FileOutputStream(destPath);
                document.write(outStream);
                outStream.close();
                return true;
            } catch (Exception e) {
                e.printStackTrace();
                return false;
            }
    
        } else
        // doc只能生成doc,如果生成docx会出错
        if ((sp[sp.length - 1].equalsIgnoreCase("doc"))
                && (dp[dp.length - 1].equalsIgnoreCase("doc"))) {
            HWPFDocument document = null;
            try {
                document = new HWPFDocument(new FileInputStream(srcPath));
                Range range = document.getRange();
                for (Map.Entry<String, String> entry : map.entrySet()) {
                    range.replaceText(entry.getKey(), entry.getValue());
                }
                FileOutputStream outStream = null;
                outStream = new FileOutputStream(destPath);
                document.write(outStream);
                outStream.close();
                return true;
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return false;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
    

    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String filepathString = "e:/Doc1.docx";
    String destpathString = "e:/Doc5.docx";
    Map map = new HashMap();

    map.put("${Wenyang}", "温飏");
    System.out.println(replaceAndGenerateWord(filepathString,
    destpathString,map));
    }

    }
    上面是代码。
    例如:班级学生人数不同要根据人数停止输出内容

0

1个回答

Java中map的循环输出
Java多线程:用三个线程控制循环输出10次ABC
黑马程序员 JAVA循环控制
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

0

好吧,代码确实太长 太。。。根据人数不同控制循环次数很简单:
for(int i = 0;i<班级个数;i++)
for(int j = 0;i<班级[i]人数;i++)
{
输出;
}

0
chentravelling
生活没有if-else 第二个循环是 吧i都改成j~~~~~~~打错~
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
freemarker 生成word 循环输出list内容,并且排序
大家可以使用foxe工具,比较方便查看ftl文件 留作纪念
java通过freemarker导出word文档带图片并且循环
转载请标明出处:https://blog.csdn.net/weixin_41965979/article/details/80969287 本文出自付付讶的博客 1:所需jar包:freemarker(我用的是freemarker-2.3.18); 首先准备一个word模板(英文部分是要被你的数据所代替的) 2:把这个模板保存为xml格式 3:页面上写好按钮和下拉框选择第几组...
利用模板导出文件(三)之word中的Table循环导出
 利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word) 如果对于导出的table表格,每一行的数据格式不一样,那就可以采用循环的格式输出,参考一下代码: if (null != list &amp;amp;&amp;amp; 0 != list.size()) { ArrayList table = new ArrayLis...
使用freemark导出数据到Word(遍历List)
1、根据word编辑模板如下: 2、将该模板另存为xml文件,进而重命名为.ftl文件,就得到了freemark的模板,因为是一个列表显示,我们需要所以我们需要根据freemark的标签进行改写,找到word中的每一个表格的行进行改写,改写后的ftl的文件如下: 3、导出工具类 package org.nercita.bcp.word.util; import java.io.Fi
POI使用word模板文件循环输出行并导出word
一个使用Apache的poi使用word模板循环输出表格行并导出的例子
Web导出(二)之Freemarker+XML导出Word
在Web应用中,有时需要按照固定的模板将数据导出到Word,如流程审批单,在流程处理完成后将处理过程按照流程单的要求导出,有时程序中需要实现生成标准Word文档,要求能够打印,并且保持页面样式不变,常见的方案有POI、iText、JACOB、JSP几种方式,POI读取Word文档
framemaker 导出word文档,利用list遍历输出换行以及保留段落格式(首行空两格)
java 代码// word行遍历语言--下面两行单独使用 均有效--目前不启用 String strFWrap = "${KEY}"; strFWrap = "${KEY}"; //单独行文字 String strWrap = "${KEY}"; // 数组转换成list   for (int i = 0; i < strVals.length; i++) {    Stri
java HelloWord(控制台输入和输出)
public class helloword { public static void main(String[] args) { //控制台输出 //快速打印输出 :syso+"alt"+"/",回车 System.out.println("Helloword!"); int a; //控制台输入
用java在控制台输出Hello World!
/* 作者:XXX 功能:在控制台输出Hello World! 日期:2016-05-25 */ //public:表示这个类是公共的 //class:表示这是一个类 //Hello:类名,类名首字母一般大写 public class Hello {  //主函数,程序的入口   public static void main(String args[])   {
第一个插件,用Java在控制台输出Hello world
1,先新建一个hbuilder 移动app mui项目,在项目中新建一个js文件(我的命名为test.js,放在js文件夹下),并输入以下代码,并在index.html中引用 document.addEventListener( &quot;plusready&quot;, function() { // 声明的JS“扩展插件别名” var _BARCODE = '...
java导出word之freemarker导出(详细教程)
最近需要做一个导出word的功能, 在网上搜索了一下,发现了各种方法,但是在这个过程中遇到不少问题,各种报错,各种调试,先整理各种总结,希望能对大家有所帮助,少走弯路。欢迎大家留言交流。同时感谢网络中的大神,帮助我学习进步。 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的样式也不美观,于是选择了另一种方式----fee
javaSE基础编程——for循环(输入行数,列数,输出对应行列数的*)
按照提示在控制台输入相应的行数列数,输出* 如:输入3行4列,输出 **** **** **** package countdemo; import java.util.Scanner; public class Count {  public static void main(String[] args) {   // TODO Auto-generated m
Java多线程:用三个线程控制循环顺序输出10次ABC
题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次。解题思路:要按顺序输出ABC, 循环10次,就要控制三个线程同步工作,也就是说要让三个线程轮流输出,直到10个ABC全部输出则结束线程。这里用一个Lock对象来控制三个线程的同步。用一个int型变量state标识由那个线程输出。package com.thread...
Java 循环控制语句的使用
public class ControlLoop { /*控制循环语句 * break 只能用在loop 和 switch 中使用 * continue 只能在loop中使用 * return 能在所有地方使用,不是循环控制语句,但是能控制 */ public static void main(String[] args) { ...
用三个线程控制循环输出10次ABC
public class PrintABC_Syn { private static final int MAXN = 30; private int count = 0; private char currThreadName = 'A'; private final Object lockObj; public PrintABC_Syn(){
Java二重循环打印图案
使用java二重循环打印各种图案总结:外层循环控制行数,是固定的,内层循环控制每行的输出情况,注意写内层循环的满足条件时,要找到每层输出的图形数和外层循环的关系,肯定存在一定的关系,要么是总和一定,要么是存在某种数学关系。举几个例子如下:使用java打印直角三角形、倒直角三角形、等腰三角形、平行四边形、矩形、实心菱形、四种九九乘法表:package BiShiTest;import java.uti
java中使用freemarker导出word文档(带有循环表格+合并单元格)详细说明
java中使用freemarker导出word文档(带有循环表格+合并单元格) 之前做过过导出word的功能,不过也只用到了循环生成表格,百度有很多,这次用到了合并,百度了之后发现找不到详细的制作方法,自己琢磨了一天,查了一下freemarker的语法,最后才做出来,写一个详细的教程分享给大家。 1、首先是java后台代码,我截取了一段,开始定义用到的变量 2、之后是从定义生成的路径到生成文件 ...
Java操作Word模板实现动态数据输出工具类
Java操作Word模板实现动态数据输出工具类
关于用java编写生成word文档,动态添加数据到word文档的一些心得
关于用java编写生成word文档,动态添加数据到word文档的一些心得,经过翻阅了无数的有用的和无用的资料以后,总算找到了一种靠谱的方法1.概述经过反反复复的查阅资料,总算找到了一个靠谱的生成word的方案,这里分享给大家. 2.需求首先我们的需求是通过一个指定的word模板来生成新的word并且填充内容,内容是我们在布局页面上面就写好的,比如说EditText,TextView,或者是图片Ima
js:利用for循环,循环输出HelloWord
循环输出HelloWord document.write('使用javascript循环打印helloword') for(var i=0;i<5;i++){ document.write('helloword') } document.write('helloword') 循环
用java打印出几种图形及简单的了解下循环
小白刚刚学习java,学到循环一节,发现循环语句很有趣,遍动手写了几个小练习,有什么不对的地方请大家指正,代码如下; class Circulation  { public static void main(String[] args)  { System.out.println("第一种"); for(int i=0;i System.out.println
java打印任意行数的杨辉三角 利用二维数组 ,三个for循环:第一个控制行,第二个控制缩进,第三个判断并输出每一行的值)
import java.util.Scanner; /**  * 题目:打印出n行杨辉三角形(要求打印出效果如下图)                   1              1    1            1    2    1          1    3    3    1        1    4    6    4    1      * @author vhviqd...
不使用任何循环和递归,输出打印n条(n>1) "Hello World
import java.util.Arrays;public class test {  public static void main(String[] args) {        String  str=&quot;Hello&quot;;    int  num=6;    Object[]  obj=new  Object[num];    Arrays.fill(obj,str);    String...
java中只用三个循环在控制台输出菱形
在控制台中输出菱形,我们需要用到循环,我们通常用到的是双层循环,即:外层循环控制行数,内层循环分两部分,一部分控制“*”的输出,一部分控制“(空格) ”的输出,这种情况是最常见的,代码如下:public class Rhombus01{/* * *** ***** ******* ***** *** *行数 空格数 星数 n space star 1 3
循环进阶2_用二重循环打印菱形(逻辑思维不行绕晕了,好在绕出正解了)
/* 用二重循环打印以下菱形,注意空格、*号与行数的关系,7行示例图形如下: * 3空1* *** 2空3* ***** 1空5******** 0空7* ***** 1空5* *** 2空3* * 3空1* */import java.util.Scanner;public class Demo{ public static void main(String[]
Java使用简单循环输出一个小写字母表
Example2_1.java public class Example2_1 {    //输出小写字母表 public static void main(String[] args) { char begin_letter='a'; System.out.println("字母a在unicode表中的顺序位置是:"+(int)begin_letter); System.out.p
Java基础——循环嵌套输出直角三角形、菱形、九九乘法表等
前言:该类问题思路是相同的,都是双重for循环实现,区别在于输出的内容不同或者for循环中控制条件的不同。外循环一般控制行数,内循环一般控制列数。下面书写具体代码。       1、输出倒直角三角形: 思路: (1)图形有很多行,每一行对应不同个数,想到for嵌套 (2)外循环控制行数,内循环控制个数 (3)每一行的个数随着行数的增加减一,第一行的个数最多,因此应该用第一行的个数减...
freemarker生成word模版文档及list便利数据(二)
源地址:http://blog.csdn.net/y_love_f/article/details/41596375?utm_source=tuicool&utm_medium=referral   上一篇博客中讲FreeMarker做了简单的介绍,这篇博客就来使用它来完成两个例子。       在项目中使用它完成的功能是按照固定的模板将数据导出到Word。比如台账。在完成后将处理过程按照
巧用matlab做中继实现excel数据按格式输出到word
(由于部分东西涉密,所以有些东西用XX表示。)最近干了一点活,给XX研究所的雷达数据库做一份word文档,目的应该是印出来可以看或者当书好查。Excel表格是3000*30的,代表了3000个雷达的30中特征——频率、功率、最大测距距离等等,要求将其整合成下图所示的形式,因为军事原因,有些雷达的信息不全,因此在做word的时候时候需要注意,没有的项要删除,也就是说,如果不知道该雷达的方位角,在做w
利用for循环输出心❤
public class Heart { public static void main(String[] args){ int i=0,j=0; for(i=1;i<=3;i++){ for(j=1;j<=3-i;j++){ System.out.print(" "); //上左空格 } System.out.prin
Java实例:使用循环打印图形
打印矩形 ****** ****** ****** ****** ****** 实现代码: public class Test{ public static void main(String[] args) { //外层循环 每次输出一行* for (int i = 1; i &amp;lt;= 5; i++) { System....
【Java】用Freemarker完美导出word文档(带图片)或POI导出、在线预览--作为基线查看
原文地址:https://www.cnblogs.com/zwqh/p/7182953.html 建议看如下文章,做过修改:两种方式建议使用第二种 可以先看下这篇文章:通过FreeMarker生成word文档及导出PDF文件 0、在线预览:利用微软在线预览链接展示office相关文档内容 当我们需要将文档展示到页面的时候,往往会想到将office相关文件转换成pdf,然后再通过h5标签等方...
Javafor循环输出菱形
 分析:我们可以这个菱形分成两部分,上面5行和下面4行。    /** * | * | * | *** | * | ***** | * | ******* | * |*********| */ //外部控制行 上部分有5行 所以 i=5 for(int i=1;i&amp;...
C#输出Word文档
总结C#对Word文档的常用操作:按模板创建和动态创建,动态生成表格和目录等
Java导出Word踩坑实录
准备工作 maven 添加依赖 思路 实现 WordUtils WordController 前端js 坑总结 项目中遇到简历导出成Word文档,利用poi和freemark都能实现, 但是poi对于循环处理一些数据会有难度,最终采用freemarker实现 准备工作 maven 添加依赖 &amp;lt;!-- poi --&amp;gt; &amp;lt;dependen...
java 使用 freemarker 导出word 包含 图片和动态的数据表,动态行和动态列
包含 的代码实例修改于 网上一帅哥的代码示例,自己添加了 图片动态的展示和 数据表的动态的行和列
JAVA——for循环语句多重循环输出九九乘法表
package disanzhouzuoye; public class zuoye { public static void main(String[] args) { int i,j; int n = 9; System.out.print(&quot; * |&quot;); for(i = 1;i&amp;lt;=n;i++) System.out.print(&quot; &quot;+i); Sy...
输入循环在什么情况下结束,while(cin>>word) 类型?
最近学习了C++遇到的一个问题,Windows系统下不知道怎么结束~ C++Primer 中,作者经常使用 while(cin>>word) 类似的语法,但是如何结束,可能会出现疑惑 好囧啊!~感觉是被作者给坑了的~ 在 Unix 系统中的实际的现象为:  * 当输入为“字符串,回车,Ctrl+D”的时候,跳出循环; * 当输入为“字符串,Ctrl+D,回车”的时
Java for循环嵌套打印菱形(可控输出行数)
for循环嵌套打印菱形 仅仅给予初学者思路,欢迎大佬评论留言。 import java.util.Scanner; public class Diamond { /** * main方法,程序入口 */ public static void main(String[] args) { // 实例化Scanner Scanner scan = new Scanner(Syst...
freemark导出word(双循环带图片)
freemaeker导出word,(双循环带图片,模板,源码),运行环境jdk7,ftl详细注解
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java学习笔记word java word末班