精华内容
下载资源
问答
  • 使用java poi进行模版文件的上传,生成表单,重新生成文件。同时包括表单中含有下拉框等选项的处理。
  • 在项目需求中,需要对于一个word模板文档生成相对应的word文件,而此word模板是多页的并且需要在最终文件生成相应的目录,由于项目环境是Linux,所以舍弃了jacob(windows环境)。然后主要是研究了Apache poi 进行...

    在项目需求中,需要对于一个word模板文档生成相对应的word文件,而此word模板是多页的并且需要在最终文件中生成相应的目录,由于项目环境是Linux,所以舍弃了jacob(windows环境)。然后主要是研究了Apache poi 进行word操作以及如何生成目录。
    主要分两个部分介绍:

    1. Apache poi 操作word:主要是通过XWPFDocument对象进行操作,api 地址:http://poi.apache.org/apidocs/dev/
    //读取word文件
    InputStream is = new FileInputStream(path);  
    XWPFDocument doc = new XWPFDocument(is);  
    List<IBodyElement> elements=  doc.getBodyElements();//获取所有元素(段落和表格)
    int pIndex =0;
    int tIndex =0;
    for(int i=0 ; i< elements.size(); i++) {
    	IBodyElement e = elements.get(i);
    	//判断元素类型:段落/ 表格
    	if(BodyElementType.PARAGRAPH.equals(e.getElementType())) {
    		XWPFParagraph pa = e.getBody().getParagraphArray(pIndex); //获取段落
    		List<XWPFRun> runs = paragraph.getRuns(); //获取段落文本
                    for (XWPFRun run : runs) {
                          ...替换文本
                    }
    	}
    	else if(BodyElementType.TABLE.equals(e.getElementType())){//表格
                   XWPFTable ta = e.getBody().getTableArray(tIndex);
                   List<XWPFTableRow> rows = ta.getRows(); //获取所有行
                   for (XWPFTableRow row : rows) { 遍历每行
    			List<XWPFTableCell> cells = row.getTableCells(); //获取每行单元格
    			for (XWPFTableCell cell : cells) { //遍历单元格
    				List<XWPFParagraph> paragraphs = cell.getParagraphs(); //获取单元格段落
    				for (XWPFParagraph paragraph : paragraphs) {
    					List<XWPFRun> runs = paragraph.getRuns();//获取单元格文本
    					for (XWPFRun run : runs) {
    						...替换文本
    					}
    				}
    			}
    		}
        	}
    }
    

    操作word方面还是很方便,可以参考一些更详细的:
    https://blog.csdn.net/eye9093/article/details/77368703
    https://blog.csdn.net/u012775558/article/details/79678701

    主要是介绍一下目录如何生成
    2. .Apache poi 生成word目录: 需要了解ooxml(Office Open XML)的大体结构,参考:http://www.datypic.com/sc/ooxml/s-wml.xsd.html,主要是通过xml标签进行识别分页。

    之前在网上也查阅了很多,发现目录的页数问题始终没有一个好的解决方案,之前看的可以通过转成pdf计算页数,但是这个耗时太长,特别是对于我们项目word页数较多的时候转换再重写消耗的时间很长。所以选择再去研究一下word对应的xml文件是否有思路去解决这一问题。
    我们选择的是xxx.docx 文件,通过word另存为xml
    在这里插入图片描述

    获取到此word文件的xml文件,xml文件结构如下:
    在这里插入图片描述
    其实大体看一下可以大致理清xml的结构,而我们主要是关注这一个标签
    在这里插入图片描述
    这个标签就是分页之后产生的标签(经测试插入空白页不会产生这个标签,如果是遇到表格处于分页那么分页后的表格的第一个单元格必须有文本,不然也不会产生这个标签,而且文档必须有页码),而通过获取这个标签就可以计算出页数,可以看出这个标签位置是<w:p>下的<w:r>下,可以通过poi判断这个标签是否存在:
    在这里插入图片描述

    主要代码如下:

    .//承接上面的获取的段落
    int num =1;//页数
    XWPFParagraph pa = e.getBody().getParagraphArray(pIndex); //获取段落
    List<CTR> ctrlist = pa.getCTP().getRList();//获取<w:p>标签下的<w:r>list
    for(int j=0; j < ctrlist.size(); j++) {  .//遍历r
    	CTR r = ctrlist.get(j); 
            List<CTEmpty> breaklist = r.getLastRenderedPageBreakList();//判断是否存在此标签
            if(breaklist.size() > 0) {
           		num++; //页数添加
            }
    }
    

    由此可以高效率的获取到页码,生成目录的代码可以参考:https://www.jianshu.com/p/0a32d8bd6878

    所以大体功能实现思路如下:

    1. POI读取word模板文件(模板必须有页码并且目录位置先用标签标记),然后进行模板内容替换。
    2. 内容替换完毕后,再整体遍历所有段落和表格,在添加目录项时将对应的目录标题和页码作为参数传入,生成目录。
    3. 全部生成完毕后,将文档输出到目标文件。
    展开全文
  • java通过poi-tl使用word模版生成word文件

    千次阅读 热门讨论 2017-11-13 14:36:10
    问题描述:使用work模板文件生成word文件。 问题解决:1、使用apache poi 来生成word文件 2、使用Poi-tl生成...poi-tl:poi template language 一个基于poiword模板生成文档的开源组件。 文档介绍:http://deep

    问题描述:使用work模板文件来生成word文件。

    问题解决:1、使用apache poi 来生成word文件  2、使用Poi-tl生成 

    本章主要讲如何使用poi-tl通过模版文件生成word文件。



    关于poi-tl

    poi-tl:poi template language 一个基于poi的word模板生成文档的开源组件。

    文档介绍:http://deepoove.com/poi-tl/

    GitHub地址:https://github.com/Sayi/poi-tl

    代码地址:见github的junit测试用例 


    中文文档地址:https://github.com/Sayi/poi-tl/wiki/1.%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3

    poi-tl 语法

    所有的语法结构都是以 {{ 开始,以 }} 结束(在下一版本中,语法将支持自定义),文档的样式继承模板标签的样式,也可以在渲染数据中指定,实现了样式的最大自由化。
    {{template}}
    普通文本,渲染数据为:String或者TextRenderData

    {{@template}}
    图片,渲染数据为:PictureRenderData

    {{#template}}
    表格,渲染数据为:TableRenderData


    {{*template}}
    列表,渲染数据为:NumbericRenderData


    poi-tl使用

    1.首先在工程中引用poi-tl:

    <dependency>
        <groupId>com.deepoove</groupId>
        <artifactId>poi-tl</artifactId>
        <version>0.0.3</version>
    </dependency>

    2.使用方法
      @org.junit.Test
        public void testPicture(){
        	final String tt="asdfasdfa";
        	Map<String, Object> datas = new HashMap<String, Object>() {
    			{
    				//本地图片
    				put("photo", new PictureRenderData(100, 116, 图片路径+"/111.jpg"));
    				put("name","刘一刀");
    				put("oname","");
    				put("xb","男");
    				put("csrq","19900104");
    				put("mz","汉族");
    				put("zzmm","团员");
    				put("sfzjh","511024199001034543");
    				put("xjh","G511024199001034543");
    				put("txdz","四川省内江市威远县");
    				put("p191","1887282822");
    				put("thinkTable",new TableRenderData(new ArrayList<RenderData>() {
    					{
    						add(new TextRenderData("FFFFFF",tt));
    						add(new TextRenderData("FFFFFF", "活动时间或次数"));
    					}
    				}, new ArrayList<Object>() {
    					{
    						add("在成都唱歌在成都唱歌在成都唱歌在成都唱歌在成都唱歌;2");
    						add("在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌;3");
    					}
    				}, "no datas", 8600));
    				put("aaa",new NumbericRenderData(new ArrayList<TextRenderData>(){{
    					add(new TextRenderData("FF00FF", "活动内容"));
    					add(new TextRenderData("FF00FF", "活动时间或次数"));
    					add(new TextRenderData("FF00FF", "在成都唱歌在成都唱歌在成都唱歌在成都唱歌在成都唱歌;2"));
    					add(new TextRenderData("FF00FF", "在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌在上海唱歌;3"));
    				}}));
    //				//本地图片byte数据
    //				put("localBytePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getLocalByteArray(new File("src/test/resources/logo.png"))));
    //				//网路图片 
    //				put("urlPicture", new PictureRenderData(100, 100, ".png", BytePictureUtils.getUrlByteArray("https://avatars3.githubusercontent.com/u/1394854?v=3&s=40")));
    //				// java 图片
    //				put("bufferImagePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getBufferByteArray(bufferImage)));
    			}
    		};
    
    		XWPFTemplate template = XWPFTemplate.compile(模版文件目录+"/aaaa.docx")
    				.render(datas);
    //		XWPFTemplate template = XWPFTemplate.compile("/opt/gzkgfiles/template/evaluate/qarchive.docx")
    //				.render(datas);
    		FileOutputStream out;
    		try {
    			out = new FileOutputStream(输出路径+"/out_picture1.docx");
    			template.write(out);
    			out.flush();
    			out.close();
    			template.close();
    		} catch (FileNotFoundException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	
        }




    模版如下图:






    输出结果如下:





    展开全文
  • JAVA使用POI-TL通过Word模板生成Word文件

    万次阅读 热门讨论 2018-08-15 16:04:24
    技术背景 很多时候我们网站或者系统需要提供一些word文件,例如证明.docx或者订单....这里主要讲解如何通过一个制作好的word模板文件,通过数据填充,生成加工好的word文件。 官方网站 http://deepoove.com/...

    技术背景

    很多时候我们网站或者系统需要提供一些word文件,例如证明.docx或者订单.docx等文件供用户下载打印等。

    用Java操作word文档,毫无疑问,当下最流行apache poi,对于poi如何操作word文档,这里不作过多介绍。

    这里主要讲解如何通过一个制作好的word模板文件,通过数据填充,生成加工好的word文件。

    官方网站

    http://deepoove.com/poi-tl

    Maven

    <dependency>
        <groupId>com.deepoove</groupId>
        <artifactId>poi-tl</artifactId>
        <version>1.3.1</version>
    </dependency>
    

    实战内容


    以下源码已经上传再我的开源项目里面的spring-cloud-study-poi
    https://github.com/moshowgame/spring-cloud-study

    说先是新建模板word文档(。docx格式,2007/2013/2016新格式的)
    这里写图片描述
    运行效果

    这里写图片描述

    核心实现代码

    
    @RestController
    public class PoiController {
    
    	@GetMapping("/generateWord")
    	public ApiReturnObject  generateWord(String data){
    			//图片路径,请注意你是linux还是windows
    			String wordPath="C:\\Users\\Administrator\\Desktop\\";
    			String modelName="人物模板.docx";
    			String outputName="hanyunxi.docx";
    			Map<String, Object> datas = new HashMap<String, Object>() {
    				{
    					//本地图片
    					put("name","鞠婧祎");
    					put("team","前SNH48");
    					put("gender","女");
    					put("birthday","19940618");
    					put("remark","鞠婧祎,1994年6月18日出生于四川遂宁,毕业于四川音乐学院附属中学,中国女演员、歌手,原SNH48 TEAM NII成员[1]。2013年9月5日,升格为SNH48 TEAM NII二期生正式成员;11月2日,以《剧场女神》公演正式出道。2014年6月7日,拍摄个人首支MV《足球派对》;7月26日,参加SNH48“一心向前”演唱会暨SNH48第一届总选举,演唱《流着泪微笑》并获SNH48总选举第四名。2015年1月15日,发行出道两周年EP《青春的约定》。2016年12月10日,获“星光大赏”年度新锐电视剧女演员。2017年1月1日,参加安徽卫视《国剧盛典》;3月27日,获第24届东方风云榜音乐盛典“年度飞跃歌手”奖[2];5月4日,获团中央“五四优秀青年”称号;5月25日,发行第二张个人EP《等不到你》;[3]7月29日,参加“我心翱翔”第四届总选举发布演唱会,获得SNH48第四届总选举第1名;[4]12月15日,SNH48官方宣布,鞠婧祎正式从SNH48 Group单飞、成立个人工作室。2018年3月26日,获第25届《东方风云榜》音乐盛典年度跨界艺人奖。7月28日,参加湖南卫视综艺节目《快乐大本营》。");
    					put("active",new NumbericRenderData(new ArrayList<TextRenderData>(){{
    						add(new TextRenderData("FF00FF", "2013年 以《剧场女神》公演正式出道"));
    						add(new TextRenderData("FF00FF", "2014年 拍摄个人首支MV《足球派对》"));
    						add(new TextRenderData("FF00FF", "2015年 发行出道两周年EP《青春的约定》"));
    						add(new TextRenderData("FF00FF", "2016年 主演玄幻剧《九州天空城》"));
    					}}));
    					put("tables", new TableRenderData(new ArrayList<RenderData>(){{
    						add(new TextRenderData("d0d0d0", "节目"));
    						add(new TextRenderData("d0d0d0", "次数"));
    					}},new ArrayList<Object>(){{
    						add("《SNH星剧院公演》;999");
    						add("《敢ZUO敢为女声秀》;4");
    						add("《快乐大本营》;2");
    					}}, "no datas", 10600));
    //				//网路图片
    				put("picture", new PictureRenderData(200, 250, ".png", BytePictureUtils.getUrlByteArray("https://pic.baike.soso.com/ugc/baikepic2/18293/cut-20170602162513-2088410512.jpg/300")));
    
    				}
    			};
    
    			XWPFTemplate template = XWPFTemplate.compile(wordPath+modelName)
    					.render(datas);
    			FileOutputStream out;
    			try {
    				out = new FileOutputStream(wordPath+outputName);
    				template.write(out);
    				out.flush();
    				out.close();
    				template.close();
    			} catch (FileNotFoundException e) {
    				e.printStackTrace();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    
    
    		return ApiReturnUtil.success(data);
    	}
    
    }
    

    支持的模板标签

    • 文本模板{{var}}
    put("author", new TextRenderData("000000", "Sayi卅一"));
    put("introduce", "http://www.deepoove.com");
    
    • 图片模板{{@var}}
    // 本地图片
    put("localPicture", new PictureRenderData(120, 120, "./sayi.png"));
    
    // 本地图片byte数据
    byte[] localByteArray = BytePictureUtils.getLocalByteArray(new File("./logo.png"));
    put("localBytePicture", new PictureRenderData(100, 120, ".png", localByteArray));
    
    // 网络图片
    put("urlPicture", new PictureRenderData(100, 100, ".png", BytePictureUtils.getUrlByteArray("https://avatars3.githubusercontent.com/u/1394854")));
    
    // java 图片
    put("bufferImagePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getBufferByteArray(bufferImage)));
    
    • 表格模板{{#var}}
    put("changeLog", new TableRenderData(new ArrayList<RenderData>(){{
    				add(new TextRenderData("d0d0d0", ""));
    				add(new TextRenderData("d0d0d0", "introduce"));
    			}},new ArrayList<Object>(){{
    				add("1;add new # gramer");
    				add("2;support insert table");
    				add("3;support more style");
    			}}, "no datas", 10600));
    
    • 列表模板{{*var}}
    put("feature", new NumbericRenderData(new ArrayList<TextRenderData>() {
      {
        add(new TextRenderData("Plug-in grammar"));
        add(new TextRenderData("Supports word text, header..."));
        add(new TextRenderData("Not just templates, but also style templates"));
      }
    }));
    
    • 文档模板{{+var}}
    List<SegmentData> segments = new ArrayList<SegmentData>();
    SegmentData s1 = new SegmentData();
    s1.setTitle("经常抱怨的自己");
    s1.setContent("每个人生活得都不容易,经常向别人抱怨的人,说白了就是把对方当做“垃圾场”,你一股脑地将自己的埋怨与不满倒给别人,自己倒是爽了,你有考虑过对方的感受吗?对方的脸上可能一笑了之,但是心里可能有一万只草泥马奔腾而过。");
    segments.add(s1);
    
    SegmentData s2 = new SegmentData();
    s2.setTitle("拖拖拉拉的自己");
    s2.setContent("能够今天做完的事情,不要拖到明天,你的事情没有任何人有义务去帮你做;不要做“宅男”、不要当“宅女”,放假的日子约上三五好友出去转转;经常动手做家务,既能分担伴侣的负担,又有一个干净舒适的环境何乐而不为呢?");
    segments.add(s2);
    
    put("docx_word", new DocxRenderData(new File("~/segment.docx"), segments));
    

    可能的报错

    如果出现这个错误,要判断文件后缀名是doc,还是docx。
    对POI来说,如果是doc,使用HSSFWorkbook;如果是docx,使用XSSFWorkbook。
    而POI-TL封装的是docx的版本,现在是主流格式,所以推荐用这个,当然,输出文件随意,你输出文件名弄成doc也ok(格式)

    org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)
    	at org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(ZipHelper.java:184)
    	at org.apache.poi.openxml4j.opc.internal.ZipHelper.openZipStream(ZipHelper.java:241)
    	at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:98)
    	at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324)
    	at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)
    	at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:116)
    	at com.deepoove.poi.NiceXWPFDocument.<init>(NiceXWPFDocument.java:85)
    	at com.deepoove.poi.XWPFTemplate.compile(XWPFTemplate.java:129)
    	at com.deepoove.poi.XWPFTemplate.compile(XWPFTemplate.java:110)
    	at com.deepoove.poi.XWPFTemplate.compile(XWPFTemplate.java:78)
    	at com.deepoove.poi.XWPFTemplate.compile(XWPFTemplate.java:74)
    	at com.softdev.system.demo.controller.PoiController.generateWord(PoiController.java:51)
    
    展开全文
  • 根据Word模板生成Word文件 (JAVA POI)

    千次阅读 2019-07-26 22:24:49
    通过提前准备的word模板,渲染填充数据,生成新的加工好的word文件。(也试过使用Freemarker渲染数据,但是有个很大的弊端:使用Freemarker模板文件会变得很大,大概为原来的十五至二十倍。) 用法 POI的...
    • 需求

         通过提前准备的word模板,渲染填充数据,生成新的加工好的word文件。(也试过使用Freemarker渲染数据,但是有个很大的弊端:使用Freemarker渲染的后文件会变大)

    • 用法

    •     POI的Maven依赖
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.8</version>
    </dependency>
    • 需要将模板参数设置成如下格式, 另存为word文档即可

    • 直接放代码,仅供参考

    import com.cloudlead.common.worker.client.exception.RestClientException;
    import org.apache.commons.lang.StringUtils;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.usermodel.*;
    import org.apache.xmlbeans.XmlOptions;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText;
    
    import java.io.*;
    import java.util.*;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /*
    *
    * 文档处理类
    *
    * */
    public class WordTemplateUtil {
    
        /*从word模板 渲染参数 获取word文档
        *   template 模板文件 params 参数 outputStream 输出流,
        */
        public static void wordRenderAndGetFromWordTemplate(File template, Map<String,String> params, OutputStream outputStream)throws Exception{
    
            FileInputStream inputStream = new FileInputStream(template);
    
            XWPFDocument templateDoc = new XWPFDocument(inputStream);
            produce(templateDoc,params);
            templateDoc.write(outputStream);
    
        }
         /* 处理参数 生成doc */
        public static void produce(XWPFDocument templateDoc,Map<String,String> params){
    
            Iterator<XWPFParagraph> iterator = templateDoc.getParagraphsIterator();
    
            while(iterator.hasNext()){
    
                XWPFParagraph next = iterator.next();
    
                if (next.isEmpty()||!match(next.getParagraphText())){
                    continue;
                }
                next.getRuns().forEach(
                    run -> setNewTextforRun(run,params)
                );
    
            }
    
        }
    
    /*
        * 正则匹配 返回 matcher
        * */
        public static Matcher matcher(String text){
            Pattern pattern = Pattern.compile("\\$\\{(.+?)}", Pattern.CASE_INSENSITIVE);
            return pattern.matcher(text);
        }
        /*
        * 判定是否包匹配
        * */
        public static boolean match(String text){
            Matcher matcher = matcher(text);
            return matcher.find();
        }
        /*
        * 替换参数 设置新参数
        * */
        public static void setNewTextforRun(XWPFRun run,Map<String,String> params){
    
            List<CTText> ctTexts = run.getCTR().getTList();
    
            ctTexts.forEach(
                ctText->{
                    String text = ctText.getStringValue();
                    Matcher matcher = matcher(text);
    
                    while(matcher.find()){
    
                        String group = matcher.group();
                        if (group.contains(" ")){
                            throw new RestClientException("${}表达式不能包含空格");
                        }
    
                        String name = group.substring(2, group.length()-1);
                        String value = params.get(name);
                        value = value==null?"":value;
    
                        if (text.equals(group)){
                            text=value;
    
                        }else{
                            //转义
                            String[] parts = text.split("\\$\\{"+name+"}");
                            //length=1 分前后 设置参数值
                            if (parts.length==1){
                                String part = parts[0];
                                text = text.indexOf(part)==0?(part+value):(value+part);
                            }else{
                                text = StringUtils.join(parts,value);
                            }
    
                        }
    
                    }
                    ctText.setStringValue(text);
                }
            );
    
        }
    }
    • 调用代码示例

    
     @GetMapping("/templateExport")
     public void exportContractFromTemplate() throws Exception{
         /*设置参数*/
         Map<String,String> params = new HashMap<>();
         params.put("partyA","华为");
         params.put("partyB","新浪");
         params.put("contractNo","NO2019100506")
         params.put("signTime","2019年10月05日");
         String templatePath = "C:\\Users\\Administrator\\Desktop\\template.docx";
         response.setHeader("Content-Disposition", "attachment;filename=out.doc");
         response.setContentType("'application/msword';charset=UTF-8");
         response.setCharacterEncoding("UTF-8");
         WordTemplateUtil.wordRenderAndGetFromWordTemplate(
           new File(templatePath ), params, response.getOutputStream()
         );
        
     }
    

     

    展开全文
  • POI是apache提供的可以操作word文档的第三方jar。POI能操作word是使用XWPFDocument对象 主要操作 pom 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</...
  • java利用poi生成word

    2017-08-10 15:14:19
    java利用poi生成word,可直接导入,docx的模板文件也在里面,模板要放在D盘根目录呀
  • 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持。 使用说明:https://blog.csdn.net/u012775558/article/details/79678701
  • 使用java poi动态编辑生成word文件生成报表信息。支持插入循环list数据和单个数据得工具类,和测试模板,直接导入就能使用
  • 使用java Apache poi 根据word模板生成word报表

    万次阅读 多人点赞 2018-03-24 16:19:37
    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行。 代码示例下载:...
  • java poi 通过模板生成word文档

    热门讨论 2014-07-22 17:10:34
    java使用poi,根据模板生成word文档.
  • java 中 使用 poi 生成 word

    千次阅读 2019-04-23 16:28:55
    生成两种word,首先在pom.xml加如依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependen...
  • Java POI读取word生成

    2019-04-24 16:13:22
    使用java poi模板生成word文件,方便数据的展示。规范数据在word的排版。
  • java poi替换word内容生成pdf文件

    万次阅读 热门讨论 2019-01-15 14:15:17
    替换word文档内容 package com.docx.test; import org.apache.poi.xwpf.usermodel.*; import org.junit.Test; import java.io.*; import java.util.HashMap; import java.util.Iterator; import java.util.List; ...
  • //读取word文件=(path);=(is);=();//获取所有元素(段落和表格)=0;=0;for(inti=0;();i++){IBodyElemente=elements.get(i);//判断元素类型:段落/表格if(BodyElementType.PARAGRAPH.equals(e.getElementType())){...
  • Java POI导出word文件生成表格

    千次阅读 2020-03-25 17:04:37
    HWPF是处理 Microsoft Word 97(-2007) .doc文件格式,它还为较旧的Word 6和Word 95文件格式... XWPF是处理 Word 2007 .docx文件格式,包含在poi-ooxml-XXX.jar中。 虽然HWPF和XWPF提供类似的功能,但目前两者...
  • 利用poi读取word模板文件生成新的word文档 利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码。解决模板读取异常问题,提供wordUtils工具类(各种功能实现) 第一步: 项目结构见下图: 第二...
  • 一、问题: ...当生成的排版格式不是你想...这就是解决问题的思路,思路很重要,比你去苦苦对照代码,怀疑代码编写错误的意义要大很多,这个排版问题我用了半天时间才解决,原因是我刚开始不熟悉这个poi生成word
  • java 使用poi根据模版导出word文件文件中的标签替换成文字或者文件 文件中标签用{xxxx}生成文件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,982
精华内容 1,192
热门标签
关键字:

javaword模板poi生成文件

java 订阅