精华内容
下载资源
问答
  • java 通过poi操作word(doc)文件

    千次阅读 2019-03-07 15:58:08
    通过POI类库实现word文档的创建。 思路: 通过自定义变量名,利用替换的方式,将所需数据填入,一般用于生成固定格式的报告。如果需要填入的数据很多,则略繁琐。 注意: a)、例子中给的只能替换变量,不能根据...

    通过POI类库实现word文档的创建。

    思路:

    通过自定义变量名,利用替换的方式,将所需数据填入,一般用于生成固定格式的报告。如果需要填入的数据很多,则略繁琐。

    注意:

    a)、例子中给的只能替换变量,不能根据结果生成多行数据。例如表格等。

    b)、目前支持DOC格式,不支持DOCX格式

     

    1、需要新建一个word模版,在需要输入数据的地方填入:

    ${变量名}

    变量名称根据自行需要更改。不可有重复名称。

    2、通过POI类,进行变量的替换,以实现word文件的生成。

    3、示例:

    public static void CreatWordByModel(String  tmpFile, Map<String, String> contentMap, String exportFile) throws Exception{
    
            InputStream in = null;
            in = new FileInputStream(new File(tmpFile));
    
            HWPFDocument document = null;
            document = new HWPFDocument(in);
            // 读取文本内容
            Range bodyRange = document.getRange();
            System.out.println(bodyRange.toString());
            System.out.println(bodyRange.text());
            // 替换内容
            for (Map.Entry<String, String> entry : contentMap.entrySet()) {
                bodyRange.replaceText("${" + entry.getKey() + "}", entry.getValue());
            }
    
            //导出到文件
            try {
                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                document.write((OutputStream)byteArrayOutputStream);
                OutputStream outputStream = new FileOutputStream(exportFile);
                outputStream.write(byteArrayOutputStream.toByteArray());
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    }
    
    public static void main(String[] args) throws Exception {
        Map map=new HashMap();
        map.put("data1","20190301");
        map.put("data2","你好");
        map.put("data3","这是一个测试");
        map.put("data4","CSDN");
        map.put("data5","https://blog.csdn.net/yxf771hotmail");
        CreatWordByModel("C:/model.doc",map,"C:/newfile.doc");
    }

    4、结果:

    模版:

    结果:

     

                                         打赏

     

     

    展开全文
  • JAVA中用POI操作word

    万次阅读 多人点赞 2019-07-01 12:01:54
    需求描述:按照给定的word模板生成word文档,模板包含页眉 页脚 文档标题 表格数据 生成后的word效果如下图: 大概要做的效果就如上面的样子了,下面开始做吧。 一.使用apache的poi,在pom中加入maven依赖如下: &...

    该文档方法不全面,请看另一篇 https://blog.csdn.net/weixin_43171019/article/details/104793714

    需求描述:按照给定的word模板生成word文档,模板包含页眉 页脚 文档标题 表格数据
    生成后的word效果如下图:
    在这里插入图片描述
    大概要做的效果就如上面的样子了,下面开始做吧。
    一.使用apache的poi,在pom中加入maven依赖如下:

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.14</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-excelant -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-excelant</artifactId>
        <version>3.14</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-examples -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-examples</artifactId>
        <version>3.14</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.xmlbeans/xmlbeans -->
    <dependency>
        <groupId>org.apache.xmlbeans</groupId>
        <artifactId>xmlbeans</artifactId>
        <version>2.6.0</version>
    </dependency>
    

    二.maven引入成功后 开始处理模板,模板处理如下:
    1.其中companyName就是上面效果图中 “测试替换文本的的公司名”在模板中的埋点,folderName同理;
    2.对于效果图中页眉的的部分 在代码中动态生成,无需埋点
    3.表格中序号 名称 资料形成时间 监理意见 备注 对应每一行进行埋点,在方法处理中根据表格的数据长度动态生成每一行
    在这里插入图片描述
    三.模板处理好以后,下面是主要的工具类代码,基本都加了注释

    package cn.demo.util.wordUtil;
    
    
    import com.auth0.jwt.internal.org.apache.commons.lang3.StringUtils;
    import org.apache.poi.util.Units;
    import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
    import org.apache.poi.xwpf.usermodel.*;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
    
    
    import java.io.*;
    import java.math.BigInteger;
    import java.util.*;
    
    
    
    public class WordReporter {
    
        private String tempLocalPath;
        private XWPFDocument xwpfDocument = null;
        private FileInputStream inputStream = null;
        private OutputStream outputStream = null;
    
        public WordReporter(){
    
        }
        public WordReporter(String tempLocalPath){
            this.tempLocalPath = tempLocalPath;
        }
    
        /**
         *  设置模板路径
         * @param tempLocalPath
         */
        public void setTempLocalPath(String tempLocalPath) {
            this.tempLocalPath = tempLocalPath;
        }
    
        /**
         *  初始化
         * @throws IOException
         */
        public void init() throws IOException{
            inputStream = new FileInputStream(new File(this.tempLocalPath));
            xwpfDocument = new XWPFDocument(inputStream);
        }
    
        /**
         * 导出方法
         * @param params  表格里的数据列表
         * @param orgFullName   需要替换的页眉的公司的名称
         * @param logoFilePath  需要替换的页眉的Logo的图片的地址
         * @param tableIndex    需替换的第几个表格的下标
         * @param textMap       需替换的文本的数据入参
         * @return
         * @throws Exception
         */
        public boolean export(List<Map<String,String>> params,String orgFullName,String logoFilePath, int tableIndex,Map<String,String> textMap) throws Exception{
            //createWaterMark(xwpfDocument);
            createHeader(xwpfDocument,orgFullName,logoFilePath);
            replaceText(xwpfDocument,textMap);
            this.insertValueToTable(xwpfDocument,params,tableIndex);
            return true;
        }
    
        //添加水印  本示例没有用到水印  如果想添加水印  可以在导出方法里调用此方法
        public void createWaterMark(XWPFDocument doc){
            XWPFHeaderFooterPolicy policy=doc.getHeaderFooterPolicy();
            policy.createWatermark("中国华西监理信息管理平台");
    
        }
    
    
    
        /**
         * 替换非表格埋点值
         * @param xwpfDocument
         * @param textMap  需要替换的文本入参
         */
        public void replaceText(XWPFDocument xwpfDocument,Map<String,String> textMap){
            List<XWPFParagraph> paras=xwpfDocument.getParagraphs();
            Set<String> keySet=textMap.keySet();
            for (XWPFParagraph para : paras) {
                //当前段落的属性
                System.out.println("打印获取到的段落的每一行数据++++++++>>>>>>>"+para.getText());
                String str=para.getText();
                System.out.println("========================>>>>>>"+para.getParagraphText());
    
                List<XWPFRun> list=para.getRuns();
                for(XWPFRun run:list){
                    for(String key:keySet){
                        if(key.equals(run.text())){
                            run.setText(textMap.get(key),0);
                        }
                    }
                }
            }
        }
    
    
        /**
         * 循环填充表格内容
         * @param xwpfDocument
         * @param params
         * @param tableIndex
         * @throws Exception
         */
        private   void insertValueToTable(XWPFDocument xwpfDocument, List<Map<String,String>> params, int tableIndex) throws Exception {
            try {
                List<XWPFTable> tableList = xwpfDocument.getTables();
                if (tableList.size() <= tableIndex) {
                    throw new Exception("tableIndex对应的表格不存在");
                }
                XWPFTable table = tableList.get(tableIndex);
                List<XWPFTableRow> rows = table.getRows();
                if (rows.size() < 2) {
                    throw new Exception("tableIndex对应表格应该为2行");
                }
                //模板的那一行
                XWPFTableRow tmpRow = rows.get(1);
                List<XWPFTableCell> tmpCells = null;
                List<XWPFTableCell> cells = null;
                XWPFTableCell tmpCell = null;
                tmpCells = tmpRow.getTableCells();
    
    
                String cellText = null;
                String cellTextKey = null;
                Map<String, Object> totalMap = null;
                for (int i = 0, len = params.size(); i < len; i++) {
                    Map<String, String> map = params.get(i);
                    // 创建新的一行
                    XWPFTableRow row = table.createRow();
                    // 获取模板的行高 设置为新一行的行高
                    row.setHeight(tmpRow.getHeight());
                    cells = row.getTableCells();
                    for (int k = 0, klen = cells.size(); k < klen; k++) {
                        tmpCell = tmpCells.get(k);
                        XWPFTableCell cell = cells.get(k);
                        cellText = tmpCell.getText();
                        if (StringUtils.isNotBlank(cellText)) {
                            //转换为mapkey对应的字段
                            cellTextKey = cellText.replace("$", "").replace("{", "").replace("}", "");
                            if (map.containsKey(cellTextKey)) {
                                // 填充内容 并且复制模板行的属性
                                setCellText(tmpCell, cell, map.get(cellTextKey));
                            }
                        }
                    }
    
                }
                // 删除模版行
                table.removeRow(1);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    
        /**
         *  复制模板行的属性
         * @param tmpCell
         * @param cell
         * @param text
         * @throws Exception
         */
        private void setCellText(XWPFTableCell tmpCell, XWPFTableCell cell,String text) throws Exception {
    
            CTTc cttc2 = tmpCell.getCTTc();
            CTTcPr ctPr2 = cttc2.getTcPr();
            CTTc cttc = cell.getCTTc();
            CTTcPr ctPr = cttc.addNewTcPr();
            if (ctPr2.getTcW() != null) {
                ctPr.addNewTcW().setW(ctPr2.getTcW().getW());
            }
            if (ctPr2.getVAlign() != null) {
                ctPr.addNewVAlign().setVal(ctPr2.getVAlign().getVal());
            }
            if (cttc2.getPList().size() > 0) {
                CTP ctp = cttc2.getPList().get(0);
                if (ctp.getPPr() != null) {
                    if (ctp.getPPr().getJc() != null) {
                        cttc.getPList().get(0).addNewPPr().addNewJc()
                                .setVal(ctp.getPPr().getJc().getVal());
                    }
                }
            }
            if (ctPr2.getTcBorders() != null) {
                ctPr.setTcBorders(ctPr2.getTcBorders());
            }
    
            XWPFParagraph tmpP = tmpCell.getParagraphs().get(0);
            XWPFParagraph cellP = cell.getParagraphs().get(0);
            XWPFRun tmpR = null;
            if (tmpP.getRuns() != null && tmpP.getRuns().size() > 0) {
                tmpR = tmpP.getRuns().get(0);
            }
            XWPFRun cellR = cellP.createRun();
            cellR.setText(text);
            // 复制字体信息
            if (tmpR != null) {
                if(!cellR.isBold()){
                    cellR.setBold(tmpR.isBold());
                }
                cellR.setItalic(tmpR.isItalic());
                cellR.setUnderline(tmpR.getUnderline());
                cellR.setColor(tmpR.getColor());
                cellR.setTextPosition(tmpR.getTextPosition());
                if (tmpR.getFontSize() != -1) {
                    cellR.setFontSize(tmpR.getFontSize());
                }
                if (tmpR.getFontFamily() != null) {
                    cellR.setFontFamily(tmpR.getFontFamily());
                }
                if (tmpR.getCTR() != null) {
                    if (tmpR.getCTR().isSetRPr()) {
                        CTRPr tmpRPr = tmpR.getCTR().getRPr();
                        if (tmpRPr.isSetRFonts()) {
                            CTFonts tmpFonts = tmpRPr.getRFonts();
                            CTRPr cellRPr = cellR.getCTR().isSetRPr() ? cellR
                                    .getCTR().getRPr() : cellR.getCTR().addNewRPr();
                            CTFonts cellFonts = cellRPr.isSetRFonts() ? cellRPr
                                    .getRFonts() : cellRPr.addNewRFonts();
                            cellFonts.setAscii(tmpFonts.getAscii());
                            cellFonts.setAsciiTheme(tmpFonts.getAsciiTheme());
                            cellFonts.setCs(tmpFonts.getCs());
                            cellFonts.setCstheme(tmpFonts.getCstheme());
                            cellFonts.setEastAsia(tmpFonts.getEastAsia());
                            cellFonts.setEastAsiaTheme(tmpFonts.getEastAsiaTheme());
                            cellFonts.setHAnsi(tmpFonts.getHAnsi());
                            cellFonts.setHAnsiTheme(tmpFonts.getHAnsiTheme());
                        }
                    }
                }
    
            }
            // 复制段落信息
            cellP.setAlignment(tmpP.getAlignment());
            cellP.setVerticalAlignment(tmpP.getVerticalAlignment());
            cellP.setBorderBetween(tmpP.getBorderBetween());
            cellP.setBorderBottom(tmpP.getBorderBottom());
            cellP.setBorderLeft(tmpP.getBorderLeft());
            cellP.setBorderRight(tmpP.getBorderRight());
            cellP.setBorderTop(tmpP.getBorderTop());
            cellP.setPageBreak(tmpP.isPageBreak());
            if (tmpP.getCTP() != null) {
                if (tmpP.getCTP().getPPr() != null) {
                    CTPPr tmpPPr = tmpP.getCTP().getPPr();
                    CTPPr cellPPr = cellP.getCTP().getPPr() != null ? cellP
                            .getCTP().getPPr() : cellP.getCTP().addNewPPr();
                    // 复制段落间距信息
                    CTSpacing tmpSpacing = tmpPPr.getSpacing();
                    if (tmpSpacing != null) {
                        CTSpacing cellSpacing = cellPPr.getSpacing() != null ? cellPPr
                                .getSpacing() : cellPPr.addNewSpacing();
                        if (tmpSpacing.getAfter() != null) {
                            cellSpacing.setAfter(tmpSpacing.getAfter());
                        }
                        if (tmpSpacing.getAfterAutospacing() != null) {
                            cellSpacing.setAfterAutospacing(tmpSpacing
                                    .getAfterAutospacing());
                        }
                        if (tmpSpacing.getAfterLines() != null) {
                            cellSpacing.setAfterLines(tmpSpacing.getAfterLines());
                        }
                        if (tmpSpacing.getBefore() != null) {
                            cellSpacing.setBefore(tmpSpacing.getBefore());
                        }
                        if (tmpSpacing.getBeforeAutospacing() != null) {
                            cellSpacing.setBeforeAutospacing(tmpSpacing
                                    .getBeforeAutospacing());
                        }
                        if (tmpSpacing.getBeforeLines() != null) {
                            cellSpacing.setBeforeLines(tmpSpacing.getBeforeLines());
                        }
                        if (tmpSpacing.getLine() != null) {
                            cellSpacing.setLine(tmpSpacing.getLine());
                        }
                        if (tmpSpacing.getLineRule() != null) {
                            cellSpacing.setLineRule(tmpSpacing.getLineRule());
                        }
                    }
                    // 复制段落缩进信息
                    CTInd tmpInd = tmpPPr.getInd();
                    if (tmpInd != null) {
                        CTInd cellInd = cellPPr.getInd() != null ? cellPPr.getInd()
                                : cellPPr.addNewInd();
                        if (tmpInd.getFirstLine() != null) {
                            cellInd.setFirstLine(tmpInd.getFirstLine());
                        }
                        if (tmpInd.getFirstLineChars() != null) {
                            cellInd.setFirstLineChars(tmpInd.getFirstLineChars());
                        }
                        if (tmpInd.getHanging() != null) {
                            cellInd.setHanging(tmpInd.getHanging());
                        }
                        if (tmpInd.getHangingChars() != null) {
                            cellInd.setHangingChars(tmpInd.getHangingChars());
                        }
                        if (tmpInd.getLeft() != null) {
                            cellInd.setLeft(tmpInd.getLeft());
                        }
                        if (tmpInd.getLeftChars() != null) {
                            cellInd.setLeftChars(tmpInd.getLeftChars());
                        }
                        if (tmpInd.getRight() != null) {
                            cellInd.setRight(tmpInd.getRight());
                        }
                        if (tmpInd.getRightChars() != null) {
                            cellInd.setRightChars(tmpInd.getRightChars());
                        }
                    }
                }
            }
        }
    
    
    
        //添加不带图片的页眉  如果页眉不做图片处理  可以用此方法
        public void createHeader(XWPFDocument doc, String orgFullName) throws Exception {
            /*
             * 对页眉段落作处理
             * */
            CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
            XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc,sectPr);
            XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
    
            XWPFParagraph paragraph = header.getParagraphArray(0);
            paragraph.setBorderBottom(Borders.THICK);
    
    
            /*
             * 添加字体页眉,公司全称
             * */
            if (StringUtils.isNotEmpty(orgFullName)) {
                XWPFRun run = paragraph.createRun();
                run.setText(orgFullName);
                //setXWPFRunStyle(run,"新宋体",10);
            }
        }
    
    
        /**
         * 对页眉处理  页眉包含公司名称   二维码图片
         * @param doc
         * @param orgFullName   公司全称
         * @param logoFilePath   二维码图片的地址
         * @throws Exception
         */
        public void createHeader(XWPFDocument doc, String orgFullName, String logoFilePath) throws Exception {
            /*
             * 对页眉段落作处理,使二维码图片在页眉右边,公司全称在页眉左边
             * */
            CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr();
            XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc,    sectPr);
            XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
    
            XWPFParagraph paragraph = header.getParagraphArray(0);
            paragraph.setAlignment(ParagraphAlignment.BOTH);   //设置段落左对齐
            paragraph.setBorderBottom(Borders.THICK);    //设置下划线
    
    
    
    
            XWPFRun run = paragraph.createRun();
            setXWPFRunStyle(run,"新宋体",10);
    
    
            /*
             * 添加字体页眉,公司全称
             * 公司全称在右边
             * */
            if (StringUtils.isNotEmpty(orgFullName)) {
                run = paragraph.createRun();
                run.setText(orgFullName);
                setXWPFRunStyle(run,"新宋体",10);
            }
    
            //处理两个段落之间的制表符宽度
            run.addTab();
    
    
            CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab();
            tabStop.setVal(STTabJc.CENTER);
            int twipsPerInch =  1450;
            tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch));
    
            /*
             * 取到二维码的图片的字节流
             * */
            if (StringUtils.isNotEmpty(logoFilePath)) {
    
    
                File file=new File(logoFilePath);
                InputStream is = new FileInputStream(file);
    
                XWPFPicture picture = run.addPicture(is, XWPFDocument.PICTURE_TYPE_JPEG, logoFilePath, Units.toEMU(40), Units.toEMU(40));
    
                String blipID = "";
                for(XWPFPictureData picturedata : header.getAllPackagePictures()) {    //这段必须有,不然打开的logo图片不显示
                    blipID = header.getRelationId(picturedata);
                }
                picture.getCTPicture().getBlipFill().getBlip().setEmbed(blipID);
                run.addTab();
                is.close();
            }
    
        }
    
    
    
    
        /**
         * 设置页脚的字体样式
         *
         * @param r1 段落元素
         */
        private void setXWPFRunStyle(XWPFRun r1,String font,int fontSize) {
            r1.setFontSize(fontSize);
            CTRPr rpr = r1.getCTR().isSetRPr() ? r1.getCTR().getRPr() : r1.getCTR().addNewRPr();
            CTFonts fonts = rpr.isSetRFonts() ? rpr.getRFonts() : rpr.addNewRFonts();
            fonts.setAscii(font);
            fonts.setEastAsia(font);
            fonts.setHAnsi(font);
        }
    
    
        /**
         *  收尾方法
         * @param outDocPath
         * @return
         * @throws IOException
         */
        public boolean generate(String outDocPath) throws IOException{
            outputStream = new FileOutputStream(outDocPath);
            xwpfDocument.write(outputStream);
            this.close(outputStream);
            this.close(inputStream);
            return true;
        }
    
        /**
         *  关闭输入流
         * @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();
                }
            }
        }
    
    }
    
    

    四.测试类代码

    public static void main(String[] args) throws Exception {
    
        // 添加假数据 这里你也可以从数据库里获取数据
        List<Map<String, String>> list = new ArrayList<>();
        for (int i =0;i < 10; i++){
            Map<String,String> map = new HashMap<>();
            map.put("index", "2018"+i);
            map.put("fileName", "我是第一列数据"+i);
            map.put("creationDate", new SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date()));
            map.put("supervisionOpinions", "监理意见"+i);
            map.put("comment", "我是备注"+i);
            list.add(map);
        }
        Map<String,String> textMap=new HashMap<>();
        textMap.put("companyName", "测试替换文本的的公司名");
        textMap.put("folderName", "测试替换文本里的第二个埋点");
    
        // 模板文件输入输出地址
        String filePath = "c:/template/测试模板.docx";
        String outPath = "c:/template/生成的示例文档0629.docx";
    
        String orgFullName="测试替换页眉的公司名";
        String imgFile="C:/marvel/jam.jpg";
        WordReporter wordReporter = new WordReporter();
        wordReporter.setTempLocalPath(filePath);    //设置模板的路径
        wordReporter.init();            //初始化工具类
        wordReporter.export(list,orgFullName,imgFile,0,textMap);   //写入相关数据
        wordReporter.generate(outPath);   //导出到目标文档
    
    }```
    
    
    
    展开全文
  • 在项目需求中,需要对于一个word模板文档生成相对应的word文件,而此word模板是多页的并且需要在最终文件中生成相应的目录,由于项目环境是...然后主要是研究了Apache poi 进行word操作以及如何生成目录。 ...

    在项目需求中,需要对于一个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实现word、excel、ppt转html

    万次阅读 多人点赞 2019-07-31 18:39:43
    java实现在线预览- -之poi实现word、excel、ppt转html

    java实现在线预览

    - -之poi实现word、excel、ppt转html

    ###简介
    java实现在线预览功能是一个大家在工作中也许会遇到的需求,如果公司有钱,直接使用付费的第三方软件或者云在线预览服务就可以了,例如永中office、office web 365(http://www.officeweb365.com/)他们都有云在线预览服务,就是要钱0.0
    如果想要免费的,可以用openoffice,还需要借助其他的工具(例如swfTools、FlexPaper等)才行,可参考这篇文章http://blog.csdn.net/z69183787/article/details/17468039,写的挺细的,实现原理就是:
    1.通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件;
    2.通过swfTools将pdf文件转换成swf格式的文件;
    3.通过FlexPaper文档组件在页面上进行展示。
    当然如果装了Adobe Reader XI,那把pdf直接拖到浏览器页面就可以直接打开预览,这样就不需要步骤2、3了,前提就是客户装了Adobe Reader XI这个pdf阅读器。
    我这里介绍通过poi实现word、excel、ppt转html,这样就可以放在页面上了。

    ###word转html

    package wordToHtml;
    
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.util.List;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    import org.apache.commons.io.FileUtils;
    import org.apache.poi.hwpf.HWPFDocument;
    import org.apache.poi.hwpf.converter.PicturesManager;
    import org.apache.poi.hwpf.converter.WordToHtmlConverter;
    import org.apache.poi.hwpf.usermodel.Picture;
    import org.apache.poi.hwpf.usermodel.PictureType;
    import org.w3c.dom.Document;
    public class PoiWordToHtml {
     public static void main(String[] args) throws Throwable {
      final String path = "D:\\poi-test\\wordToHtml\\";
      final String file = "人员选择系分.doc";
      InputStream input = new FileInputStream(path + file);
      HWPFDocument wordDocument = new HWPFDocument(input);
      WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter(
        DocumentBuilderFactory.newInstance().newDocumentBuilder()
          .newDocument());
      wordToHtmlConverter.setPicturesManager(new PicturesManager() {
       public String savePicture(byte[] content, PictureType pictureType,
         String suggestedName, float widthInches, float heightInches) {
        return suggestedName;
       }
      });
      wordToHtmlConverter.processDocument(wordDocument);
      List pics = wordDocument.getPicturesTable().getAllPictures();
      if (pics != null) {
       for (int i = 0; i < pics.size(); i++) {
        Picture pic = (Picture) pics.get(i);
        try {
         pic.writeImageContent(new FileOutputStream(path
           + pic.suggestFullFileName()));
        } catch (FileNotFoundException e) {
         e.printStackTrace();
        }
       }
      }
      Document htmlDocument = wordToHtmlConverter.getDocument();
      ByteArrayOutputStream outStream = new ByteArrayOutputStream();
      DOMSource domSource = new DOMSource(htmlDocument);
      StreamResult streamResult = new StreamResult(outStream);
      TransformerFactory tf = TransformerFactory.newInstance();
      Transformer serializer = tf.newTransformer();
      serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
      serializer.setOutputProperty(OutputKeys.INDENT, "yes");
      serializer.setOutputProperty(OutputKeys.METHOD, "html");
      serializer.transform(domSource, streamResult);
      outStream.close();
      String content = new String(outStream.toByteArray());
      FileUtils.writeStringToFile(new File(path, "人员选择系分.html"), content, "utf-8");
     }
    }
    

    ###excel转html

    package excelToHtml;
    
    import java.io.ByteArrayOutputStream;
    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.List;
    
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.transform.OutputKeys;
    import javax.xml.transform.Transformer;
    import javax.xml.transform.TransformerFactory;
    import javax.xml.transform.dom.DOMSource;
    import javax.xml.transform.stream.StreamResult;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.poi.hssf.converter.ExcelToHtmlConverter;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hwpf.converter.PicturesManager;
    import org.apache.poi.hwpf.converter.WordToHtmlConverter;
    import org.apache.poi.hwpf.usermodel.Picture;
    import org.apache.poi.hwpf.usermodel.PictureType;
    import org.w3c.dom.Document;
    
    
    public class PoiExcelToHtml {
    	final static String path = "D:\\poi-test\\excelToHtml\\";
    	 final static String file = "exportExcel.xls";
     public static void main(String args[]) throws Exception {
    	 
    	 InputStream input=new FileInputStream(path+file);
    	 HSSFWorkbook excelBook=new HSSFWorkbook(input);
    	 ExcelToHtmlConverter excelToHtmlConverter = new ExcelToHtmlConverter (DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument() );
    	 excelToHtmlConverter.processWorkbook(excelBook);
    	 List pics = excelBook.getAllPictures();
         if (pics != null) {
             for (int i = 0; i < pics.size(); i++) {
                 Picture pic = (Picture) pics.get (i);
                 try {
                     pic.writeImageContent (new FileOutputStream (path + pic.suggestFullFileName() ) );
                 } catch (FileNotFoundException e) {
                     e.printStackTrace();
                 }
             }
         }
         Document htmlDocument =excelToHtmlConverter.getDocument();
         ByteArrayOutputStream outStream = new ByteArrayOutputStream();
         DOMSource domSource = new DOMSource (htmlDocument);
         StreamResult streamResult = new StreamResult (outStream);
         TransformerFactory tf = TransformerFactory.newInstance();
         Transformer serializer = tf.newTransformer();
         serializer.setOutputProperty (OutputKeys.ENCODING, "utf-8");
         serializer.setOutputProperty (OutputKeys.INDENT, "yes");
         serializer.setOutputProperty (OutputKeys.METHOD, "html");
         serializer.transform (domSource, streamResult);
         outStream.close();
    
         String content = new String (outStream.toByteArray() );
    
         FileUtils.writeStringToFile(new File (path, "exportExcel.html"), content, "utf-8");
     }
    }
    

    ###ppt转html
    其实只是ppt转图片,有了图片后放到页面上去,点击下一页就一张张显示就可以了。这里只介绍ppt转图片的过程。

    package pptToImg;
    
    import java.awt.Dimension;   
    import java.io.File;   
    import java.io.FileInputStream;   
    import java.io.FileNotFoundException;   
    import java.io.FileOutputStream;   
    import java.io.IOException;   
      
    import java.awt.Color;   
    import java.awt.Dimension;   
    import java.awt.Graphics2D;   
    import java.awt.geom.Rectangle2D;   
    import java.awt.image.BufferedImage;   
      
    import org.apache.poi.hslf.model.TextRun;   
    import org.apache.poi.hslf.record.Slide;   
    import org.apache.poi.hslf.usermodel.RichTextRun;   
    import org.apache.poi.hslf.usermodel.SlideShow;   
      
    public class PPTtoImage {   
        public static void main(String[] args) {   
            // 读入PPT文件   
            File file = new File("D:/poi-test/pptToImg/test.ppt");   
            doPPTtoImage(file);   
        }   
      
        public static boolean doPPTtoImage(File file) {   
            boolean isppt = checkFile(file);   
            if (!isppt) {   
                System.out.println("The image you specify don't exit!");   
                return false;   
            }   
            try {   
      
                FileInputStream is = new FileInputStream(file);   
                SlideShow ppt = new SlideShow(is);   
                is.close();   
                Dimension pgsize = ppt.getPageSize();   
                org.apache.poi.hslf.model.Slide[] slide = ppt.getSlides();   
                for (int i = 0; i < slide.length; i++) {   
                    System.out.print("第" + i + "页。");   
                       
                    TextRun[] truns = slide[i].getTextRuns();      
                    for ( int k=0;k<truns.length;k++){      
                       RichTextRun[] rtruns = truns[k].getRichTextRuns();      
                      for(int l=0;l<rtruns.length;l++){      
                           int index = rtruns[l].getFontIndex();      
                            String name = rtruns[l].getFontName();                
                            rtruns[l].setFontIndex(1);      
                            rtruns[l].setFontName("宋体");  
    //                        System.out.println(rtruns[l].getText());
                       }      
                    }      
                    BufferedImage img = new BufferedImage(pgsize.width,pgsize.height, BufferedImage.TYPE_INT_RGB);   
      
                    Graphics2D graphics = img.createGraphics();   
                    graphics.setPaint(Color.BLUE);   
                    graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height));   
                    slide[i].draw(graphics);   
      
                    // 这里设置图片的存放路径和图片的格式(jpeg,png,bmp等等),注意生成文件路径   
                    FileOutputStream out = new FileOutputStream("D:/poi-test/pptToImg/pict_"+ (i + 1) + ".jpeg");   
                    javax.imageio.ImageIO.write(img, "jpeg", out);   
                    out.close();   
      
                }   
                System.out.println("success!!");   
                return true;   
            } catch (FileNotFoundException e) {   
                System.out.println(e);   
                // System.out.println("Can't find the image!");   
            } catch (IOException e) {   
            }   
            return false;   
        }   
      
        // function 检查文件是否为PPT   
        public static boolean checkFile(File file) {   
      
            boolean isppt = false;   
            String filename = file.getName();   
            String suffixname = null;   
            if (filename != null && filename.indexOf(".") != -1) {   
                suffixname = filename.substring(filename.indexOf("."));   
                if (suffixname.equals(".ppt")) {   
                    isppt = true;   
                }   
                return isppt;   
            } else {   
                return isppt;   
            }   
        }   
      
    }  
    

    ppt转图片有个缺陷,就是ppt里不是宋体的字有些可能会变成框框。
    以上都需要引入poi的jar包。
    要实现在线预览,只需把转换得到的html在新标签页打开或者镶嵌到某块区域就可以展现了。

    展开全文
  • java使用poi操作word插入图片、段落、表格准备工作创建word模板.docx文件编写模板格式.xml文件java上手poimaven依赖使用到的包具体应用对应封装方法 ----------图片插入指定位置操作图片操作使用到的工具类对应封装...
  • POI操作Word需要的jar包 博文链接:https://lxzqz.iteye.com/blog/2428443
  • java 使用POI操作word获取样式

    千次阅读 2019-10-15 17:09:20
    XWPFDocument对象也就是我们所说的word文档对象,只有拥有此对象你才能操作wordpoi实际上是将word解析成一个xml然后在读取里面的内容,所以你在操作word之前必须对一些概念有一定的了解,否则也是寸步难行。...
  • JAVAPOI生成Word文档

    2017-10-24 14:52:46
    JAVA使用POI生成Word文档,并带下载功能。使用POI类包
  • java--poi 操作WORD和EXCLE

    2016-10-16 18:53:51
    java--poi 操作WORD和EXCLE
  • java POI 操作 WORD

    2011-10-20 11:19:43
    java 操作 word ,找了好久终于解决了比 jacob 效率高多了!功能上还有待进一步完善!
  • java操作wordPOI

    2018-05-28 16:13:23
    java操作wordPOI,java操作wordPOIjava操作wordPOIjava操作wordPOIjava操作wordPOIjava操作wordPOI
  • Java poi操作word及部分源码解析(笔记)

    千次阅读 2019-10-15 13:17:39
    Java poi操作word   前两天做项目写到了一点点关于Java POI操作word的相关内容,今天做一个小总结,poi功能很强大。 目录Java poi操作wordJava读取doc文档Java操作Docx Java读取doc文档   doc文档是office 97-03...
  • 主要介绍了Apache poiword doc文件进行读写操作的相关资料,需要的朋友可以参考下
  • java利用poi生成word

    2017-08-10 15:14:19
    java利用poi生成word,可直接导入,docx的模板文件也在里面,模板要放在D盘根目录呀
  • java poi操作word浅谈

    2016-07-23 20:56:24
    最近公司项目需要将页面信息导出word报告,这里简单介绍下java poi操作word的一些代码 1:制作word模板,读取模板后,替换标识符,继续写入信息 2:直接创建模板,写入信息 针对直接创建模板,列出代码实现...
  • java运用poi操作word,替换word中的占位符填充数据,并将多个word合并成一个word,附件是java代码和相关jar包,以及测试模板,需要注意是,只适用2007以上的word
  • java poi操作word转pdf

    千次阅读 热门讨论 2020-03-17 16:45:41
    替换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;...
  • 主要为大家详细介绍了Java使用poiword转换为html的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持。 使用说明:https://blog.csdn.net/u012775558/article/details/79678701
  • java使用poi操作.doc word模板替换,循环插入表格
  • java使用poiword转为html
  • 使用java poi进行模版文件的上传,生成表单,重新生成文件。同时包括表单中含有下拉框等选项的处理。
  • 本篇文章主要介绍了利用Java Apache POI 生成Word文档示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 用于java使用poi技术,读取word文档,和生成excel表格
  • 自动格式化Word文档格式程序使用Java为基础语言,使用开源组件poi对Office Word文档结构进行解析,对格式不正确的内容予以纠正,实现效果如下: 一、目前提供了三种方式方便大家使用 (一)客户端程序(需安装Java)...
  • Java使用poi读取word文档

    千次阅读 2017-07-31 19:21:25
    Java使用poi读取word文档
  • 使用java Apache poi 根据word模板生成word报表

    万次阅读 多人点赞 2018-03-24 16:19:37
    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行。 代码示例下载:...
  • Apache POI是一个开源的利用Java读写Excel、WORD等微软OLE2组件文档的项目。3.5以后加入了对采用OOXML格式的Office 2007支持,如xlsx、docx、pptx文档。  POI主页:poi.apache.org/ 二:POI下载地址:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,994
精华内容 4,797
关键字:

java通过poi操作word

java 订阅