精华内容
下载资源
问答
  • org.apache.poi.xwpf.* poi

    2016-12-06 13:55:36
    org.apache.poi.xwpf.converter-0.9.0 org.apache.poi.xwpf.converter.xhtml-1.0.2 org.apache.poi.xwpf.converter-0.9.0 poi-3.10-FINAL-20140208 等
  • POI XWPF对word的操作

    2014-06-21 22:17:28
    主要讲述了Java POI 中XWPF对word的操作方式,以及实际例子讲解。
  • org.apache.poi.xwpf.converter.core-1.0.6org.apache.poi.xwpf.converter.core-1.0.6org.apache.poi.xwpf.converter.core-1.0.6org.apache.poi.xwpf.converter.core-1.0.6
  • XWPF POI word文档操作

    万次阅读 2017-07-24 12:26:04
    XWPFWord文档基础知识的简介word文档包括 页眉、页脚、脚注、批注、链接、正文部分,在XWPF中都有与之对应的类: .docx文件的文档的根 XWPFDocument 页眉 XWPFHeader 页脚 XWPFFooter 脚注 XWPFFootnote ...

    运用Poi的XWPF操作word文档


    Word文档基础知识的简介

    word文档包括 页眉、页脚、脚注、批注、链接、正文部分,在XWPF中都有与之对应的类:
    .docx文件的文档的根 XWPFDocument
    页眉 XWPFHeader
    页脚 XWPFFooter
    脚注 XWPFFootnote
    批注 XWPFComment
    链接 XWPFHyperlink
    内容主体
    页眉,页脚,脚注,内容主体部分由 段落(XWPFParagraph)、表格(XWPFTable)、图片(XWPFPicture)部分组成.每个类都有相应丰富的方法。了解了这些结构,对于掌握XWPF有很大帮助。每一个XWPF类型,都有与之对应的CT*,个人认为CT*更接近底层操作.

    XWPFParagraph 文档、表格、标题等中的段落

    CTP ctp = para.getCTP();段落可以设置对齐方式,字体,设置标签等操作。

    //遍历段落
    XWPFParagraph para = ...;
    //通过ctp直接获取相应的段落
    XWPFParagraph paraOther = document.getParagraph(ctp)
    List <XWPFRun> runs = para.getRuns(); 
        for (XWPFRun run : runs) {
        CTR ctr = run.getCTR();
        System.out.println(run.getText(0));
    }
    //删除段落
    para.getDocument().removeBodyElement(para.getDocument().getPosOfParagraph(para));

    XWPFRun 相同属性设置的文本区域

    CTR ctr = run.getCTR(); XWPFRun是组成XWPFParagraph等元素,对于文本的操作更细致化的在这一个类,区分段落中的XWPFRun非常不容易,因为每个XWPFRun不同体现在很多因素。

    XWPFRun run = ..
    XWPFRun runOther = para.getRun(ctr);
    run.setText(value, pos);
    run.getText(0)
    //删除
    para.removeRun(index)

    XWPFTable 文档中的表格

    CTTbl ct = table.getCTTbl();表格存在行(XWPFTableRow), 每行存在单元格(XWPFTableCell), 每个单元格有段落(XWPFParagraph) 遍历表格:

    List<XWPFTableRow> rows = table.getRows();
        CTTbl ct = table.getCTTbl();
        System.out.println("table text\t" + table.getText());
        System.out.println("Table rowBandSize:\t" + table.getRowBandSize());
        for (XWPFTableRow row : rows) {
        CTRow ctrow = row.getCtRow();
        XWPFTableRow rowother = table.getRow(ctrow);
        List<ICell> cells = row.getTableICells();
        List<XWPFTableCell> xcells = row.getTableCells();
        for (XWPFTableCell cell: xcells) {
            CTTc cttc = cell.getCTTc();
            XWPFTableCell otherCell = row.getTableCell(cttc);
            System.out.println("cell text\t" + cell.getText());
        }
    }
    
    

    合并单元格

    //跨行跨列合并
    public void mergeCells(XWPFTable table, int fromrow, int endrow, int fromcell, int endcell) {
            //先合并行
        for (int rowindex = fromrow; rowindex <= endrow; rowindex++) {
            XWPFTableRow row = table.getRow(rowindex);
            if (rowindex == fromrow) {          
                    row.getCell(fromcell).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
                } else {
                    row.getCell(fromcell).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
                }
            }
            //合并列
        for (int rowindex = fromrow; rowindex <= endrow; rowindex++) {
            for (int cellindex = fromcell; cellindex <= endcell; cellindex++) {
                XWPFTableCell cell = table.getRow(rowindex).getCell(cellindex);
                if (cellindex == fromcell) {
                    cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
                } else {
                    cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
                }
            }
        }
    }
    
    
    //跨列合并
    public void mergeCellsByCol(XWPFTable table, int rowindex, int fromcell, int endcell) {
        for (int cellindex = fromcell; cellindex <= endcell; cellindex++) {
            XWPFTableCell cell = table.getRow(rowindex).getCell(cellindex);
            if (cellindex == fromcell) {
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }
    
    
    //跨行合并
    public void mergeCellByRow(XWPFTable table,  int cellindex, int fromrow, int endrow) {
        for (int rowindex = fromrow; rowindex <= endrow; rowindex++) {
            XWPFTableRow row = table.getRow(rowindex);
            if (rowindex == fromrow) {
                row.getCell(cellindex).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                row.getCell(cellindex).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

    XWPFPictureData 文档中的图片

    List<XWPFPictureData> pictureDatas = document.getAllPictures();
    public void watchPicture(XWPFPictureData pdata) {
        System.out.println("图片名称:\t" + pdata.getFileName());
        System.out.println("图片类型:\t" + pdata.getPictureType());
        byte[] data = pdata.getData();
    }

    word转HTML

    public void wordToHtml() throws XWPFConverterException, IOException {
        //图片存储
        File imageFolderFile = new File("d:/test/media");
    
        XHTMLOptions options = XHTMLOptions.create().URIResolver(new FileURIResolver(imageFolderFile));
        options.setExtractor(new FileImageExtractor(imageFolderFile));
        OutputStream out = new FileOutputStream("E:/test/wth.html");
        XHTMLConverter.getInstance().convert(document, out, options);
        out.close();
    }
    展开全文
  • fr.opensagres.poi.xwpf.converter.core-2.0.2、fr.opensagres.poi.xwpf.converter.pdf-2.0.1
  • org.apache.poi.xwpf.converter.core-1.0.2.jar 之前找的都要分,来个不要分的,只能找到1.0.2以下的
  • org.apache.poi.xwpf.converter.pdf-1.0.6.jar 文件 org.apache.poi.xwpf.converter.pdf-1.0.6 org.apache.poi.xwpf.converter.core-1.0.6 org.apache.poi.xwpf.converter-0.9.1
  • org.apache.poi.xwpf.converter.xhtml是Oracle公司官方文档上的jar包
  • springboot整合xwpf将world转为pdf 该案例实现: 1.读取world模版 2.动态填充world模版数据 3.将填充好的world转换为pdf 目录结构 引入pom依赖 <dependency> <groupId>fr.opensagres.xdocreport</...

    springboot整合xwpf将world转为pdf

    该案例实现:
    1.读取world模版
    2.动态填充world模版数据
    3.将填充好的world转换为pdf

    目录结构

    在这里插入图片描述

    引入pom依赖

    <dependency>
        <groupId>fr.opensagres.xdocreport</groupId>
        <artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
        <version>1.0.6</version>
    </dependency>
    

    Controller

    package com.example.demo.controller;
    
    import org.apache.poi.xwpf.converter.pdf.PdfConverter;
    import org.apache.poi.xwpf.converter.pdf.PdfOptions;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    @Controller
    @RequestMapping( "/pdf" )
    public class WorldToPDF4 {
    
        private static final Logger logger = LoggerFactory.getLogger(WorldToPDF4.class);
    
        @GetMapping("/pdf")
        public void test(HttpServletResponse response) throws Exception {
            logger.info("获取world模板...");
            File inputWordFile = new File("src/main/resources/templet/c.docx");
            InputStream source = new FileInputStream(inputWordFile);
            BufferedOutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
            PdfOptions options = PdfOptions.create();
            XWPFDocument doc = new XWPFDocument(source);
            logger.info("读取world模版成功!");
    
            Map<String, Object> params = new HashMap<String, Object>();
            params.put("heroName", "司马徽");
            params.put("time", "2021-06-06");
    
            // 替换变量占位符 ${xxx}格式,如:${name}
            replaceParams(doc, params);
            logger.info("替换world模版动态数据成功!");
            // 转换为pdf
            PdfConverter.getInstance().convert(doc, outputStream, options);
            logger.info("转换pdf成功!");
    
            byte[] buffer = new byte[1024];
            int lenght = 0;
            while ((lenght = source.read(buffer)) > 0) {
                outputStream.write(buffer, 0, lenght);
            }
            close(outputStream);
            close(source);
            logger.info("下载pdf成功!");
        }
    
        /**
         * 替换段落里面的变量
         *
         * @param doc    要替换的文档
         * @param params 参数
         */
        private void replaceParams(XWPFDocument doc, Map<String, Object> params) {
            Iterator<XWPFParagraph> iterator = doc.getParagraphsIterator();
            XWPFParagraph paragraph;
            while (iterator.hasNext()) {
                paragraph = iterator.next();
                replaceParam(paragraph, params);
            }
        }
    
        /**
         * 替换段落里面的变量
         *
         * @param paragraph 要替换的段落
         * @param params    参数
         */
        private void replaceParam(XWPFParagraph paragraph, Map<String, Object> params) {
            List<XWPFRun> runs;
            Matcher matcher;
            String runText = "";
    
            if (matcher(paragraph.getParagraphText()).find()) {
                runs = paragraph.getRuns();
                int j = runs.size();
                for (int i = 0; i < j; i++) {
                    runText += runs.get(0).toString();
                    //保留最后一个段落,在这段落中替换值,保留段落样式
                    if (!((j - 1) == i)) {
                        paragraph.removeRun(0);
                    }
                }
                matcher = matcher(runText);
                if (matcher.find()) {
                    while ((matcher = matcher(runText)).find()) {
                        runText = matcher.replaceFirst(String.valueOf(params.get(matcher.group(1))));
                    }
                    runs.get(0).setText(runText, 0);
                }
            }
    
        }
    
        /**
         * 正则匹配字符串
         *
         * @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();
                }
            }
        }
    }
    
    

    world文档内容

    在这里插入图片描述

    测试

    启动服务,访问接口:localhost:2080/pdf/pdf

    转换出来的pdf为:
    在这里插入图片描述

    控制台打印结果:
    在这里插入图片描述

    抛了一个异常。没有去处理
    测试OK!
    这是一个简单的填充模版。如果复杂的话,需要好好设置world模版,包括排版,不然的话转换出来的pdf会走样了。

    欢迎大佬们留言评论,共同学习!!!感谢!!!

    ===========================
    原创文章,转载注明出处!

    展开全文
  • XDocReport 操作word、pdf、jpg、png依赖包,org.apache.poi.xwpf.converter.pdf-1.0.6.jar
  • org.apache.poi.xwpf.converter

    千次下载 热门讨论 2014-08-11 10:17:41
    WORD07转HTML所需JAR包,org.apache.poi.xwpf.converter
  • org.apache.poi.xwpf.converter.pdf-1.0.6 org.apache.poi.xwpf.converter.core-1.0.6 org.apache.poi.xwpf.converter-0.9.1
  • org.apache.poi.xwpf.converter-0.9.8.jar.zip
  • org.apache.poi.xwpf.converter.core-1.0.2-sources.jar.zip
  • poi中xwpf怎么获取图片在word文档中的位置,xwpf把文档中所有图片分离出来了,我想生成word,图片位置设置总是找不到。
  • org.apache.poi.xwpf.usermodel不存在问题

    千次阅读 2020-09-18 16:25:10
    程序包org.apache.poi.xwpf.usermodel不存在问题! 天在使用POI包解析word文档的时候,遇到了个让我恶心了好久的bug。。。 就是包已经导入成功了,代码引用也没问题,一运行就报 org.apache.poi.xwpf.usermodel不...

    参考文章

    问题

    天在使用POI包解析word文档的时候,遇到了个让我恶心了好久的bug。。。
    就是包已经导入成功了,代码引用也没问题,

    一运行就报 org.apache.poi.xwpf.usermodel不存在 错误。
    

    我以为是包没下载下来,但是去本地maven仓库和lib上看都有这个jar包。。百思不得其解。。

    maven项目,pom.xml导包。。

    问题报错如下:

    在这里插入图片描述

    解决办法:

    • cmd 进入到项目路径下,执行 mvn idea:idea 命令
    • 如果再次执行报错没有找到主类的话,点击 file -> invalidated 清除idea的缓存。或者install一下。
      如下图:

    在这里插入图片描述

    若报错:

    在这里插入图片描述

    清理缓存:

    在这里插入图片描述

    或者maven install 一下。 问题终于得以解决。

    PS:其实 mvn idea:idea 命令是用于下载不完整的依赖的命令,具体可百度。

    终极解决办法(评论区小伙伴提供)

    我遇到的是POI包可以导入编译的时候没有报错,然后运行的时候报包不存在,然后百度各种方法都试过一遍都没解决,也清了idea的缓存,但是都不行,最后我是 把项目路径下的.idea文件删掉,重新导入项目 才解决的
    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • C# 生成word文档(NPOI.XWPF

    千次阅读 2019-07-15 11:42:00
    一、基础 1、创建Word ...using NPOI.XWPF.UserModel XWPFDocument doc = new XWPFDocument(); //创建新的word文档 XWPFParagraph p1 = doc.CreateParagraph(); //向新文档中添加段落 p1.Set...

    一、基础

    1、创建Word

    using NPOI.XWPF.UserModel
            XWPFDocument doc = new XWPFDocument();      //创建新的word文档
            
            XWPFParagraph p1 = doc.CreateParagraph();   //向新文档中添加段落
            p1.SetAlignment(ParagraphAlignment.CENTER); //段落对其方式为居中
    
            XWPFRun r1 = p1.CreateRun();                //向该段落中添加文字
            r1.SetText("测试段落一");
    
            XWPFParagraph p2 = doc.CreateParagraph();
            p2.SetAlignment(ParagraphAlignment.LEFT);
    
            XWPFRun r2 = p2.CreateRun();
            r2.SetText("测试段落二");
         r2.SetFontSize(16);//设置字体大小
           r2.SetBlod(true);//设置粗体
    
            FileStream sw = File.Create("cutput.docx"); //...
            doc.Write(sw);                              //...
            sw.Close();                                 //在服务端生成文件
    
            FileInfo file = new FileInfo("cutput.docx");//文件保存路径及名称  
                                                        //注意: 文件保存的父文件夹需添加Everyone用户,并给予其完全控制权限
            Response.Clear();
            Response.ClearHeaders();
            Response.Buffer = false;
            Response.ContentType = "application/octet-stream";
            Response.AppendHeader("Content-Disposition", "attachment;filename=" 
                + HttpUtility.UrlEncode("output.docx", System.Text.Encoding.UTF8));
            Response.AppendHeader("Content-Length", file.Length.ToString());
            Response.WriteFile(file.FullName);
            Response.Flush();                           //以上将生成的word文件发送至用户浏览器
    
            File.Delete("cutput.docx");

    2、特殊字符

    代码实现起来很简单。

    run之前的代码就不写了。大家可以网上搜索。

    run.FontFamily = "Wingdings 2";//这边是特殊字符的字体
    text = text.Replace("name", Convert.ToChar(0x0052).ToString());//0x0052是特殊字符的十六进制代码
    //text = text.Replace("name", "R");//该代码也可以实现(0x0052对应的字符就是R)

    3、NOPI读取Word模板并渲染保存

    using NPOI.XWPF.UserModel;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    
    
    namespace TestNPOI
    {
        public class NPOIHleper
        {
    
            public static void Export()
            {
                string filepath = HttpContext.Current.Server.MapPath("~/simpleTable.docx");
                var tt = new  { name = "cjc", age = 29 };
                using (FileStream stream = File.OpenRead(filepath))
                {
                    XWPFDocument doc = new XWPFDocument(stream);
                    //遍历段落                  
                    foreach (var para in doc.Paragraphs)
                    {
                        ReplaceKey(para, tt);
                    }                    //遍历表格      
                    var tables = doc.Tables;
                    foreach (var table in tables)
                    {
                        foreach (var row in table.Rows)
                        {
                            foreach (var cell in row.GetTableCells())
                            {
                                foreach (var para in cell.Paragraphs)
                                {
                                    ReplaceKey(para, tt);
                                }
                            }
                        }
                    }
    
                    FileStream out1 = new FileStream(HttpContext.Current.Server.MapPath("~/simpleTable" + DateTime.Now.Ticks + ".docx"), FileMode.Create);
                    doc.Write(out1);
                    out1.Close();
                }
            }
    
            private static void ReplaceKey(XWPFParagraph para, object model)
            {
                string text = para.ParagraphText;
                var runs = para.Runs;
                string styleid = para.Style;
                for (int i = 0; i < runs.Count; i++)
                {
                    var run = runs[i];
                    text = run.ToString();
                    Type t = model.GetType();
                    PropertyInfo[] pi = t.GetProperties();
                    foreach (PropertyInfo p in pi)
                    {
                        //$$与模板中$$对应,也可以改成其它符号,比如{$name},务必做到唯一
                        if (text.Contains("$" + p.Name + "$"))
                        {
                            text = text.Replace("$" + p.Name + "$", p.GetValue(model, null).ToString());
                        }
                    }
                    runs[i].SetText(text, 0);
                }
            }
    
        }
    }

     

    模板:

    111

    结果:

    222

     

    二、实践(渲染Word模板、插入特殊字符、指定表格位置插入行)

    1、项目搭建

    1、创建项目

    2、创建类库和引入NPOI

     

     报错

      报搜尝试解决方案一

    在项目下面建立upload文件夹,然后使用相对路径访问。

     在其他目录下请把upload目录权限授予asp.net用户。

     

     最后直接暴力EveryOney  也无效,找到的原因是参数位置搞错了,文件名+路径最后改为 路径+文件名的方式
     

    3、贴上代码

    using NPOI.XWPF.UserModel;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    
    namespace NPOITest
    {
        public class NPOIHleper
        {
    
    
            /// <summary>
            /// 输出模板docx文档
            /// </summary>
            /// <param name="tempFilePath">模板文件地址</param>
            /// <param name="outFolder">输出文件夹</param >
            /// <param name="fileName">文件名</param>
            /// <param name="data">数据格式Json->new { name = "cjc", age = 29 }</param>
            public static void CreateWord(string tempFilePath, string outFolder, string fileName, object data)
            {
                using (FileStream stream = File.OpenRead(tempFilePath))
                {
                    XWPFDocument doc = new XWPFDocument(stream);
                    //遍历段落                  
                    foreach (var para in doc.Paragraphs)
                    {
                        ReplaceKey(para, data);
                    }   //遍历表格      
                    var tables = doc.Tables;
                    foreach (var table in tables)
                    {
                        foreach (var row in table.Rows)
                        {
                            foreach (var cell in row.GetTableCells())
                            {
                                foreach (var para in cell.Paragraphs)
                                {
                                    ReplaceKey(para, data);
                                }
                            }
                        }
                    }
                    var fullPath = Path.Combine(outFolder, fileName);
                    FileStream outFile = new FileStream(fullPath, FileMode.Create);
                    doc.Write(outFile);
                    outFile.Close();
                }
            }
            /// <summary>
            /// 遍历替换段落位置字符
            /// </summary>
            /// <param name="para">段落参数</param>
            /// <param name="model">数据</param>
            private static void ReplaceKey(XWPFParagraph para, object model)
            {
                string text = para.ParagraphText;
                var runs = para.Runs;
                string styleid = para.Style;
                for (int i = 0; i < runs.Count; i++)
                {
                    var run = runs[i];
                    text = run.ToString();
                    Type t = model.GetType();
                    PropertyInfo[] pi = t.GetProperties();
                    foreach (PropertyInfo p in pi)
                    {
                        //$$与模板中$$对应,也可以改成其它符号,比如{$name},务必做到唯一
                        if (text.Contains("{$"+p.Name+"}"))
                        {
                            text = text.Replace("{$" + p.Name+"}", p.GetValue(model, null).ToString());
                        }
                    }
                    runs[i].SetText(text, 0);
                }
            }
        }
    }

    调用方式

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace NPOITest.Controllers
    {
        public class HomeController : Controller
        {
            public ActionResult Index()
            {
                var  data = new  { name = "cjc", age = 29 };
                string fileName = Guid.NewGuid() + "_声明.docx";
                string folder = Server.MapPath("~/upload"); //当前运行环境
                string tempTemplateFile = folder+"/测试.docx";
                string folders = "D:\\TempFile"; //当前运行环境
                NPOIHleper.CreateWord(tempTemplateFile, folders, fileName, data);
                //
                ViewBag.Title = "Home Page";
    
                return View();
            }
        }
    }

    对应模板

     

    三、实践(指定表格位置插入行)

    代码:

    using NPOI.OpenXmlFormats.Wordprocessing;
    using NPOI.XWPF.UserModel;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Web;
    
    namespace NPOITest
    {
        public class NPOIHleper
        {
    
    
            /// <summary>
            /// 输出模板docx文档
            /// </summary>
            /// <param name="tempFilePath">模板文件地址</param>
            /// <param name="outFolder">输出文件夹</param >
            /// <param name="fileName">文件名</param>
            /// <param name="data">数据格式Json->new { name = "cjc", age = 29 }</param>
            public static void CreateWord(string tempFilePath, string outFolder, string fileName, object data)
            {
                using (FileStream stream = File.OpenRead(tempFilePath))
                {
                    XWPFDocument doc = new XWPFDocument(stream);
                    //遍历段落                  
                    foreach (var para in doc.Paragraphs)
                    {
                        ReplaceKey(para, data);
                    }   //遍历表格      
                    var tables = doc.Tables;
                    foreach (var table in tables)
                    {
                        foreach (var row in table.Rows)
                        {
                            foreach (var cell in row.GetTableCells())
                            {
                                foreach (var para in cell.Paragraphs)
                                {
                                    ReplaceKey(para, data);
                                }
                            }
                        }
                    }
                    //单独对表格新增
                    var oprTable = tables[1];
    
    
                    XWPFTableRow m_Row=oprTable.InsertNewTableRow(1);//创建一行/并且在某个位置添加一行
                    m_Row.AddNewTableCell().SetText ("创建一行仅有一个单元格");
    
    
                    //XWPFTableRow m_Row2 = oprTable.InsertNewTableRow(2);//创建一行/并且在某个位置添加一行
                    ////m_Row2.AddNewTableCell().SetText("添加的新行");
                    //XWPFTableCell cellCt_P = m_Row2.CreateCell();//创建一个单元格,创建单元格时就创建了一个CT_P
    
                    //cellCt_P = m_Row2.CreateCell();
                    //cellCt_P = m_Row2.CreateCell();
    
                    ////单元格行和表
                    //CT_Tc cttc = cellCt_P.GetCTTc();
                    //CT_TcPr ctPr = cttc.AddNewTcPr();
                    ////ctPr.gridSpan.val = "3";//合并3列
                    //ctPr.AddNewVMerge().val = ST_Merge.restart;//合并行
                    //cellCt_P.SetText("创建一行仅有一个单元格(合并后)");
    
    
                    XWPFTableRow m_Row2 = oprTable.InsertNewTableRow(2);//创建一行/并且在某个位置添加一行
                    XWPFTableCell tc3 = m_Row2.CreateCell();//创建单元格
                    tc3.SetText("创建一行仅有一个单元格(合并后)");
                    CT_Tc ct3 = tc3.GetCTTc();
                    CT_TcPr cp3 = ct3.AddNewTcPr();
                    cp3.gridSpan = new CT_DecimalNumber();
                    cp3.gridSpan.val = "3"; //合并3列   
    
    
                    XWPFTableRow m_Row3 = oprTable.InsertNewTableRow(2);//多个单元格以及合并
                    m_Row3.AddNewTableCell().SetText("添加的新行单元格1");
                    m_Row3.AddNewTableCell().SetText("添加的新行单元格2");
                    m_Row3.AddNewTableCell().SetText("添加的新行单元格3");
    
    
                    var fullPath = Path.Combine(outFolder, fileName);
                    FileStream outFile = new FileStream(fullPath, FileMode.Create);
                    doc.Write(outFile);
                    outFile.Close();
                }
            }
            /// <summary>
            /// 遍历替换段落位置字符
            /// </summary>
            /// <param name="para">段落参数</param>
            /// <param name="model">数据</param>
            private static void ReplaceKey(XWPFParagraph para, object model)
            {
                string text = para.ParagraphText;
                var runs = para.Runs;
                string styleid = para.Style;
                for (int i = 0; i < runs.Count; i++)
                {
                    var run = runs[i];
                    text = run.ToString();
                    Type t = model.GetType();
                    PropertyInfo[] pi = t.GetProperties();
                    foreach (PropertyInfo p in pi)
                    {
                        //$$与模板中$$对应,也可以改成其它符号,比如{$name},务必做到唯一
                        if (text.Contains("{$" + p.Name + "}"))
                        {
                            text = text.Replace("{$" + p.Name + "}", p.GetValue(model, null).ToString());
                        }
                    }
                    runs[i].SetText(text, 0);
                }
            }
        }
    }

    结果:

     

     

     

    四、实践(指定表格内单元格(字体)下划线+字符)

    简单说明:

                    XWPFParagraph p1 = doc.CreateParagraph(); //段落
                    XWPFRun _run = p1.CreateRun();
                    _run.SetText("一个单元格");
                    _run.SetUnderline(UnderlinePatterns.Single);//段落下划线

    既有文字加文字(下划线)

                    XWPFTableRow m_Row2 = oprTable.InsertNewTableRow(2);//创建一行/并且在某个位置添加一行
                    XWPFTableCell tc3 = m_Row2.CreateCell();//创建单元格
                    //tc3.SetText("创建一行仅有一个单元格(合并后)");
    
                    XWPFParagraph p1 = doc.CreateParagraph(); //段落
                    XWPFRun _run = p1.CreateRun();
                    _run.SetText("一个单元格");
                    _run.SetUnderline(UnderlinePatterns.Single);//段落
    
                    XWPFParagraph p12 = doc.CreateParagraph(); //无段落
                    XWPFRun _run2 = p1.CreateRun();
                    _run2.SetText("一个单元格");
    
    
                    tc3.SetParagraph(p1);

     

     

    这种写法我发现别扭,应该为

                    //单独对表格新增
                    var oprTable = tables[1];
    
                    XWPFTableRow m_Row2 = oprTable.InsertNewTableRow(2);//创建一行/并且在某个位置添加一行
                    XWPFTableCell tc3 = m_Row2.CreateCell();//创建单元格
    
                    XWPFParagraph p1 = doc.CreateParagraph(); //段落1开始  1、注意这个段落是Doc创建的会导致表格外有段落出现
                    XWPFRun _run = p1.CreateRun();
                    _run.SetText("下划线");
                    _run.SetUnderline(UnderlinePatterns.Single);//段落1结束
    
                    //_run.AddCarriageReturn();2、注意只对表格外换行有效
                    XWPFRun _run2 = p1.CreateRun();
                    _run2.SetText("#####");
    
                    tc3.SetParagraph(p1);
    

      发现我需要换行,思路还是不对,经过我读取拿到文档的数据结构,即表格的XWPFTableCell单元格paragraph属性如下:

     

    经更改

     

                    //单独对表格新增
                    var oprTable = tables[1];
    
                    XWPFTableRow m_Row2 = oprTable.InsertNewTableRow(2);//创建一行/并且在某个位置添加一行
                    XWPFTableCell tc3 = m_Row2.CreateCell();//创建单元格
    
                    XWPFParagraph p1 = tc3.AddParagraph();
                    XWPFRun _run = p1.CreateRun();
                    _run.SetText("下划线");
                    _run.SetUnderline(UnderlinePatterns.Single);//段落1结束
    
                    //_run.AddCarriageReturn();2、注意只对表格外换行有效
                    XWPFParagraph p2 = tc3.AddParagraph();
                    XWPFRun _run2 = p2.CreateRun();
                    _run2.SetText("####");
    
                    //这里设置了一下 //在复制这个就无效了 tc3.SetParagraph(p1); 想要添加通过(add方式)tc3.AddParagraph();
                    tc3.SetParagraph(p1);

     

    五、实践出现模板渲染替换问题

    解决办法:删掉->重新写->可以从记事本复制

     

     

     其他妙用

    //新建段落     
    
    XWPFParagraph p1 = doc.CreateParagraph();
    
    //对齐方式
    
     p1.SetAlignment(ParagraphAlignment.LEFT);
    
    p1.SetVerticalAlignment(TextAlignment.AUTO);
    
    //Word边框样式
    
    p1.SetBorderBottom(Borders.DOUBLE);
    p1.SetBorderTop(Borders.DOUBLE);
    p1.SetBorderRight(Borders.DOUBLE);
    p1.SetBorderLeft(Borders.DOUBLE);
    
    p1.SetBorderBetween(Borders.SINGLE);
    
                //新建文字
    
                XWPFRun rUserHead = p1.CreateRun();
    
    //文字内容
    
                rUserHead.SetText("员工 : ");
    
    //颜色
    
                rUserHead.SetColor("4F6B72");
    
    //大小
    
                rUserHead.SetFontSize(15);
    
    //是否加粗
    
                rUserHead.SetBold(true);
    
    //字体
    
                rUserHead.SetFontFamily("宋体");
    
    //是否有下划线
    
                //r1.SetUnderline(UnderlinePatterns.DotDotDash);
    
    //位置
    
                rUserHead.SetTextPosition(20);
    
    //增加换行
    
    rUserHead.AddCarriageReturn();

     

    需求整理(动态在某个单元格内插入多个字段)

    1、原本样子以及要实现的效果

     实现的效果

    原因:

     

    需求整理(动态插入表格)

    1、原本样子以及要实现的效果

     

    转载于:https://www.cnblogs.com/fger/p/11187954.html

    展开全文
  • org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerException at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77) at org.apache.poi.xwpf...
  • 我使用xdocreport的xwpf来读取docs文档,并转换成html, 代码如下 核心代码如下: public static String word2htmlString(XWPFDocument document, FileImageExtractorImpl imageProcessor) throws IOException { ...
  • xwpf替换word内容和表格提前工作引入相关依赖修改word模板替换内容和表格自定义转换map注解定义替换查询结果bean读取word,查询段落和表格以及导出替换word到指定目录替换段落标记替换表格标记总结 提前工作 引入...
  • 2.maven poi-ooxml包版本问题导致org.apache.poi.xwpf.usermodel缺: IRunBody.class,如下: poi-ooxml-3.15:org.apache.poi.xwpf.usermodel 包含有IRunBody.class 而poi-ooxml-3.6:or...
  • 就是包已经导入成功了,代码引用也没问题,一运行就报org.apache.poi.xwpf.usermodel不存在 错误。我以为是包没下载下来,但是去本地maven仓库和lib上看都有这个jar包。。百思不得其解。。 maven项目,pom.xml...
  • Error:(19, 21) java: 无法访问org.apache.poi.xwpf.usermodel.ParagraphAlignment 找不到org.apache.poi.xwpf.usermodel.ParagraphAlignment的类文件 今天在使用POI包解析word文档(我要实现的功能是导出Word...
  • org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerException at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77) at org.a
  • import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;...import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apa

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,371
精华内容 948
关键字:

xwpf