精华内容
下载资源
问答
  • 近期写论文,大量使用Word,关于word 中如何添加图片和表格目录或链接的问题,在这里做一下记录,以便以后看。note: 1.很多是摘在网上的 2.当前Word是2007 3.不含目录的生成和文献的引用,希望能有时间在下面...

    近期写论文,大量使用Word,关于word 中如何添加图片和表格目录或链接的问题,在这里做一下记录,以便以后看。

    note:
    1.很多是摘在网上的
    2.当前Word是2007
    3.不含目录的生成和文献的引用,希望能有时间在下面记录目录的生成和文献的引用

    步骤
    1.在建立的图片上右键,选择“插入题注”,如图1
    这里写图片描述
    2.当出现图2后,如果你想插入图 1-1,那么标签上需要“图 1-”,但是标签上没有图”1-“的字样,那么选择“新建标签”
    这里写图片描述
    3.“新建标签”如图3所示,然后“确定”
    这里写图片描述
    4.”标签“选择要的,题注那栏会自动的增加编号,后面填上图的名字,选择上方还是下方。
    这里写图片描述
    5.”确定“,图片操作完成,
    6.你可能需要在文中引用图,如图5所示
    这里写图片描述
    7.“插入”-》“交叉引用”->”确定”
    这里写图片描述
    8.插入目录,在合适的地方生成目录:‘引用’–>‘插入表目录’,选择要生成目录的标签Figure(或Table)根据需要,勾选显示页面,页码右对齐等
    这里写图片描述
    9.ok

    展开全文
  • //操作word中的表格 for (int i = 0; i (); i++) { //只处理行数大于等于2的表格,且不循环表头 XWPFTable table = tables.get(i); //第二个表格使用daList,插入数据 //TODO if (null != list01 && 0 () && i == 0...


    在这里插入图片描述



    核心依赖

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.9</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.7</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>3.9</version>
            </dependency>
    

    动态表格

    测试类

    package com.uncle.demo.poi;
    
    
    import java.io.FileOutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import static java.lang.System.out;
    
    /**
     * @program demo01
     * @description 测试工具类
     * @author: Sun Jinxin
     * @create: 2021/11/30 14:50
     */
    public class Test {
    
        public static void main(String[] args){
            //需要进行文本替换的信息
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("name", "维维豆奶粉");
    
            //需要进行动态生成的信息
            Map<String,Object> mapList = new HashMap<String, Object>();
    
            //第一个动态生成的数据列表
            List<String[]> list01 = new ArrayList<String[]>();
            list01.add(new String[]{"1","维修服务","1","6100333","2020/8/4","1、更换鼠标 \n" + "2、更换头托垫\n","设备运行正常","1.鼠标"});
            list01.add(new String[]{"2","售后服务","2","6107986","2020/10/28","相关校正","设备运行正常","1.鼠标\n" + "2.头托垫\n"});
            list01.add(new String[]{"3","售后服务","2","6100922","2020/11/15","1、更换鼠标 \n" + "2、更换头托垫\n","设备运行正常","1.鼠标"});
            list01.add(new String[]{"4","回退服务","3","6100922","2020/11/15","1、更换鼠标 \n" + "2、更换头托垫\n","设备运行正常","1.鼠标"});
            list01.add(new String[]{"5","回退服务","3","6100922","2020/11/15","1、更换鼠标 \n" + "2、更换头托垫\n","设备运行正常","1.鼠标"});
            list01.add(new String[]{"6","回退服务","3","6100922","2020/11/15","1、更换鼠标 \n" + "2、更换头托垫\n","设备运行正常","1.鼠标"});
    
            mapList.put("list01", list01);
    
            CustomXWPFDocument doc = WorderToNewWordUtils.changWord("C:\\Users\\sunjinxin\\Downloads\\project-office-temp-tool\\project-office-temp-tool\\demo01\\src\\main\\resources\\templates\\test1.docx",data,mapList);
            try (FileOutputStream fopts = new FileOutputStream("D:/呵呵.docx")) {
    
                doc.write(fopts);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            out.println("成功!!!");
        }
    }
    
    

    工具类

    package com.uncle.demo.poi;
    
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    
    import org.apache.poi.POIXMLDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    import org.apache.poi.xwpf.usermodel.XWPFTable;
    import org.apache.poi.xwpf.usermodel.XWPFTableCell;
    import org.apache.poi.xwpf.usermodel.XWPFTableRow;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
    
    /**
     * @program demo01
     * @description 核心工具类
     * @author: Sun Jinxin
     * @create: 2021/11/30 14:50
     */
    public class WorderToNewWordUtils {
        /**
         * 根据模板生成word文档
         *
         * @param inputUrl 模板路径
         * @param textMap  需要替换的文本内容
         * @param mapList  需要动态生成的内容
         * @return
         */
        public static CustomXWPFDocument changWord(String inputUrl, Map<String, Object> textMap, Map<String, Object> mapList) {
            CustomXWPFDocument document = null;
            try {
                //获取docx解析对象
                document = new CustomXWPFDocument(POIXMLDocument.openPackage(inputUrl));
    
                //解析替换文本段落对象
                WorderToNewWordUtils.changeText(document, textMap);
    
                //解析替换表格对象
                WorderToNewWordUtils.changeTable(document, textMap, mapList);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return document;
        }
    
        /**
         * 替换段落文本
         *
         * @param document docx解析对象
         * @param textMap  需要替换的信息集合
         */
        public static void changeText(CustomXWPFDocument document, Map<String, Object> textMap) {
            //获取段落集合
            List<XWPFParagraph> paragraphs = document.getParagraphs();
    
            for (XWPFParagraph paragraph : paragraphs) {
    
                //判断此段落时候需要进行替换
                String text = paragraph.getText();
                System.out.println(text);
                if (checkText(text)) {
                    List<XWPFRun> runs = paragraph.getRuns();
                    for (XWPFRun run : runs) {
                        run.setFontSize(8);
                        //替换模板原来位置
                        Object ob = changeValue(run.toString(), textMap);
                        if (ob instanceof String) {
                            run.setText((String) ob, 0);
                        }
                    }
                }
            }
        }
    
        /**
         * 替换表格对象方法
         *
         * @param document docx解析对象
         * @param textMap  需要替换的信息集合
         * @param mapList  需要动态生成的内容
         */
        public static void changeTable(CustomXWPFDocument document, Map<String, Object> textMap, Map<String, Object> mapList) {
            //获取表格对象集合
            List<XWPFTable> tables = document.getTables();
    
            //循环所有需要进行替换的文本,进行替换
            for (int i = 0; i < tables.size(); i++) {
                XWPFTable table = tables.get(i);
                if (checkText(table.getText())) {
                    List<XWPFTableRow> rows = table.getRows();
                    //遍历表格,并替换模板
                    eachTable(document, rows, textMap);
                }
            }
    
            List<String[]> list01 = (List<String[]>) mapList.get("list01");
            //操作word中的表格
            for (int i = 0; i < tables.size(); i++) {
                //只处理行数大于等于2的表格,且不循环表头
                XWPFTable table = tables.get(i);
                //第二个表格使用daList,插入数据
                //TODO
                if (null != list01 && 0 < list01.size() && i == 0) {
                    //TODO 处理第几个表格
                    insertTable(table, null, list01, 2);
    
                    int initFlag = 1;
                    int mergeRowNum = initFlag;
                    //获取第一条数据
                    String s1 = list01.get(0)[1];
                    for (int j = 0; j < list01.size(); j++) {
    
                        String s2 = list01.get(j)[1];
                        if (s1.equals(s2)) {
                            mergeRowNum++;
                            s1 = s2;
                        } else {
                            s1 = s2;
                            mergeCellVertically(table, 1, initFlag + 1, mergeRowNum);
                            mergeCellVertically(table, 2, initFlag + 1, mergeRowNum);
                            initFlag = mergeRowNum;
                            mergeRowNum = initFlag + 1;
                        }
                        if (j == list01.size() - 1) {
                            mergeCellVertically(table, 1, initFlag + 1, mergeRowNum);
                            mergeCellVertically(table, 2, initFlag + 1, mergeRowNum);
                        }
    
    
                    }
    
                }
            }
    
        }
    
    
        /**
         * 遍历表格
         *
         * @param rows    表格行对象
         * @param textMap 需要替换的信息集合
         */
        public static void eachTable(CustomXWPFDocument document, List<XWPFTableRow> rows, Map<String, Object> textMap) {
            for (XWPFTableRow row : rows) {
                List<XWPFTableCell> cells = row.getTableCells();
                for (XWPFTableCell cell : cells) {
                    //判断单元格是否需要替换
                    if (checkText(cell.getText())) {
                        List<XWPFParagraph> paragraphs = cell.getParagraphs();
                        for (XWPFParagraph paragraph : paragraphs) {
                            List<XWPFRun> runs = paragraph.getRuns();
                            for (XWPFRun run : runs) {
    
                                Object ob = changeValue(run.toString(), textMap);
                                if (ob instanceof String) {
                                    run.setText((String) ob, 0);
                                } else if (ob instanceof Map) {
    
                                    run.setText("", 0);
                                    Map pic = (Map) ob;
                                    int width = Integer.parseInt(pic.get("width").toString());
                                    int height = Integer.parseInt(pic.get("height").toString());
                                    int picType = getPictureType(pic.get("type").toString());
                                    byte[] byteArray = (byte[]) pic.get("content");
                                    ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);
                                    try {
                                        int ind = document.addPicture(byteInputStream, picType);
                                        document.createPicture(ind, width, height, paragraph);
                                    } catch (Exception e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    
        /**
         * 为表格插入数据,行数不够添加新行
         *
         * @param table     需要插入数据的表格
         * @param tableList 第四个表格的插入数据
         * @param daList    第二个表格的插入数据
         * @param type      表格类型:1-第一个表格 2-第二个表格 3-第三个表格 4-第四个表格
         */
        public static void insertTable(XWPFTable table, List<String> tableList, List<String[]> daList, Integer type) {
            if (2 == type) {
                //创建行和创建需要的列
                for (int i = 0; i < daList.size(); i++) {
                    //添加一个新行
                    XWPFTableRow row = table.insertNewTableRow(i+2);
    
                    for (int j = 0; j < daList.get(0).length; j++) {
                        row.createCell();//添加第一个列
    
                    }
    
                }
    
                //创建行,根据需要插入的数据添加新行,不处理表头
                for (int i = 0; i < daList.size(); i++) {
                    List<XWPFTableCell> cells = table.getRow(i + 2).getTableCells();
    
                    for (int j = 0; j < cells.size(); j++) {
                        XWPFTableCell cell02 = cells.get(j);
    
                        cell02.setText(daList.get(i)[j]);
                    }
                }
            } else if (4 == type) {
                //插入表头下面第一行的数据
                for (int i = 0; i < tableList.size(); i++) {
                    XWPFTableRow row = table.createRow();
                    List<XWPFTableCell> cells = row.getTableCells();
                    cells.get(0).setText(tableList.get(i));
                }
            }
        }
    
        /**
         * 判断文本中时候包含$
         *
         * @param text 文本
         * @return 包含返回true, 不包含返回false
         */
        public static boolean checkText(String text) {
            boolean check = false;
            if (text.indexOf("$") != -1) {
                check = true;
            }
            return check;
        }
    
        /**
         * 匹配传入信息集合与模板
         *
         * @param value   模板需要替换的区域
         * @param textMap 传入信息集合
         * @return 模板需要替换区域信息集合对应值
         */
        public static Object changeValue(String value, Map<String, Object> textMap) {
            Set<Entry<String, Object>> textSets = textMap.entrySet();
            Object valu = "";
            for (Entry<String, Object> textSet : textSets) {
                //匹配模板与替换值 格式${key}
                String key = textSet.getKey();
                if (value.indexOf(key) != -1) {
                    valu = textSet.getValue();
                }
            }
            return valu;
        }
    
        /**
         * 将输入流中的数据写入字节数组
         *
         * @param in
         * @return
         */
        public static byte[] inputStream2ByteArray(InputStream in, boolean isClose) {
            byte[] byteArray = null;
            try {
                int total = in.available();
                byteArray = new byte[total];
                in.read(byteArray);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (isClose) {
                    try {
                        in.close();
                    } catch (Exception e2) {
                        System.out.println("关闭流失败");
                    }
                }
            }
            return byteArray;
        }
    
        /**
         * 根据图片类型,取得对应的图片类型代码
         *
         * @param picType
         * @return int
         */
        private static int getPictureType(String picType) {
            int res = CustomXWPFDocument.PICTURE_TYPE_PICT;
            if (picType != null) {
                if (picType.equalsIgnoreCase("png")) {
                    res = CustomXWPFDocument.PICTURE_TYPE_PNG;
                } else if (picType.equalsIgnoreCase("dib")) {
                    res = CustomXWPFDocument.PICTURE_TYPE_DIB;
                } else if (picType.equalsIgnoreCase("emf")) {
                    res = CustomXWPFDocument.PICTURE_TYPE_EMF;
                } else if (picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")) {
                    res = CustomXWPFDocument.PICTURE_TYPE_JPEG;
                } else if (picType.equalsIgnoreCase("wmf")) {
                    res = CustomXWPFDocument.PICTURE_TYPE_WMF;
                }
            }
            return res;
        }
    
        /**
         * 合并行
         *
         * @param table
         * @param col     需要合并的列
         * @param fromRow 开始行
         * @param toRow   结束行
         */
        public static void mergeCellVertically(XWPFTable table, int col, int fromRow, int toRow) {
            for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
                CTVMerge vmerge = CTVMerge.Factory.newInstance();
                if (rowIndex == fromRow) {
                    vmerge.setVal(STMerge.RESTART);
                } else {
                    vmerge.setVal(STMerge.CONTINUE);
                }
                XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
                CTTcPr tcPr = cell.getCTTc().getTcPr();
                if (tcPr != null) {
                    tcPr.setVMerge(vmerge);
                } else {
                    tcPr = CTTcPr.Factory.newInstance();
                    tcPr.setVMerge(vmerge);
                    cell.getCTTc().setTcPr(tcPr);
                }
            }
        }
    
        //列合并  ,有点问题,用不了
        public static void mergeCellHorizontally(XWPFTable table, int row, int fromCol, int toCol) {
            for (int colIndex = fromCol; colIndex <= toCol; colIndex++) {
                CTHMerge hmerge = CTHMerge.Factory.newInstance();
                if (colIndex == fromCol) {
                    hmerge.setVal(STMerge.RESTART);
                } else {
                    hmerge.setVal(STMerge.CONTINUE);
                }
                XWPFTableCell cell = table.getRow(row).getCell(colIndex);
                CTTcPr tcPr = cell.getCTTc().getTcPr();
                if (tcPr != null) {
                    tcPr.setHMerge(hmerge);
                } else {
                    tcPr = CTTcPr.Factory.newInstance();
                    tcPr.setHMerge(hmerge);
                    cell.getCTTc().setTcPr(tcPr);
                }
            }
        }
    
        /**
         * 获取需要合并单元格的下标
         *
         * @return
         */
        public static List<Integer[]> startEnd(List<String[]> daList) {
            List<Integer[]> indexList = new ArrayList<Integer[]>();
    
            List<String> list = new ArrayList<String>();
            for (int i = 0; i < daList.size(); i++) {
                list.add(daList.get(i)[0]);
            }
            Map<Object, Integer> tm = new HashMap<Object, Integer>();
            for (int i = 0; i < daList.size(); i++) {
                if (!tm.containsKey(daList.get(i)[0])) {
                    tm.put(daList.get(i)[0], 1);
                } else {
                    int count = tm.get(daList.get(i)[0]) + 1;
                    tm.put(daList.get(i)[0], count);
                }
            }
            for (Map.Entry<Object, Integer> entry : tm.entrySet()) {
                String key = entry.getKey().toString();
                String value = entry.getValue().toString();
                if (list.indexOf(key) != (-1)) {
                    Integer[] index = new Integer[2];
                    index[0] = list.indexOf(key);
                    index[1] = list.lastIndexOf(key);
                    indexList.add(index);
                }
            }
            return indexList;
        }
    }
    
    package com.uncle.demo.poi;
    
    
    import java.io.IOException;
    import java.io.InputStream;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.xmlbeans.XmlException;
    import org.apache.xmlbeans.XmlToken;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
    import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
    import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;
    
    
    /**
     * @program demo01
     * @description 自定义 XWPFDocument,并重写 createPicture()方法
     * @author: Sun Jinxin
     * @create: 2021/11/30 14:50
     */
    public class CustomXWPFDocument extends XWPFDocument {
        public CustomXWPFDocument(InputStream in) throws IOException {
            super(in);
        }
    
        public CustomXWPFDocument() {
            super();
        }
    
        public CustomXWPFDocument(OPCPackage pkg) throws IOException {
            super(pkg);
        }
    
        /**
         * @param id
         * @param width 宽
         * @param height 高
         * @param paragraph  段落
         */
        public void createPicture(int id, int width, int height,XWPFParagraph paragraph) {
            final int EMU = 9525;
            width *= EMU;
            height *= EMU;
            String blipId = getAllPictures().get(id).getPackageRelationship().getId();
            CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
    
            System.out.println(blipId+":"+inline);
    
            String picXml = ""
                    + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
                    + "   <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
                    + "      <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
                    + "         <pic:nvPicPr>" + "            <pic:cNvPr id=\""
                    + id
                    + "\" name=\"Generated\"/>"
                    + "            <pic:cNvPicPr/>"
                    + "         </pic:nvPicPr>"
                    + "         <pic:blipFill>"
                    + "            <a:blip r:embed=\""
                    + blipId
                    + "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
                    + "            <a:stretch>"
                    + "               <a:fillRect/>"
                    + "            </a:stretch>"
                    + "         </pic:blipFill>"
                    + "         <pic:spPr>"
                    + "            <a:xfrm>"
                    + "               <a:off x=\"0\" y=\"0\"/>"
                    + "               <a:ext cx=\""
                    + width
                    + "\" cy=\""
                    + height
                    + "\"/>"
                    + "            </a:xfrm>"
                    + "            <a:prstGeom prst=\"rect\">"
                    + "               <a:avLst/>"
                    + "            </a:prstGeom>"
                    + "         </pic:spPr>"
                    + "      </pic:pic>"
                    + "   </a:graphicData>" + "</a:graphic>";
    
            inline.addNewGraphic().addNewGraphicData();
            XmlToken xmlToken = null;
            try {
                xmlToken = XmlToken.Factory.parse(picXml);
            } catch (XmlException xe) {
                xe.printStackTrace();
            }
            inline.set(xmlToken);
    
            inline.setDistT(0);
            inline.setDistB(0);
            inline.setDistL(0);
            inline.setDistR(0);
    
            CTPositiveSize2D extent = inline.addNewExtent();
            extent.setCx(width);
            extent.setCy(height);
    
            CTNonVisualDrawingProps docPr = inline.addNewDocPr();
            docPr.setId(id);
            docPr.setName("图片" + id);
            docPr.setDescr("测试");
        }
    }
    

    动态数据

    测试类

    package com.hidata.tool;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class Test {
    
        public static void main(String[] args) throws IOException {
    
            // 存储报表全部数据
            Map<String, Object> wordDataMap = new HashMap<String, Object>();
            // 存储报表中不循环的数据
            Map<String, Object> parametersMap = new HashMap<String, Object>();
    
            
            List<Map<String, Object>> table1 = new ArrayList<Map<String, Object>>();
    
            Map<String, Object> map1=new HashMap();
            map1.put("name", "张三");
            map1.put("age", "23");
            map1.put("email", "12121@qq.com");
    
            Map<String, Object> map2=new HashMap();
            map2.put("name", "李四");
            map2.put("age", "45");
            map2.put("email", "45445@qq.com");
    
            Map<String, Object> map3=new HashMap();
            map3.put("name", "Tom");
            map3.put("age", "34");
            map3.put("email", "6767@qq.com");
    
            table1.add(map1);
            table1.add(map2);
            table1.add(map3);
    
    
    
    
            List<Map<String, Object>> table2 = new ArrayList<Map<String, Object>>();
            Map<String, Object> map4=new HashMap();
            map4.put("name", "tom");
            map4.put("number", "sd1234");
            map4.put("address", "上海");
    
            Map<String, Object> map5=new HashMap();
            map5.put("name", "seven");
            map5.put("number", "sd15678");
            map5.put("address", "北京");
    
            Map<String, Object> map6=new HashMap();
            map6.put("name", "lisa");
            map6.put("number", "sd9078");
            map6.put("address", "广州");
    
            table2.add(map4);
            table2.add(map5);
            table2.add(map6);
    
    
    
            parametersMap.put("userName", "JUVENILESS");
            parametersMap.put("time", "2018-03-24");
            parametersMap.put("sum", "3");
    
    
            wordDataMap.put("table1", table1);
            wordDataMap.put("table2", table2);
            wordDataMap.put("parametersMap", parametersMap);
            //改成你本地文件所在目录
            File file = new File("C:\\Users\\sunjinxin\\Desktop\\time.docx");
    
    
    
            // 读取word模板
            FileInputStream fileInputStream = new FileInputStream(file);
    
    
            WordTemplate template = new WordTemplate(fileInputStream);
    
            // 替换数据
            template.replaceDocument(wordDataMap);
    
    
            //生成文件
            //改成你本地文件所在目录
            File outputFile=new File("C:\\Users\\sunjinxin\\Desktop\\输出.docx");
            FileOutputStream fos  = new FileOutputStream(outputFile);
            template.getDocument().write(fos);
    
        }
    
    }
    
    

    工具类

    /**
     * @Title: WordTemplate2.java
     * @Package: com.highdata.templateTools
     * @Description: TODO
     * @author: Juveniless
     * @date: 2017年11月27日 下午3:23:13
     */
    package com.hidata.tool;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import org.apache.poi.xwpf.usermodel.BodyElementType;
    import org.apache.poi.xwpf.usermodel.IBodyElement;
    import org.apache.poi.xwpf.usermodel.PositionInParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.apache.poi.xwpf.usermodel.XWPFParagraph;
    import org.apache.poi.xwpf.usermodel.XWPFRun;
    import org.apache.poi.xwpf.usermodel.XWPFTable;
    import org.apache.poi.xwpf.usermodel.XWPFTableCell;
    import org.apache.poi.xwpf.usermodel.XWPFTableRow;
    
    /**
     *
     * 对docx文件中的文本及表格中的内容进行替换 --模板仅支持对 {key} 标签的替换
     *
     * @ClassName: WordTemplate
     * @Description: TODO(!!!使用word2013 docx文件)
     * @author Juveniless
     * @date: 2017年11月27日 下午3:25:56
     * <br>(1)word模板注意页边距的问题,存在问题:比如页边距默认为3cm,画表格时,仍然可以通过
     * 拖拽,把表格边框拖动到看起来就像页边距只有1cm的样子,但是实际上此时页边距还是3cm,生成的
     * word报表的页边距还是会按照3cm来生成。解决办法,在word文件里,设置好页边距,如果需要表格
     * 两边页边距很窄,需要在word里设置页边距窄一点,而不是直接拖动表格边框来实现。
     *
     */
    
    public class WordTemplate {
    
        private XWPFDocument document;
    
        public XWPFDocument getDocument() {
            return document;
        }
    
        public void setDocument(XWPFDocument document) {
            this.document = document;
        }
    
        /**
         * 初始化模板内容
         *
         * @author Juveniless
         * @date 2017年11月27日 下午3:59:22
         * @param inputStream
         *            模板的读取流(docx文件)
         * @throws IOException
         *
         */
        public WordTemplate(InputStream inputStream) throws IOException {
            document = new XWPFDocument(inputStream);
        }
    
        /**
         * 将处理后的内容写入到输出流中
         *
         * @param outputStream
         * @throws IOException
         */
        public void write(OutputStream outputStream) throws IOException {
            document.write(outputStream);
        }
    
    
    
    
    
        /**
         * 根据dataMap对word文件中的标签进行替换; <br><br>
         * !!!!***需要注意dataMap的数据格式***!!!! <br><br>
         * 对于需要替换的普通标签数据标签(不需要循环)-----必须在dataMap中存储一个key为parametersMap的map,
         * 来存储这些不需要循环生成的数据,比如:表头信息,日期,制表人等。 <br><br>
         * 对于需要循环生成的表格数据------key自定义,value为 --ArrayList&lt;Map&lt;String, String>>
         * @author Juveniless
         * @date 2017年11月27日 下午3:29:27
         * @param dataMap
         *
         */
        public void replaceDocument(Map<String, Object> dataMap) {
    
            if (!dataMap.containsKey("parametersMap")) {
                System.out.println("数据源错误--数据源(parametersMap)缺失");
                return;
            }
            @SuppressWarnings("unchecked")
            Map<String, Object> parametersMap = (Map<String, Object>) dataMap
                    .get("parametersMap");
    
            List<IBodyElement> bodyElements = document.getBodyElements();// 所有对象(段落+表格)
            int templateBodySize = bodyElements.size();// 标记模板文件(段落+表格)总个数
    
            int curT = 0;// 当前操作表格对象的索引
            int curP = 0;// 当前操作段落对象的索引
            for (int a = 0; a < templateBodySize; a++) {
                IBodyElement body = bodyElements.get(a);
                if (BodyElementType.TABLE.equals(body.getElementType())) {// 处理表格
                    XWPFTable table = body.getBody().getTableArray(curT);
    
                    List<XWPFTable> tables = body.getBody().getTables();
                    table = tables.get(curT);
                    if (table != null) {
    
                        // 处理表格
                        List<XWPFTableCell> tableCells = table.getRows().get(0).getTableCells();
                        // 获取到模板表格第一行,用来判断表格类型
                        String tableText = table.getText();
                        // 表格中的所有文本
    
                        if (tableText.indexOf("##{foreach") > -1) {
                            // 查找到##{foreach标签,该表格需要处理循环
                            if (tableCells.size() != 2
                                    || tableCells.get(0).getText().indexOf("##{foreach") < 0
                                    || tableCells.get(0).getText().trim().length() == 0) {
                                System.out.println("文档中第"
                                                + (curT + 1)
                                                + "个表格模板错误,模板表格第一行需要设置2个单元格,"
                                                + "第一个单元格存储表格类型(##{foreachTable}## 或者 ##{foreachTableRow}##),第二个单元格定义数据源。");
                                return;
                            }
    
                            String tableType = tableCells.get(0).getText();
                            String dataSource = tableCells.get(1).getText();
                            System.out.println("读取到数据源:"+dataSource);
                            if (!dataMap.containsKey(dataSource)) {
                                System.out.println("文档中第" + (curT + 1) + "个表格模板数据源缺失");
                                return;
                            }
                            @SuppressWarnings("unchecked")
                            List<Map<String, Object>> tableDataList = (List<Map<String, Object>>) dataMap
                                    .get(dataSource);
                            if ("##{foreachTable}##".equals(tableType)) {
                                // System.out.println("循环生成表格");
                                addTableInDocFooter(table, tableDataList, parametersMap, 1);
    
                            } else if ("##{foreachTableRow}##".equals(tableType)) {
                                // System.out.println("循环生成表格内部的行");
                                addTableInDocFooter(table, tableDataList, parametersMap, 2);
                            }
    
                        } else if (tableText.indexOf("{") > -1) {
                            // 没有查找到##{foreach标签,查找到了普通替换数据的{}标签,该表格只需要简单替换
                            addTableInDocFooter(table, null, parametersMap, 3);
                        } else {
                            // 没有查找到任何标签,该表格是一个静态表格,仅需要复制一个即可。
                            addTableInDocFooter(table, null, null, 0);
                        }
                        curT++;
    
                    }
                } else if (BodyElementType.PARAGRAPH.equals(body.getElementType())) {// 处理段落
                    // System.out.println("获取到段落");
                    XWPFParagraph ph = body.getBody().getParagraphArray(curP);
                    if (ph != null) {
                        // htmlText = htmlText+readParagraphX(ph);
                        addParagraphInDocFooter(ph, null, parametersMap, 0);
    
                        curP++;
                    }
                }
    
            }
            // 处理完毕模板,删除文本中的模板内容
            for (int a = 0; a < templateBodySize; a++) {
                document.removeBodyElement(0);
            }
    
        }
    
    
    
    
    
    
    
    
        /**
         * 根据 模板表格 和 数据list 在word文档末尾生成表格
         * @author Juveniless
         * @date 2017年12月6日 上午10:12:05
         * @param templateTable 模板表格
         * @param list   循环数据集
         * @param parametersMap  不循环数据集
         * @param flag   (0为静态表格,1为表格整体循环,2为表格内部行循环,3为表格不循环仅简单替换标签即可)
         *
         */
        public void addTableInDocFooter(XWPFTable templateTable, List<Map<String, Object>> list,
                                        Map<String, Object> parametersMap, int flag) {
    
            if (flag == 1) {// 表格整体循环
                for (Map<String, Object> map : list) {
                    List<XWPFTableRow> templateTableRows = templateTable.getRows();// 获取模板表格所有行
                    XWPFTable newCreateTable = document.createTable();// 创建新表格,默认一行一列
                    for (int i = 1; i < templateTableRows.size(); i++) {
                        XWPFTableRow newCreateRow = newCreateTable.createRow();
                        CopyTableRow(newCreateRow, templateTableRows.get(i));// 复制模板行文本和样式到新行
                    }
                    newCreateTable.removeRow(0);// 移除多出来的第一行
                    document.createParagraph();// 添加回车换行
                    replaceTable(newCreateTable, map);//替换标签
                }
    
            } else if (flag == 2) {// 表格表格内部行循环
                XWPFTable newCreateTable = document.createTable();
                // 创建新表格,默认一行一列
                List<XWPFTableRow> TempTableRows = templateTable.getRows();
                // 获取模板表格所有行
                int tagRowsIndex = 0;// 标签行indexs
                for (int i = 0, size = TempTableRows.size(); i < size; i++) {
                    String rowText = TempTableRows.get(i).getCell(0).getText();
                    // 获取到表格行的第一个单元格
                    if (rowText.indexOf("##{foreachRows}##") > -1) {
                        tagRowsIndex = i;
                        break;
                    }
                }
    
                /* 复制模板行和标签行之前的行 */
                for (int i = 1; i < tagRowsIndex; i++) {
                    XWPFTableRow newCreateRow = newCreateTable.createRow();
                    CopyTableRow(newCreateRow, TempTableRows.get(i));
                    // 复制行
                    replaceTableRow(newCreateRow, parametersMap);
                    // 处理不循环标签的替换
                }
    
                /* 循环生成模板行 */
                XWPFTableRow tempRow = TempTableRows.get(tagRowsIndex + 1);
                // 获取到模板行
                for (int i = 0; i < list.size(); i++) {
                    XWPFTableRow newCreateRow = newCreateTable.createRow();
                    CopyTableRow(newCreateRow, tempRow);
                    // 复制模板行
                    replaceTableRow(newCreateRow, list.get(i));
                    // 处理标签替换
                }
    
                /* 复制模板行和标签行之后的行 */
                for (int i = tagRowsIndex + 2; i < TempTableRows.size(); i++) {
                    XWPFTableRow newCreateRow = newCreateTable.createRow();
                    CopyTableRow(newCreateRow, TempTableRows.get(i));
                    // 复制行
                    replaceTableRow(newCreateRow, parametersMap);
                    // 处理不循环标签的替换
                }
                newCreateTable.removeRow(0);
                // 移除多出来的第一行
                document.createParagraph();
                // 添加回车换行
    
            } else if (flag == 3) {
                //表格不循环仅简单替换标签
                List<XWPFTableRow> templateTableRows = templateTable.getRows();
                // 获取模板表格所有行
                XWPFTable newCreateTable = document.createTable();
                // 创建新表格,默认一行一列
                for (int i = 0; i < templateTableRows.size(); i++) {
                    XWPFTableRow newCreateRow = newCreateTable.createRow();
                    CopyTableRow(newCreateRow, templateTableRows.get(i));
                    // 复制模板行文本和样式到新行
                }
                newCreateTable.removeRow(0);
                // 移除多出来的第一行
                document.createParagraph();
                // 添加回车换行
                replaceTable(newCreateTable, parametersMap);
    
            } else if (flag == 0) {
                List<XWPFTableRow> templateTableRows = templateTable.getRows();
                // 获取模板表格所有行
                XWPFTable newCreateTable = document.createTable();
                // 创建新表格,默认一行一列
                for (int i = 0; i < templateTableRows.size(); i++) {
                    XWPFTableRow newCreateRow = newCreateTable.createRow();
                    CopyTableRow(newCreateRow, templateTableRows.get(i));
                    // 复制模板行文本和样式到新行
                }
                newCreateTable.removeRow(0);
                // 移除多出来的第一行
                document.createParagraph();
                // 添加回车换行
            }
    
        }
    
    
    
    
    
    
        /**
         * 根据 模板段落 和 数据 在文档末尾生成段落
         *
         * @author Juveniless
         * @date 2017年11月27日 上午11:49:42
         * @param templateParagraph
         *            模板段落
         * @param list
         *            循环数据集
         * @param parametersMap
         *            不循环数据集
         * @param flag
         *            (0为不循环替换,1为循环替换)
         *
         */
        public void addParagraphInDocFooter(XWPFParagraph templateParagraph,
                                            List<Map<String, String>> list, Map<String, Object> parametersMap, int flag) {
    
            if (flag == 0) {
                XWPFParagraph createParagraph = document.createParagraph();
                // 设置段落样式
                createParagraph.getCTP().setPPr(templateParagraph.getCTP().getPPr());
                // 移除原始内容
                for (int pos = 0; pos < createParagraph.getRuns().size(); pos++) {
                    createParagraph.removeRun(pos);
                }
                // 添加Run标签
                for (XWPFRun s : templateParagraph.getRuns()) {
                    XWPFRun targetrun = createParagraph.createRun();
                    CopyRun(targetrun, s);
                }
    
                replaceParagraph(createParagraph, parametersMap);
    
            } else if (flag == 1) {
                // 暂无实现
            }
    
        }
    
    
    
    
        /**
         * 根据map替换段落元素内的{**}标签
         * @author Juveniless
         * @date 2017年12月4日 下午3:09:00
         * @param xWPFParagraph
         * @param parametersMap
         *
         */
        public void replaceParagraph(XWPFParagraph xWPFParagraph, Map<String, Object> parametersMap) {
            List<XWPFRun> runs = xWPFParagraph.getRuns();
            String xWPFParagraphText = xWPFParagraph.getText();
            String regEx = "\\{.+?\\}";
            Pattern pattern = Pattern.compile(regEx);
            Matcher matcher = pattern.matcher(xWPFParagraphText);//正则匹配字符串{****}
    
            if (matcher.find()) {
                // 查找到有标签才执行替换
                int beginRunIndex = xWPFParagraph.searchText("{", new PositionInParagraph()).getBeginRun();// 标签开始run位置
                int endRunIndex = xWPFParagraph.searchText("}", new PositionInParagraph()).getEndRun();// 结束标签
                StringBuffer key = new StringBuffer();
    
                if (beginRunIndex == endRunIndex) {
                    // {**}在一个run标签内
                    XWPFRun beginRun = runs.get(beginRunIndex);
                    String beginRunText = beginRun.text();
    
                    int beginIndex = beginRunText.indexOf("{");
                    int endIndex = beginRunText.indexOf("}");
                    int length = beginRunText.length();
    
                    if (beginIndex == 0 && endIndex == length - 1) {
                        // 该run标签只有{**}
                        XWPFRun insertNewRun = xWPFParagraph.insertNewRun(beginRunIndex);
                        insertNewRun.getCTR().setRPr(beginRun.getCTR().getRPr());
                        // 设置文本
                        key.append(beginRunText.substring(1, endIndex));
                        insertNewRun.setText(getValueBykey(key.toString(),parametersMap));
                        xWPFParagraph.removeRun(beginRunIndex + 1);
                    } else {
                        // 该run标签为**{**}** 或者 **{**} 或者{**}**,替换key后,还需要加上原始key前后的文本
                        XWPFRun insertNewRun = xWPFParagraph.insertNewRun(beginRunIndex);
                        insertNewRun.getCTR().setRPr(beginRun.getCTR().getRPr());
                        // 设置文本
                        key.append(beginRunText.substring(beginRunText.indexOf("{")+1, beginRunText.indexOf("}")));
                        String textString=beginRunText.substring(0, beginIndex) + getValueBykey(key.toString(),parametersMap)
                                + beginRunText.substring(endIndex + 1);
                        insertNewRun.setText(textString);
                        xWPFParagraph.removeRun(beginRunIndex + 1);
                    }
    
                }else {
                    // {**}被分成多个run
    
                    //先处理起始run标签,取得第一个{key}值
                    XWPFRun beginRun = runs.get(beginRunIndex);
                    String beginRunText = beginRun.text();
                    int beginIndex = beginRunText.indexOf("{");
                    if (beginRunText.length()>1  ) {
                        key.append(beginRunText.substring(beginIndex+1));
                    }
                    ArrayList<Integer> removeRunList = new ArrayList();//需要移除的run
                    //处理中间的run
                    for (int i = beginRunIndex + 1; i < endRunIndex; i++) {
                        XWPFRun run = runs.get(i);
                        String runText = run.text();
                        key.append(runText);
                        removeRunList.add(i);
                    }
    
                    // 获取endRun中的key值
                    XWPFRun endRun = runs.get(endRunIndex);
                    String endRunText = endRun.text();
                    int endIndex = endRunText.indexOf("}");
                    //run中**}或者**}**
                    if (endRunText.length()>1 && endIndex!=0) {
                        key.append(endRunText.substring(0,endIndex));
                    }
    
    
    
                    //*******************************************************************
                    //取得key值后替换标签
    
                    //先处理开始标签
                    if (beginRunText.length()==2 ) {
                        // run标签内文本{
                        XWPFRun insertNewRun = xWPFParagraph.insertNewRun(beginRunIndex);
                        insertNewRun.getCTR().setRPr(beginRun.getCTR().getRPr());
                        // 设置文本
                        insertNewRun.setText(getValueBykey(key.toString(),parametersMap));
                        xWPFParagraph.removeRun(beginRunIndex + 1);
                        //移除原始的run
                    }else {
                        // 该run标签为**{**或者 {** ,替换key后,还需要加上原始key前的文本
                        XWPFRun insertNewRun = xWPFParagraph.insertNewRun(beginRunIndex);
                        insertNewRun.getCTR().setRPr(beginRun.getCTR().getRPr());
                        // 设置文本
                        String textString=beginRunText.substring(0,beginRunText.indexOf("{"))+getValueBykey(key.toString(),parametersMap);
                        insertNewRun.setText(textString);
                        xWPFParagraph.removeRun(beginRunIndex + 1);
                        //移除原始的run
                    }
    
                    //处理结束标签
                    if (endRunText.length()==1 ) {
                        // run标签内文本只有}
                        XWPFRun insertNewRun = xWPFParagraph.insertNewRun(endRunIndex);
                        insertNewRun.getCTR().setRPr(endRun.getCTR().getRPr());
                        // 设置文本
                        insertNewRun.setText("");
                        xWPFParagraph.removeRun(endRunIndex + 1);//移除原始的run
    
                    }else {
                        // 该run标签为**}**或者 }** 或者**},替换key后,还需要加上原始key后的文本
                        XWPFRun insertNewRun = xWPFParagraph.insertNewRun(endRunIndex);
                        insertNewRun.getCTR().setRPr(endRun.getCTR().getRPr());
                        // 设置文本
                        String textString=endRunText.substring(endRunText.indexOf("}")+1);
                        insertNewRun.setText(textString);
                        xWPFParagraph.removeRun(endRunIndex + 1);//移除原始的run
                    }
    
                    //处理中间的run标签
                    for (int i = 0; i < removeRunList.size(); i++) {
                        XWPFRun xWPFRun = runs.get(removeRunList.get(i));//原始run
                        XWPFRun insertNewRun = xWPFParagraph.insertNewRun(removeRunList.get(i));
                        insertNewRun.getCTR().setRPr(xWPFRun.getCTR().getRPr());
                        insertNewRun.setText("");
                        xWPFParagraph.removeRun(removeRunList.get(i) + 1);//移除原始的run
                    }
    
                }// 处理${**}被分成多个run
    
                replaceParagraph( xWPFParagraph, parametersMap);
    
            }//if 有标签
    
        }
    
    
    
    
    
    
    
    
        /**
         * 复制表格行XWPFTableRow格式
         *
         * @param target
         *            待修改格式的XWPFTableRow
         * @param source
         *            模板XWPFTableRow
         */
        private void CopyTableRow(XWPFTableRow target, XWPFTableRow source) {
    
            int tempRowCellsize = source.getTableCells().size();// 模板行的列数
            for (int i = 0; i < tempRowCellsize - 1; i++) {
                target.addNewTableCell();// 为新添加的行添加与模板表格对应行行相同个数的单元格
            }
            // 复制样式
            target.getCtRow().setTrPr(source.getCtRow().getTrPr());
            // 复制单元格
            for (int i = 0; i < target.getTableCells().size(); i++) {
                copyTableCell(target.getCell(i), source.getCell(i));
            }
        }
    
    
    
    
    
        /**
         * 复制单元格XWPFTableCell格式
         *
         * @author Juveniless
         * @date 2017年11月27日 下午3:41:02
         * @param newTableCell
         *            新创建的的单元格
         * @param templateTableCell
         *            模板单元格
         *
         */
        private void copyTableCell(XWPFTableCell newTableCell, XWPFTableCell templateTableCell) {
            // 列属性
            newTableCell.getCTTc().setTcPr(templateTableCell.getCTTc().getTcPr());
            // 删除目标 targetCell 所有文本段落
            for (int pos = 0; pos < newTableCell.getParagraphs().size(); pos++) {
                newTableCell.removeParagraph(pos);
            }
            // 添加新文本段落
            for (XWPFParagraph sp : templateTableCell.getParagraphs()) {
                XWPFParagraph targetP = newTableCell.addParagraph();
                copyParagraph(targetP, sp);
            }
        }
    
        /**
         * 复制文本段落XWPFParagraph格式
         *
         * @author Juveniless
         * @date 2017年11月27日 下午3:43:08
         * @param newParagraph
         *            新创建的的段落
         * @param templateParagraph
         *            模板段落
         *
         */
        private void copyParagraph(XWPFParagraph newParagraph, XWPFParagraph templateParagraph) {
            // 设置段落样式
            newParagraph.getCTP().setPPr(templateParagraph.getCTP().getPPr());
            // 添加Run标签
            for (int pos = 0; pos < newParagraph.getRuns().size(); pos++) {
                newParagraph.removeRun(pos);
    
            }
            for (XWPFRun s : templateParagraph.getRuns()) {
                XWPFRun targetrun = newParagraph.createRun();
                CopyRun(targetrun, s);
            }
    
        }
    
        /**
         * 复制文本节点run
         * @author Juveniless
         * @date 2017年11月27日 下午3:47:17
         * @param newRun
         *            新创建的的文本节点
         * @param templateRun
         *            模板文本节点
         *
         */
        private void CopyRun(XWPFRun newRun, XWPFRun templateRun) {
            newRun.getCTR().setRPr(templateRun.getCTR().getRPr());
            // 设置文本
            newRun.setText(templateRun.text());
    
    
        }
    
    
    
    
        /**
         * 根据参数parametersMap对表格的一行进行标签的替换
         *
         * @author Juveniless
         * @date 2017年11月23日 下午2:09:24
         * @param tableRow
         *            表格行
         * @param parametersMap
         *            参数map
         *
         */
        public void replaceTableRow(XWPFTableRow tableRow, Map<String, Object> parametersMap) {
    
            List<XWPFTableCell> tableCells = tableRow.getTableCells();
            for (XWPFTableCell xWPFTableCell : tableCells) {
                List<XWPFParagraph> paragraphs = xWPFTableCell.getParagraphs();
                for (XWPFParagraph xwpfParagraph : paragraphs) {
    
                    replaceParagraph(xwpfParagraph, parametersMap);
                }
            }
    
        }
    
        /**
         * 根据map替换表格中的{key}标签
         * @author Juveniless
         * @date 2017年12月4日 下午2:47:36
         * @param xwpfTable
         * @param parametersMap
         *
         */
        public void replaceTable(XWPFTable xwpfTable,Map<String, Object> parametersMap){
            List<XWPFTableRow> rows = xwpfTable.getRows();
            for (XWPFTableRow xWPFTableRow : rows ) {
                List<XWPFTableCell> tableCells = xWPFTableRow.getTableCells();
                for (XWPFTableCell xWPFTableCell : tableCells ) {
                    List<XWPFParagraph> paragraphs2 = xWPFTableCell.getParagraphs();
                    for (XWPFParagraph xWPFParagraph : paragraphs2) {
                        replaceParagraph(xWPFParagraph, parametersMap);
                    }
                }
            }
    
        }
    
        private String getValueBykey(String key, Map<String, Object> map) {
            String returnValue="";
            if (key != null) {
                try {
                    returnValue=map.get(key)!=null ? map.get(key).toString() : "";
                } catch (Exception e) {
                    // TODO: handle exception
                    System.out.println("key:"+key+"***"+e);
                    returnValue="";
                }
    
            }
            return returnValue;
        }
    }
    
    
    展开全文
  • Word VBA-表格操作汇总

    2021-05-28 09:41:57
    Sub 遍历表格设定样式() For Each aTable In ActiveDocument.Tables With aTable With .Shading .Texture = wdTextureNone .ForegroundPatternColor = wdColorAutomatic .BackgroundPatter

    ===========================

    Sub 遍历表格设定样式()
    	For Each aTable In ActiveDocument.Tables
    		    With aTable
    		        With .Shading
    		            .Texture = wdTextureNone
    		            .ForegroundPatternColor = wdColorAutomatic
    		            .BackgroundPatternColor = wdColorAutomatic
    		        End With
    		        With .Borders(wdBorderLeft)
    		            .LineStyle = wdLineStyleSingle
    		            .LineWidth = wdLineWidth050pt
    		            .Color = wdColorAutomatic
    		        End With
    		        With .Borders(wdBorderRight)
    		            .LineStyle = wdLineStyleSingle
    		            .LineWidth = wdLineWidth050pt
    		            .Color = wdColorAutomatic
    		        End With
    		        With .Borders(wdBorderTop)
    		            .LineStyle = wdLineStyleSingle
    		            .LineWidth = wdLineWidth050pt
    		            .Color = wdColorAutomatic
    		        End With
    		        With .Borders(wdBorderBottom)
    		            .LineStyle = wdLineStyleSingle
    		            .LineWidth = wdLineWidth050pt
    		            .Color = wdColorAutomatic
    		        End With
    		        With .Borders(wdBorderHorizontal)
    		            .LineStyle = wdLineStyleSingle
    		            .LineWidth = wdLineWidth050pt
    		            .Color = wdColorAutomatic
    		        End With
    		        With .Borders(wdBorderVertical)
    		            .LineStyle = wdLineStyleSingle
    		            .LineWidth = wdLineWidth050pt
    		            .Color = wdColorAutomatic
    		        End With
    		        .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
    		        .Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNone
    		        .Borders.Shadow = False
    		    End With
    		
    		    With Options
    		        .DefaultBorderLineStyle = wdLineStyleSingle
    		        .DefaultBorderLineWidth = wdLineWidth050pt
    		        .DefaultBorderColor = wdColorAutomatic
    		    End With
    	Next aTable
    End Sub

    ===========================

    '遍历表格的操作
    
    	Dim aTable As Table
    	'第一种实现方式,根据索引遍历表格,特定单元格赋值内容
    	For i = 1 To ActiveDocument.Tables.Count
    	    Set aTable = ActiveDocument.Tables.Item(i)
    	    With aTable
    	        .Cell(2, 1).Range.Text = "123"
    	    End With
        Next
    
        '第二种实现方式
        For Each aTable In ActiveDocument.Tables
    	    With aTable
    	        .Cell(2, 1).Range.Text = "123"
    	    End With
        Next
    
    

    ===========================

    '判断表格列标题,针对不同标题列设置不同样式
    With aTable
        For i = 1 To .Columns.Count
            If InStr(.Cell(1, i).Range.Text, "序号") Or _
                InStr(.Cell(1, i).Range.Text, "数量") Or _
                InStr(.Cell(1, i).Range.Text, "单位") Then
                (Code代码段)
            End If
        Next
    End With

    ===========================

    '表格样式设置代码汇总
    With aTable
    
    	'将预定义外观应用于表格。
    	'        .AutoFormat Format:=wdTableFormatColorful2
    	'        .AutoFormat applyborders:=True
    	'        .AutoFormat ApplyShading:=True
    	'        .AutoFormat ApplyFont:=True
    	'        .AutoFormat ApplyColor:=True
    	'        .AutoFormat ApplyHeadingRows:=True
    	'        .AutoFormat ApplyLastRow:=True
    	'        .AutoFormat ApplyFirstColumn:=True
    	'        .AutoFormat ApplyLastColumn:=True
    	'        .AutoFormat AutoFit:=True
    	
    
    	'应用用户定义的样式,但保留用户直接应用的所有格式。
        '        .ApplyStyleDirectFormatting StyleName:="样式1"
    
    
        '调整行列的样式,必须使用Select的方法,先选中再设置样式
        '调整首行的对齐方式
    	'        .Rows(1).Select
    	'        With Selection
    	'            .ParagraphFormat.Alignment = wdAlignParagraphCenter
    	'        End With
    	'调整各列的对齐方式
    	'        .Columns(3).Select
    	'        With Selection
    	'            .ParagraphFormat.Alignment = wdAlignParagraphCenter
    	'        End With
    	'        .Columns(4).Select
    	'        With Selection
    	'            .ParagraphFormat.Alignment = wdAlignParagraphCenter
        '        End With
    
    
    	'操作单元格内容赋值
        '        .Cell(1, 1).Range.Text = "hello"
    
    End With

    ===========================

    ===========================

    ===========================

    ===========================

    ===========================

    ===========================

    ===========================

    ===========================

    ===========================

    ===========================

    ===========================

    ===========================

    ===========================

    ===========================

     

     
    展开全文
  • Word表格之VBA知识

    千次阅读 多人点赞 2019-01-28 13:56:10
    Table对象(因为是对象,...下面是Table的常用方法(注意是部分,不是全部,只例出重要的方法,下面的属性皆如此,如果详细面全部的了解,请看Word VBA自带的帮助。VBAWD10.chm) 使用Table对象 可使用 Tables(...

    Table对象(因为是对象,所以用Set赋值)

    该对象代表一个单独的表格。Table 对象是Tables集合的一个成员。Tables集合包含了指定的选定内容范围文档中的所有表格

    下面是Table的常用方法(注意是部分,不是全部,只例出重要的方法,下面的属性皆如此,如果详细面全部的了解,请看Word VBA自带的帮助。VBAWD10.chm)

    使用Table对象

    可使用 Tables(index) 返回一个 Table 对象,其中 index 为索引号。索引号代表选定内容、范围或文档中表格的位置。下例将活动文档中的第一个表格转换为文本。

    ActiveDocument.Tables(1).ConvertToText Separator:=wdSeparateByTabs

    使用Add方法可以在指定范围内新增一表格。下例在活动文档的起始处添加一 3 x 4 表格。

    Set myRange = ActiveDocument.Range(Start:=0, End:=0)

    ActiveDocument.Tables.Add Range:=myRange, NumRows:=3, NumColumns:=4

    Cell 方法

    返回一个 Cell 对象,该对象代表表格中的一个单元格

    expression.Cell(Row, Column)

    expression      必需。该表达式返回一个Table对象。

    Row   Long 类型,必需。指返回的表格行数。可以是介于 1 和表格行数之间的任意整数。

    Column    Long 类型,必需。指返回的表格单元格数目。可以是介于 1 和表格列数之间的任意整数。

    示例

    本示例在新文档中创建一个 3x3 表格,并在表格的第一个和最后一个单元格中插入文本。

    Dim docNew As Document

    Dim tableNew As Table

    Set docNew = Documents.Add

    Set tableNew = docNew.Tables.Add(Selection.Range, 3, 3)

    With tableNew

        .Cell(1,1).Range.InsertAfter "First cell"

        .Cell(tableNew.Rows.Count, _

            tableNew.Columns.Count).Range.InsertAfter "Last Cell"

    End With

    本示例删除活动文档的第一个表格中的第一个单元格的内容。

    If ActiveDocument.Tables.Count >= 1 Then

        ActiveDocument.Tables(1).Cell(1, 1).Delete

    End If

    Split 方法

    在表格中紧靠指定行的上面插入一空段落,并且返回一个 Table 对象,此对象包含指定行及其下一行。(简单的的理解:就是指向拆分后的下面的表格,不清楚也没关系,看下面的例子。)

    expression.Split(BeforeRow)

    expression      必需。该表达式返回一个 Table 对象。

    BeforeRow     Variant 类型,必需。将要拆分的表格的前一行。可以为 Row 对象或行号。

    本示例在活动文档(应试是新建文档)中创建一张 5x5 的表格,并且在第三行之前进行拆分。然后为结果表格(新的 3x5 表格)的单元格添加底纹。

    Set newDoc = Documents.Add

    Set myTable = ActiveDocument.Tables.Add(Range:=Selection.Range, _

        NumColumns:=5, NumRows:=5)

    myTable.Split(BeforeRow:=myTable.Rows(3)).Shading _

        .Texture = wdTexture10Percent

    Table属性

    Range 属性

    本示例复制表格 1 中的首行。

     

    If ActiveDocument.Tables.Count >= 1 Then _

        ActiveDocument.Tables(1).Rows(1).Range.Copy

    End if

    Borders 属性

    该属性返回一个 Borders 集合,该集合代表指定对象的所有边框。

    expression.Borders

    expression      必需。该表达式返回“应用于”列表中的一个对象。

    示例

    本示例对活动文档中的第一个表格应用内部和外部边框。

    Set myTable = ActiveDocument.Tables(1)

    With myTable.Borders

        .InsideLineStyle = wdLineStyleSingle

        .OutsideLineStyle = wdLineStyleDouble

    End With

    Columns 属性

    返回一个 Columns 集合,该集合代表在某一区域、所选内容或表格中所有表格列。只读

    示例

    本示例显示活动文档的第一个表格中的列数。

    If ActiveDocument.Tables.Count >= 1 Then

        MsgBox ActiveDocument.Tables(1).Columns.Count

    End If

    本示例将当前列的宽度设置为 1 英寸。

    If Selection.Information(wdWithInTable) = True Then

        Selection.Columns.SetWidth ColumnWidth:=InchesToPoints(1), _

            RulerStyle:=wdAdjustProportional

    End If

    Rows 属性

    该属性返回一个 Rows 集合,该集合代表某个范围、所选部分或表格中所有的表格行。只读。

    本示例删除活动文档第一个表格的第二行。

    ActiveDocument.Tables(1).Rows(2).Delete

    本示例为插入点所在行的各单元格设置边框。

    Selection.Collapse Direction:=wdCollapseStart

    If Selection.Information(wdWithInTable) = True Then

        Selection.Rows(1).Borders.OutsideLineStyle =  wdLineStyleSingle

    Else

        MsgBox "The insertion point is not in a table."

    End If

    Column 对象

    代表单个表格列。Column 对象是 Columns 集合的一个元素。Columns 集合包括某一表格、选定内容或区域中的所有列。

    使用 Column 对象

    使用 Columns(index) 可返回单独的 Column 对象,其中 index 为索引序号。索引序号代表该列在 Columns 集合中的位置(从左至右计算)

    下列示例选定活动文档中的表格 1 的第一列。

    ActiveDocument.Tables(1).Columns(1).Select

    用 Cell 对象的 Column 属性可返回一个 Column 对象。下列示例删除单元格 1 中的文字,插入新文字,然后对该列进行排序。

    With ActiveDocument.Tables(1).Cell(1, 1)

        .Range.Delete

        .Range.InsertBefore "Sales"

        .Column.Sort

    End With

    用 Add 方法可在表格中添加一列。下列示例为活动文档的第一张表格中添加一列,然后将列宽设置为相等。

    If ActiveDocument.Tables.Count >= 1 Then

        Set myTable = ActiveDocument.Tables(1)

        myTable.Columns.Add BeforeColumn:=myTable.Columns(1)

        myTable.Columns.DistributeWidth

    End If

    说明

    用 Selection 对象的 Information 属性可返回当前列号。下列示例选定当前列并在消息框中显示其列号。

    If Selection.Information(wdWithInTable) = True Then

        Selection.Columns(1).Select

        MsgBox "Column " _

            & Selection.Information(wdStartOfRangeColumnNumber)

    End If

    Cell 对象

    代表单个表格单元格。Cell 对象是 Cells 集合中的元素。Cells 集合代表指定对象中所有的单元格。

    使用 Cell 对象

    用 Cell(row, column) 或 Cells(index)可返回 Cell 对象,其中 row 为行号,column 为列号,index 为索引序号。下列示例给第一行的第二个单元格加底纹。

    Set myCell = ActiveDocument.Tables(1).Cell(Row:=1, Column:=2)

    myCell.Shading.Texture = wdTexture20Percent

    下列示例给第一行的第一个单元格加底纹。

    ActiveDocument.Tables(1).Rows(1).Cells(1).Shading _

        .Texture = wdTexture20Percent

    用 Add 方法可在 Cells 集合中添加 Cell 对象。也可用 Selection 对象的 InsertCells 方法插入新单元格。下列示例在 myTable 的第一个单元格之前插入一个单元格。

    Set myTable = ActiveDocument.Tables(1)

    myTable.Range.Cells.Add BeforeCell:=myTable.Cell(1, 1)

    本示例将第一个表格的头两个单元格设定为一个域 (myRange)。区域设定之后,用 Merge 方法合并两个单元格。

    Set myTable = ActiveDocument.Tables(1)

    Set myRange = ActiveDocument.Range(myTable.Cell(1, 1) _

        .Range.Start, myTable.Cell(1, 2).Range.End)

    myRange.Cells.Merge

    说明

    使用带 Rows 或 Columns 集合的 Add 方法添加一行或一列单元格。

    使用 Selection 对象的 Information 属性返回当前行号和列号。下面的示例改变选中部分第一个单元格的宽度,再显示单元格的行号和列号。

    If Selection.Information(wdWithInTable) = True Then

        With Selection

            .Cells(1).Width = 22

            MsgBox "Cell " & .Information(wdStartOfRangeRowNumber) _

                & "," & .Information(wdStartOfRangeColumnNumber)

        End With

    End If

    Row 对象

    代表表格的一行。Row 对象是 Rows 集合中的一个元素。Rows 集合包括指定部分、区域或表格中的所有行。

    使用 Row 对象

    用 Rows(index) 可返回单独的 Row 对象,其中 index 为索引序号。索引序号代表该行在选定部分、区域或表格中的位置。下列示例删除活动文档中第一张表格的首行。

    ActiveDocument.Tables(1).Rows(1).Delete

    用 Add 方法可在表格中添加行。下列示例在选定部分首行前插入一行。

    If Selection.Information(wdWithInTable) = True Then

        Selection.Rows.Add BeforeRow:=Selection.Rows(1)

    End If

    说明

    用 Cells 属性可修改 Row 对象中的单个单元格。下列示例在选定部分中添加一张表格,并在表格第二行的各单元格内插入数字。

    Selection.Collapse Direction:=wdCollapseEnd

    If Selection.Information(wdWithInTable) = False Then

        Set myTable = _

            ActiveDocument.Tables.Add(Range:=Selection.Range, _

            NumRows:=3, NumColumns:=5)

        For Each aCell In myTable.Rows(2).Cells

            i = i + 1

            aCell.Range.Text = i

        Next aCell

    End If

    访问表格行或列时产生的错误

    如果要访问绘制表格中单独的行或列,而该表格又不统一,则会产生一个运行时错误。例如,如果活动文档中第一张表格的每列中具有不同数量的行,则使用下列指令将导致出错。

    Sub RemoveTableBorders()

        ActiveDocument.Tables(1).Rows(1).Borders.Enable = False

    End Sub

    要避免这种错误可首先使用 SelectColumn  SelectRow 方法选定一列或一行中的单元格。选定单元格后,再使用 Selection 对象的 Cells 属性。下列示例选定第一张文档表格中的第一行。Cells 属性用于访问选定的单元格(第一行中的所有单元格)以删除边框。

    Sub RemoveTableBorders()

        ActiveDocument.Tables(1).Cell(1, 1).Select

        With Selection

            .SelectRow

            .Cells.Borders.Enable = False

        End With

    End Sub

    下列示例选定第一张文档表格的第一列。For Each...Next 循环语句用于在所选内容(第一列中的所有单元格)的每个单元格中添加文字。

    Sub AddTextToTableCells()

        Dim intCell As Integer

        Dim oCell As Cell

        ActiveDocument.Tables(1).Cell(1, 1).Select

        Selection.SelectColumn

        intCell = 1

        For Each oCell In Selection.Cells

            oCell.Range.Text = "Cell " & intCell

            intCell = intCell + 1

        Next oCell

    End Sub

    处理表格

    创建一张表格,插入文字,并应用格式

    下列示例在活动文档的开头插入一张 4 列 3 行的表格。For Each...Next 结构用于循环遍历表格中的每个单元格。在 For Each...Next 结构中,InsertAfter 方法用于将文字添至表格单元格(单元格 1、单元格 2、以此类推)。

    Sub CreateNewTable()

        Dim docActive As Document

        Dim tblNew As Table

        Dim celTable As Cell

        Dim intCount As Integer

        Set docActive = ActiveDocument

        Set tblNew = docActive.Tables.Add( _

            Range:=docActive.Range(Start:=0, End:=0), NumRows:=3, _

            NumColumns:=4)

        intCount = 1

        For Each celTable In tblNew.Range.Cells

            celTable.Range.InsertAfter "Cell " & intCount

            intCount = intCount + 1

        Next celTable

        tblNew.AutoFormat Format:=wdTableFormatColorful2, _

            ApplyBorders:=True, ApplyFont:=True, ApplyColor:=True

    End Sub

    在表格单元格中插入文字

    下列示例在活动文档中第一张表格的第一个单元格中插入文字。Cell 方法返回单独的 Cell 对象。Range 属性返回一个 Range 对象。Delete 方法用于删除现有的文字,而 InsertAfter 方法用于插入文字“Cell 1,1”。

    Sub InsertTextInCell()

        If ActiveDocument.Tables.Count >= 1 Then

            With ActiveDocument.Tables(1).Cell(Row:=1, Column:=1).Range

                .Delete

                .InsertAfter Text:="Cell 1,1"

               ' .text="cell 1,1" 上面两行,可以用这一行表示。

            End With

        End If

    End Sub

    返回表格单元格中的文字,不包括表格结束单元格标记

    下列示例返回并显示文档中第一张表格的第一行中每个单元格的内容。

    Sub ReturnTableText()

        Dim tblOne As Table

        Dim celTable As Cell

        Dim rngTable As Range

        Set tblOne = ActiveDocument.Tables(1)

        For Each celTable In tblOne.Rows(1).Cells

            Set rngTable = ActiveDocument.Range(Start:=celTable.Range.Start, _

                End:=celTable.Range.End - 1)         '注意这里用了-1

            MsgBox rngTable.Text

        Next celTable

    End Sub

     

    Sub ReturnCellText()

        Dim tblOne As Table

        Dim celTable As Cell

        Dim rngTable As Range

        Set tblOne = ActiveDocument.Tables(1)

        For Each celTable In tblOne.Rows(1).Cells

            Set rngTable = celTable.Range

            rngTable.MoveEnd Unit:=wdCharacter, Count:=-1

            MsgBox rngTable.Text

        Next celTable

    End Sub

     

    将文本转换为表格

    下列示例在活动文档的开头插入用制表符分隔的文本,然后将这些文本转换为表格。

    Sub ConvertExistingText()

        With Documents.Add.Content

            .InsertBefore "one" & vbTab & "two" & vbTab & "three" & vbCr

            .ConvertToTable Separator:=Chr(9), NumRows:=1, NumColumns:=3

        End With

    End Sub

     

    返回每个表格单元格的内容

    下列示例定义一个数组,该数组的元素个数等于文档中第一张表格(假定为 Option Base 1)中的单元格数。For Each...Next 结构用于返回每个表格单元格的内容,并将文字指定给相应的数组元素。

    Sub ReturnCellContentsToArray()

        Dim intCells As Integer

        Dim celTable As Cell

        Dim strCells() As String

        Dim intCount As Integer

        Dim rngText As Range

        If ActiveDocument.Tables.Count >= 1 Then

            With ActiveDocument.Tables(1).Range

                intCells = .Cells.Count

                ReDim strCells(intCells)

                intCount = 1

                For Each celTable In .Cells

                    Set rngText = celTable.Range

                    rngText.MoveEnd Unit:=wdCharacter, Count:=-1

                    strCells(intCount) = rngText

                    intCount = intCount + 1

                Next celTable

            End With

        End If

    End Sub

    (测试环境.docVBA中有更好的方法,可以参考)

    将活动文档中的所有表格复制到新文档中

    本示例将当前文档中的表格复制到新文档中。

    Sub CopyTablesToNewDoc()

        Dim docOld As Document

        Dim rngDoc As Range

        Dim tblDoc As Table

        If ActiveDocument.Tables.Count >= 1 Then

            Set docOld = ActiveDocument

            Set rngDoc = Documents.Add.Range(Start:=0, End:=0)

            For Each tblDoc In docOld.Tables

                tblDoc.Range.Copy

                With rngDoc

                    .Paste

                    .Collapse Direction:=wdCollapseEnd

                    .InsertParagraphAfter

                    .Collapse Direction:=wdCollapseEnd

                End With

            Next

        End If

    End Sub

     

    以下为我对表格的认识:(陋见)

    在“测试环境.doc”中有不少的例子(在VBA中),也有解释,

    两个文档花了我8小时以上(即一个工作日以上)

    关于表格在VBA中的相关说明:

    1.         如下图,类似于回车 在VBA中也是chr(13),竖线就是chr(7),怎么知道的?

    2.         当然是看老大们知道的。不过。在“测试环境.doc”中有相关的宏能得到这些数字。这也是授之以渔吧。

    3.         重点推荐“测试环境.doc的相关代码用了我不少功夫,慢慢体会。不懂的可以提出来。

     

    Ch(13)

    Ch(7)

     

    4.         因为chr(13)为段落标记,所以在VBA中,ActiveDocument.Paragraphs.Count测得的段落数与工具、字数统计是不一样的。

    5.         如果这样统计:表格中单元格中类似的 且不为空就为一个段落,否则不算。这就与工工具、字数统计的段落数一样了。

    6.         如果要新建一个表格,再添加一些字符(包括数字)的话,更好的方法是:先字符写入文档中(当然,要加一些标记,以便确定单元格),再利用Word的表格、转换、文字转换为表格。这样,速度快一些。有以下的代码为证。

    Sub 表格5()

    '先放到文档,再放入表格

    Dim i%, astring As String

    Dim adoc As Document

    Dim atime As Long

    Application.ScreenUpdating = False '关闭屏幕更新

    atime = Timer '设atime为正前时间

    For i = 1 To 1000

        astring = astring & i & Chr(13)

    Next

        Set adoc = Documents.Add

            adoc.Content = astring

            adoc.Range.ConvertToTable Separator:=wdSeparateByParagraphs, NumColumns:=10, _

            NumRows:=100

    Application.ScreenUpdating = True

        MsgBox "先放到文档的运行时间为:" & Timer - atime

        '1.28,1.07,1.03

    End Sub

    Sub 表格6()

    '先生成表格,再向单元格中添数

    Dim i%, astring As String

    Dim adoc As Document

    Dim atime As Long

    Dim atable As Table

    Application.ScreenUpdating = False '关闭屏幕更新

    atime = Timer '设atime为正前时间

    Set adoc = Documents.Add

    Set atable = adoc.Tables.Add(Selection.Range, 100, 10)

    With atable.Range

        For i = 1 To 1000

            .Cells(i).Range.Text = i

        Next

    End With

    Application.ScreenUpdating = True

        MsgBox "先放到文档的运行时间为:" & Timer - atime

        '16.3,15.53,15.35

    End Sub

    '几乎是15倍的差别,谁快谁慢应该大家知道了。还顺带说一话:有的软件在操作Word的表格时,就是用类似于“表格6”的方法,而且也没有用Appplication.ScreenUpdating=true。所以,看上去就像在看动画片。(例如:“青山预算之星”的“输出到Word”就是)看来,国产软件还需努力。

    7.         有些尤意末尽的,大家慢慢在程序中体会。

    8.         特别强调:微软本身的许多功能,不是一般的VBA的程序,比VBA要快很多,不明白内部是用什么语言或什么原理在工作。例如:a.邮件合并,速度奇快。如果你试着用VBA来做,速度奇慢。b.修订功能;c.工具、宏、命令listcommands的运行速度。
    等等,都是我们VBA一族所不能及的。(不过来,如果我们的VBA与微软快,微软不PK我们才怪。呵呵,阿Q精神一下,找一下心理平衡。

    展开全文
  • python excel表格转word表格

    千次阅读 2019-04-08 09:39:22
    # 定位到相应sheet页,[0]为sheet页索引 xl_sheet = wb.get_sheet_by_name(xl_sheet_names[0]) # 获取行列数 excel_row = xl_sheet.max_row excel_column = xl_sheet.max_column # word文档 document = ...
  • Word应该是办公软件中使用频率最高的工具,但却一直不被很多人重视,以为它简单很容易学,但实际很多人并没有掌握其基本用法,以至于自己的工作效率一直提不高。今天分享的这些Word技巧包含了入门到精通,也许在你...
  • NPOI导出word,NPOI导出word表格,NPOI复制table表格 XWPFDocument中XWPFTable 使用NPOI可以对Word中的文本做替换,当遇到表格时,单个表格也可以循环遍历替换,但是如果需要根据数据源的条数,动态生成多个表格时...
  • 今日需求 其实就是把Word中的表格转到Excel中,顺便做一个调整。 如果单单是两个表格,那只要简单的复制黏贴即可,但如果上百了呢?那就得考虑自动化了。...path = "./word表格转excel.docx" docx = Document
  • 1 Maven依赖 com.alibaba easyexcel 2.2.7 cn.hutool hutool-all 5.6.2 2 合并单元格 /** * 合并单元格 * * @param table 表格对象 * @param beginRowIndex 开始行索引 * @param endRowIndex 结束行索引 * ...
  • Java POI导出word文件及生成表格

    千次阅读 2020-03-25 17:04:37
    HWPF是处理 Microsoft Word 97(-2007) .doc文件格式,它还为较旧的Word 6和Word 95文件格式提供了有限的只读支持。包含在poi-scratchpad-XXX.jar中。 XWPF是处理 Word 2007 .docx文件格式,包含在poi-ooxml-XXX....
  • word排版、页码、目录、索引、页眉页脚 自己总结的关于word排版、页码、目录、索引、页眉页脚的操作,图文并茂
  • Java使用POI读取Word中的表格

    千次阅读 2019-09-23 15:12:08
    个人博客 地址:https://www.wenhaofan.com/a/20190627135921 代码packagelive.autu.word; importjava.io.FileInputStream; importorg.apache.poi.hwpf.HWPFDocument; importorg.apache.poi.hwpf.usermodel.Paragr....
  • 公众号后台回复“图书“,了解更多号主新书内容 作者:林小呆 来源:数据分析与统计学之美 今日需求其实就是把Word中的表格转到Excel中,顺便做一个调整。这个需求在实际工作中,很多人...
  • 案例思想是源于前两天帮读者做了一个 demo ,需求大致将一上百个 word表格内容提取出来(所有word表格样式一样),把提取到的内容自动存入 Excel 中 word表格形式如下 目前含有数个上面形式的 word 文档需要...
  • 插入公式的方法如果采用常规的编辑手段自己去组合,不仅需要进行大量的格式设置,并且可能会影响版面的美观,因此,我们通常会利用Word中集成的公式编辑器来插入一个公式。将鼠标定位在文档中插入公式的位置,点击...
  • 当文档中有很多表格的时候,需要引用题注的方式给表格编号。 首先要对章标题进行格式设置,且章标题只能用样式中的标题1、标题2;可以将标题1改成自定义的格式,但必须必须要用标题1; 设置好章标题后,插入题注;...
  • 利用python-docx批量处理Word文件——表格

    万次阅读 多人点赞 2018-10-28 21:28:28
    Word和Excel大概是我们最常碰到的两种文件了,我前面写过pandas的...如何批量处理word中的表格 我随便找了一个Word文件,它的部分内容如下: 这个文件中有多个这样表格,我们要将它们处理成一个简单表——属性...
  • 一共二百多页的word手动添加这些清单是非常恐怖的工作量,笔者想到了编程。尝试试过word自带的VBA,觉得过于笨拙(其实是笔者水平不足),故放弃。也试过python用来读取word的一个库docx,代码如下。from docx import ...
  • 日历表格面板 [ConfigLine.java] 控制条类 [RoundBox.java] 限定选择控件 [MonthMaker.java] 月份表算法类 [Pallet.java] 调色板,统一配色类 Java扫雷源码 Java生成自定义控件源代码 2个目标文件 Java实现HTTP连接...
  • doc文件转docx文件 根目录文件自动读取 批量处理word文件中指定关键词后的表格导入excel
  • 在利用Word文档制作会议记录等文件时,由于内容太多,为了方便了解文档大纲我们往往需要制作一个目录索引。那么很多小伙伴就有了疑惑,这个看似简单的目录索引到底该如何制作呢?今天小编就来教大家快速制作目录索引...
  • 利用python-docx自动生成表格 add_table()方法会返回一个Table对象。rows代表行数,cols代表列数;...上述代码就在word里插入了一个8行、5列的表格。(有8*5=40个cell) 生成的每个cell都是有“坐标”的,
  • 文章目录1、插入表格代码:效果:2、插入行代码:效果:3、插入列代码:效果:4、CreateCell 1、插入表格 代码: https://blog.csdn.net/a3562323/article/details/116146544 效果: 2、插入行 代码: //加载文档 ...
  • word表格断页怎么办?(如何处理word里面表格...解决办法步骤详文索引word表格断页怎么办?(如何处理word里面表格断页问题)【知足且坚定,温柔且上进---两牛博客】一、问题如图描述二、选中表格三、单击鼠标右键
  • 注:本文由于个人工作需要,有对多个他人博文进行借鉴,...java代码对word文档进行文字,图片,表格的添加以及替换,效果图如下: 原文档: 替换后文档: 正文开始 前提:需要引入包 Spire.Doc.jar 大家可...
  • 插入图表编号 ...插入图片>>>右键插图选择“插入题注”>>>调整配置,插入的格式和位置>>>修改...“题注标签”选择“图”索引图,选择“表”索引表格 转载于:https://www.cnblogs.com/shyzh/p/10512769.html
  • 内容索引:VB源码,字符处理,仿Word VB仿Word文字编辑程序,相对于Word,本程序实现的功能还不算太多,但是比记事本更高级一些,它可以编辑文字格式,比如设置字体、颜色,对齐方式,统计文字数量等,另外可以插入...
  • 对于word中存在合并单元格的表格:  下图是对Cells遍历的结果,True表示该行该列的单元格存在,False表示不存在。
  • 上篇:【C#】C#使用Microsoft.Office.Interop.Word操作Word文档,替换文本 Word模板:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,631
精华内容 7,452
关键字:

word表格索引