All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.anyline.office.docx.util.DocxUtil Maven / Gradle / Ivy

There is a newer version: 8.7.2-20250110
Show newest version
/*
 * Copyright 2006-2023 www.anyline.org
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */




package org.anyline.office.docx.util;

import org.anyline.util.BasicUtil;
import org.anyline.util.DomUtil;
import org.anyline.util.StyleParser;
import org.anyline.util.ZipUtil;
import org.anyline.util.regular.RegularUtil;
import org.dom4j.*;
import org.anyline.log.Log;
import org.anyline.log.LogProxy;

import java.io.File;
import java.util.*;

public class DocxUtil {
    private static Log log = LogProxy.get(DocxUtil.class);

    /**
     * 根据关键字查找样式列表ID
     * @param docx docx文件
     * @param key 关键字
     * @return String
     */
    public static String listStyle(File docx, String key, String charset){
        try {
            String num_xml = ZipUtil.read(docx, "word/document.xml", charset);
            Document document = DocumentHelper.parseText(num_xml);
            List ts = DomUtil.elements(document.getRootElement(),"t");
            for(Element t:ts){
                if(t.getTextTrim().contains(key)){
                    Element pr = t.getParent().getParent().element("pPr");
                    if(null != pr) {
                        Element numPr = pr.element("numPr");
                        if(null != numPr){
                            Element numId = numPr.element("numId");
                            if(null != numId){
                                String val = numId.attributeValue("val");
                                if(null != val){
                                    return val;
                                }
                            }
                        }
                    }
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 根据关键字查找样式列表ID
     * @param docx docx文件
     * @return String
     */
    public static List listStyles(File docx, String charset){
        List list = new ArrayList<>();
        try {
            String num_xml = ZipUtil.read(docx, "word/numbering.xml", charset);
            Document document = DocumentHelper.parseText(num_xml);
            List nums = document.getRootElement().elements("num");
            for(Element num:nums){
                list.add(num.attributeValue("numId"));
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return list;
    }

    /**
     * 合并文件(只合并内容document.xml)合并到第一个文件中
     * @param files files
     */
    public static void merge(String charset, File ... files){
        if(null != files && files.length>1){
            List docs = new ArrayList<>();
            for(File file:files){
                docs.add(ZipUtil.read(file,"word/document.xml", charset));
            }
            String result = merge(docs);
            try {
                Document document = DocumentHelper.parseText(result);
                Element root = document.getRootElement().element("body");
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    public static String merge(List  docs){
        String result = null;
        return result;
    }

    /**
     * copy的样式复制给src
     * @param src src
     * @param copy 被复制p/w或pPr/wPr
     * @param override 如果样式重复,是否覆盖原来的样式
     */
    public static void copyStyle(Element src, Element copy, boolean override){
        if(null == src || null == copy){
            return;
        }
        String name = src.getName();
        String prName = name+"Pr";
        Element srcPr = src.element(prName);
        if(override){
            src.remove(srcPr);
            srcPr = null;
        }
        Element pr = null;
        String copyName = copy.getName();
        if(copyName.equals(prName)){
            pr = copy;
        }else {
            pr = DomUtil.element(copy, prName);;
        }
        if(null != pr){
            if(null == srcPr) {
                // 如果原来没有pr新创建一个
                Element newPr = pr.createCopy();
                src.elements().add(0, newPr);
            }else{
                List items = pr.elements();
                List newItems = new ArrayList<>();
                for(Element item:items){
                    String itemName = item.getName();
                    Element srcItem = srcPr.element(itemName);
                    if(override){
                        srcPr.remove(srcItem);
                        srcItem = null;
                    }
                    if(null == srcItem){
                        // 如果原来没有这个样式条目直接复制一个
                        Element newItem = item.createCopy();
                        newItems.add(newItem);
                    }else{
                        // 如果原来有这个样式条目,在原来基础上复制属性
                        List attributes = item.attributes();
                        for(Attribute attribute:attributes){
                            String attributeName = attribute.getName();
                            String attributeFullName = attributeName;
                            String attributeNamespace = attribute.getNamespacePrefix();
                            if(BasicUtil.isNotEmpty(attributeNamespace)){
                                attributeFullName = attributeNamespace+":"+attributeName;
                            }
                            Attribute srcAttribute = srcItem.attribute(attributeName);
                            if(null == srcAttribute){
                                srcAttribute = srcItem.attribute(attributeFullName);
                            }
                            if(override){
                                if(null != srcAttribute){
                                    srcItem.remove(srcAttribute);
                                    srcAttribute = null;
                                }
                            }
                            if(null == srcAttribute) {
                                srcItem.attributeValue(attributeFullName, attribute.getStringValue());
                            }
                        }
                    }
                }
                srcPr.elements().addAll(newItems);
            }
        }
    }
    public static void copyStyle(Element src, Element copy){
        copyStyle(src, copy, false);
    }
    /**
     * 前一个节点
     * @param element element
     * @return element
     */
    public static Element prevByName(Element element){
        Element prev = null;
        List elements = DomUtil.elements(top(element), element.getName());
        int index = elements.indexOf(element);
        if(index > 0){
            prev = elements.get(index -1);
        }
        return prev;
    }
    public static Element prevByName(Element parent, Element element){
        Element prev = null;
        List elements = DomUtil.elements(parent, element.getName());
        int index = elements.indexOf(element);
        if(index > 0){
            prev = elements.get(index -1);
        }
        return prev;
    }
    public static Element nextByName(Element element){
        Element prev = null;
        List elements = DomUtil.elements(top(element), element.getName());
        int index = elements.indexOf(element);
        if(index < elements.size()-1 && index > 0){
            prev = elements.get(index + 1);
        }
        return prev;
    }
    public static Element nextByName(Element parent, Element element){
        Element prev = null;
        List elements = DomUtil.elements(parent, element.getName());
        int index = elements.indexOf(element);
        if(index < elements.size()-1 && index > 0){
            prev = elements.get(index + 1);
        }
        return prev;
    }
    public static Element top(Element element){
        Element top = element.getParent();
        while (null != top.getParent()){
            top = top.getParent();
        }
        return top;
    }
    /**
     * 前一个节点
     * @param element element
     * @return element
     */
    public static Element prev(Element element){
        Element prev = null;
        List elements = element.getParent().elements();
        int index = elements.indexOf(element);
        if(index>0){
            prev = elements.get(index-1);
        }
        return prev;
    }
    public static String prevName(Element element){
        Element prev = prev(element);
        if(null != prev){
            return prev.getName();
        }else{
            return "";
        }
    }
    public static Element last(Element element){
        Element last = null;
        List elements = element.getParent().elements();
        if(elements.size()>0){
            last = elements.get(elements.size()-1);
        }
        return last;
    }
    public static String lastName(Element element){
        Element last = last(element);
        if(null != last){
            return last.getName();
        }else{
            return "";
        }
    }

    /**
     * 是否有内容(表格、文本、图片)
     * @param element element
     * @return boolean
     */
    public static boolean isEmpty(Element element){
        List elements = DomUtil.elements(element, "drawing,tbl,t");
        for(Element item:elements){
            String name = item.getName();
            if(name.equalsIgnoreCase("drawing")){
                return false;
            }

            if(name.equalsIgnoreCase("tbl")){
                return false;
            }
            if(name.equalsIgnoreCase("t")){
                if(item.getTextTrim().length() > 0){
                    return false;
                }
            }
        }
        if(element.getTextTrim().length() > 0){
            return false;
        }
        return true;
    }
    private static boolean isEmpty(List elements){
        for(Element item:elements){
            String name = item.getName();
            if(name.equalsIgnoreCase("r") || name.equalsIgnoreCase("t") || name.equalsIgnoreCase("tbl")){
                return false;
            }
        }
        return true;
    }

    public static boolean hasParent(Element element, String parent){
        Element p = element.getParent();
        while(true){
            if(null == p){
                break;
            }
            if(p.getName().equalsIgnoreCase(parent)) {
                return true;
            }
            p = p.getParent();
        }
        return false;
    }

    /**
     * 获取element的上一级中第一个标签名=tag的上级
     * @param element 当前节点
     * @param tag 上级标签名 如tbl
     * @return Element
     */
    public static Element getParent(Element element, String tag){
        Element p = element.getParent();
        if(null == tag){
            return p;
        }
        while(true){
            if(null == p){
                break;
            }
            if(p.getName().equalsIgnoreCase(tag)) {
                return p;
            }
            p = p.getParent();
        }
        return null;
    }

    /**
     * src插入到ref之后
     * @param src src
     * @param ref ref
     */
    public static void after(Element src, Element ref){
        if(null == ref || null == src){
            return;
        }
        // 同级
        if(ref.getParent() == src.getParent()){
            List elements = ref.getParent().elements();
            int index = elements.indexOf(ref)+1;
            elements.remove(src);
            if(index > elements.size()-1){
                elements.add(src);
            }else {
                elements.add(index, src);
            }
        }else{
            // ref更下级
            after(src, ref.getParent());
        }

    }
    public static void after(List srcs, Element ref){
        if(null == ref || null == srcs){
            return;
        }
        int size = srcs.size();
        for(int i=size-1; i>=0; i--){
            Element src = srcs.get(i);
            // after(src, ref);
        }
        for(Element src:srcs){
            after(src, ref);
        }

    }
    /**
     * src插入到ref之前
     * @param src src
     * @param ref ref
     */
    public static void before(Element src, Element ref){
        if(null == ref || null == src){
            return;
        }
        List elements = ref.getParent().elements();
        int index = elements.indexOf(ref);
        while (!elements.contains(src)){
            src = src.getParent();
            if(null == src){
                return;
            }
        }
        elements.remove(src);
        elements.add(index, src);

    }
    /**
     * 当前节点在上级节点的下标
     * @param element element
     * @return index index
     */
    public static int index(Element element){
        int index = -1;
        List elements = element.getParent().elements();
        index = elements.indexOf(element);
        return index;
    }

    public static List splitKey(String txt){
        return splitKey(txt, "\\$\\{.*?\\}");
    }
    /**
     * 拆分关键字
     * 拆分123${key}abc成多个w:t
     * @param txt txt
     * @param regex 正则
     * @return List
     */
    public static List splitKey(String txt, String regex){
        List list = new ArrayList<>();
        try {
            List keys = RegularUtil.fetch(txt, regex);
            int size = keys.size();
            if(size>0){
                String key = keys.get(keys.size()-1);
                int index = txt.lastIndexOf(key);
                String t1 = txt.substring(0, index);
                String t2 = txt.substring(index + key.length());
                if (t2.length() > 0) {
                    list.addAll(splitKey(t2));
                }
                list.add(key);
                if (t1.length() > 0) {
                    list.addAll(splitKey(t1));
                }
                //txt = txt.substring(0, txt.length() - key.length());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }

    public static void border(Element border, Map styles){
        border(border,"top", styles);
        border(border,"right", styles);
        border(border,"bottom", styles);
        border(border,"left", styles);
        border(border,"insideH", styles);
        border(border,"insideV", styles);
        border(border,"tl2br", styles);
        border(border,"tr2bl", styles);
    }
    public static void border(Element border, String side, Map styles){
        Element item = null;
        String width = styles.get("border-"+side+"-width");
        String style = styles.get("border-"+side+"-style");
        String color = styles.get("border-"+side+"-color");
        int dxa = DocxUtil.dxa(width);
        int line = ((int)(DocxUtil.dxa2pt(dxa)*8)/4*4);
        if(BasicUtil.isNotEmpty(width)){
            item = addElement(border, side);
            item.addAttribute("w:sz", line+"");
            item.addAttribute("w:val", style);
            item.addAttribute("w:color", color);
        }
    }
    public static void padding(Element margin, Map styles){
        padding(margin,"top", styles);
        padding(margin,"start", styles);
        padding(margin,"bottom", styles);
        padding(margin,"end", styles);

    }
    public static void padding(Element margin, String side, Map styles){
        String width = styles.get("padding-"+side);
        int dxa = DocxUtil.dxa(width);
        if(BasicUtil.isNotEmpty(width)){
            Element item = addElement(margin, side);
            item.addAttribute("w:w", dxa+"");
            item.addAttribute("w:type",  "dxa");
        }
    }
    public static int fontSize(String size){
        int pt = 0;
        if(fontSizes.containsKey(size)){
            pt = fontSizes.get(size);
        }else{
            if(size.endsWith("px")){
                int px = BasicUtil.parseInt(size.replace("px",""),0);
                pt = (int)DocxUtil.px2pt(px);
            }else if(size.endsWith("pt")){
                pt = BasicUtil.parseInt(size.replace("pt",""),0);
            }
        }
        return pt;
    }
    public static void font(Element pr, Map styles){
        String fontSize = styles.get("font-size");
        if(null != fontSize){
            int pt = 0;
            if(fontSizes.containsKey(fontSize)){
                pt = fontSizes.get(fontSize);
            }else{
                if(fontSize.endsWith("px")){
                    int px = BasicUtil.parseInt(fontSize.replace("px",""),0);
                    pt = (int)DocxUtil.px2pt(px);
                }else if(fontSize.endsWith("pt")){
                    pt = BasicUtil.parseInt(fontSize.replace("pt",""),0);
                }
            }
            if(pt>0){
                // 
                addElement(pr, "sz","val", pt+"");
            }
        }
        // 加粗
        String fontWeight = styles.get("font-weight");
        if(null != fontWeight && fontWeight.length()>0){
            int weight = BasicUtil.parseInt(fontWeight,0);
            if(weight >=700){
                // 
                addElement(pr, "b","val","true");
            }
        }
        // 下划线
        String underline = styles.get("underline");
        if(null != underline){
            if(underline.equalsIgnoreCase("true") || underline.equalsIgnoreCase("single")){
                // 
                addElement(pr, "u","val","single");
            }else{
                addElement(pr, "u","val",underline);
                /*dash - a dashed line
                dashDotDotHeavy - a series of thick dash, dot, dot characters
                dashDotHeavy - a series of thick dash, dot characters
                dashedHeavy - a series of thick dashes
                dashLong - a series of long dashed characters
                dashLongHeavy - a series of thick, long, dashed characters
                dotDash - a series of dash, dot characters
                dotDotDash - a series of dash, dot, dot characters
                dotted - a series of dot characters
                dottedHeavy - a series of thick dot characters
                double - two lines
                none - no underline
                single - a single line
                thick - a single think line
                wave - a single wavy line
                wavyDouble - a pair of wavy lines
                wavyHeavy - a single thick wavy line
                words - a single line beneath all non-space characters
                */
            }
        }
        // 删除线
        String strike = styles.get("strike");
        if(null != strike){
            if(strike.equalsIgnoreCase("true")){
                // 
                addElement(pr, "dstrike","val","true");
            }else if("none".equalsIgnoreCase(strike) || "false".equalsIgnoreCase(strike)){
                addElement(pr, "dstrike","val","false");
            }
        }
        // 斜体
        String italics = styles.get("italic");
        if(null != italics){
            if(italics.equalsIgnoreCase("true")){
                // 
                addElement(pr, "i","val","true");
            }else if("none".equalsIgnoreCase(italics) || "false".equalsIgnoreCase(italics)){
                addElement(pr, "i","val","false");
            }
        }
        String fontFamily = styles.get("font-family");
        if(null != fontFamily){
            addElement(pr, "rFonts","eastAsia",fontFamily);
        }
        String fontFamilyAscii = styles.get("font-family-ascii");
        if(null != fontFamilyAscii){
            addElement(pr, "rFonts","ascii",fontFamilyAscii);
        }
        String fontFamilyEast = styles.get("font-family-east");
        if(null != fontFamilyEast){
            addElement(pr, "rFonts","eastAsia",fontFamilyEast);
        }
        fontFamilyEast = styles.get("font-family-eastAsia");
        if(null != fontFamilyEast){
            addElement(pr, "rFonts","eastAsia",fontFamilyEast);
        }
        String fontFamilyhAnsi = styles.get("font-family-height");
        if(null != fontFamilyhAnsi){
            addElement(pr, "rFonts","hAnsi",fontFamilyhAnsi);
        }
        fontFamilyhAnsi = styles.get("font-family-hAnsi");
        if(null != fontFamilyhAnsi){
            addElement(pr, "rFonts","hAnsi",fontFamilyhAnsi);
        }
        String fontFamilyComplex = styles.get("font-family-complex");
        if(null != fontFamilyComplex){
            addElement(pr, "rFonts","cs",fontFamilyComplex);
        }
        fontFamilyComplex = styles.get("font-family-cs");
        if(null != fontFamilyComplex){
            addElement(pr, "rFonts","cs",fontFamilyComplex);
        }

        String fontFamilyHint = styles.get("font-family-hint");
        if(null != fontFamilyHint){
            addElement(pr, "rFonts","hint",fontFamilyHint);
        }
        // 
    }

    public static void background(Element pr,Map styles){
        String color = styles.get("background-color");
        if(null != color){
            // 
            DocxUtil.addElement(pr, "shd", "color","auto");
            DocxUtil.addElement(pr, "shd", "val","clear");
            DocxUtil.addElement(pr, "shd", "fill",color.replace("#",""));
        }
    }

    /**
     * 添加element及属性
     * @param parent parent
     * @param tag element tag
     * @param key attribute key
     * @param value attribute value
     * @return Element
     */
    public static Element addElement(Element parent, String tag, String key, String value){
        Element element = DocxUtil.addElement(parent,tag);
        addAttribute(element, key, value);
        return element;
    }

    /**
     * 添加属性值,如果属性已存在 先删除原属性
     * @param element Element
     * @param key 属性key
     * @param value 属性值
     */
    public static void addAttribute(Element element, String key, String value){
        Attribute attribute = element.attribute(key);
        if(null == attribute){
            attribute = element.attribute("w:"+key);
        }
        if(null != attribute){
            element.remove(attribute);
        }
        element.addAttribute("w:"+key, value);
    }
    public static Element addElement(Element parent, String tag){
        Element element = parent.element(tag);
        if(null == element){
            element = parent.addElement("w:"+tag);
        }
        return element;
    }

    public static Element next(Element parent, Element child){
        Element next = null;
        while(child.getParent() != parent){
            child = child.getParent();
            if(null == child){
                break;
            }
        }
        if(null != child){
            List elements = parent.elements();
            int index = elements.indexOf(child);
            if(index != -1){
                index ++;
                if(index >0 && index  elements = parent.elements();
            int index = elements.indexOf(child);
            if(index != -1){
                index --;
                if(index >0 && index  nodes = element.nodeIterator();
        while (nodes.hasNext()) {
            Node node = nodes.next();
            int type = node.getNodeType();
            if(type == 3){
                text += node.getText().trim();
            }else{
                text += text((Element)node);
            }
        }
        return text.trim();
    }
    public static boolean isBlock(String text){
        if(null != text){
            List styles = RegularUtil.cuts(text,true,"","");
            for(String style:styles){
                text = text.replace(style,"");
            }
            text = text.trim();
            if(text.startsWith(" betweens(Element bookmark, String ... tags){
        String id = bookmark.attributeValue("id");
        Element end = null;
        List ends = bookmark.getParent().elements("bookmarkEnd");
        for(Element item:ends){
            if(id.equals(item.attributeValue("id"))){
                end = item;
                break;
            }
        }
        return DomUtil.betweens(bookmark, end, tags);
    }
    public static Element bookmark(Element parent, String name){
        Element start = DomUtil.element(parent, "bookmarkStart", "name", name);
        return start;
    }


    public static Element pr(Element element, String styles){
        return pr(element, StyleParser.parse(styles));
    }
    public static Element pr(Element element, Map styles){
        if(null == styles){
            styles = new HashMap();
        }
        String name = element.getName();
        String prName = name+"Pr";
        Element pr = DocxUtil.addElement(element, prName);
        //pr需要放在第一个位置 否则样式对后面的内容可能无效
        List elements = element.elements();
        if(elements.size() > 1){
            elements.remove(pr);
            elements.add(0, pr);
        }
        if("p".equalsIgnoreCase(name)){
            for(String sk: styles.keySet()){
                String sv = styles.get(sk);
                if(BasicUtil.isEmpty(sv)){
                    continue;
                }
                if(sk.equalsIgnoreCase("list-style-type")){
                    DocxUtil.addElement(pr, "pStyle", "val",sv);
                }else if(sk.equalsIgnoreCase("list-lvl")){
                    Element numPr = DocxUtil.addElement(pr,"numPr");
                    DocxUtil.addElement(numPr, "ilvl", "val",sv+"");
                }else if(sk.equalsIgnoreCase("numFmt")){
                    Element numPr = DocxUtil.addElement(pr,"numPr");
                    DocxUtil.addElement(numPr, "numFmt", "val",sv+"");
                }else if ("text-align".equalsIgnoreCase(sk)) {
                    DocxUtil.addElement(pr, "jc","val", sv);
                }else if(sk.equalsIgnoreCase("margin-left")){
                    DocxUtil.addElement(pr, "ind", "left",DocxUtil.dxa(sv)+"");
                }else if(sk.equalsIgnoreCase("margin-right")){
                    DocxUtil.addElement(pr, "ind", "right",DocxUtil.dxa(sv)+"");
                }else if(sk.equalsIgnoreCase("margin-top")){
                    DocxUtil.addElement(pr, "spacing", "before",DocxUtil.dxa(sv)+"");
                }else if(sk.equalsIgnoreCase("margin-bottom")){
                    DocxUtil.addElement(pr, "spacing", "after",DocxUtil.dxa(sv)+"");
                }else if(sk.equalsIgnoreCase("padding-left")){
                    DocxUtil.addElement(pr, "ind", "left",DocxUtil.dxa(sv)+"");
                }else if(sk.equalsIgnoreCase("padding-right")){
                    DocxUtil.addElement(pr, "ind", "right",DocxUtil.dxa(sv)+"");
                }else if(sk.equalsIgnoreCase("padding-top")){
                    DocxUtil.addElement(pr, "spacing", "before",DocxUtil.dxa(sv)+"");
                }else if(sk.equalsIgnoreCase("padding-bottom")){
                    DocxUtil.addElement(pr, "spacing", "after",DocxUtil.dxa(sv)+"");
                }else if(sk.equalsIgnoreCase("text-indent")){
                    DocxUtil.addElement(pr, "ind", "firstLine",DocxUtil.dxa(sv)+"");
                }else if(sk.equalsIgnoreCase("line-height")){
                    DocxUtil.addElement(pr, "spacing", "line",DocxUtil.dxa(sv)+"");
                }
            }
            if(styles.containsKey("list-style-num")){
                // 如果在样式里指定了样式
                Element numPr = DocxUtil.addElement(pr,"numPr");
                DocxUtil.addElement(numPr, "numId", "val",styles.get("list-style-num"));
            }else if(styles.containsKey("list-num")){
                // 运行时自动生成
                Element numPr = DocxUtil.addElement(pr,"numPr");
                DocxUtil.addElement(numPr, "numId", "val",styles.get("list-num"));
            }

            // 
if(styles.containsKey("page-size-orient")){ String orient = styles.get("page-size-orient"); if(!"landscape".equalsIgnoreCase(orient)){ orient = "portrait"; } setOrient(pr, orient, styles); } Element border = DocxUtil.addElement(pr, "bdr"); DocxUtil.border(border, styles); // DocxUtil.background(pr, styles); }else if("r".equalsIgnoreCase(name)){ for (String sk : styles.keySet()) { String sv = styles.get(sk); if(BasicUtil.isEmpty(sv)){ continue; } if(sk.equalsIgnoreCase("color")){ addElement(pr, "color", "val", sv.replace("#","")); }else if(sk.equalsIgnoreCase("background-color")){ // DocxUtil.addElement(pr, "highlight", "val",sv.replace("#","")); }else if(sk.equalsIgnoreCase("vertical-align")){ DocxUtil.addElement(pr,"vertAlign", "val", sv ); } } Element border = DocxUtil.addElement(pr, "bdr"); DocxUtil.border(border, styles); DocxUtil.font(pr, styles); }else if("tbl".equalsIgnoreCase(name)){ // DocxUtil.addElement(pr,"tblCellSpacing","w","0"); // DocxUtil.addElement(pr,"tblCellSpacing","type","nil"); Element mar = DocxUtil.addElement(pr,"tblCellMar"); /*DocxUtil.addElement(mar,"top","w","0"); DocxUtil.addElement(mar,"top","type","dxa"); DocxUtil.addElement(mar,"bottom","w","0"); DocxUtil.addElement(mar,"bottom","type","dxa"); DocxUtil.addElement(mar,"right","w","0"); // 新版本end DocxUtil.addElement(mar,"right","type","dxa"); DocxUtil.addElement(mar,"end","w","0"); DocxUtil.addElement(mar,"end","type","dxa"); DocxUtil.addElement(mar,"left","w","0");//新版本用start,但07版本用start会报错 DocxUtil.addElement(mar,"left","type","dxa");*/ for (String sk : styles.keySet()) { String sv = styles.get(sk); if(BasicUtil.isEmpty(sv)){ continue; } if(sk.equalsIgnoreCase("width")){ DocxUtil.addElement(pr,"tblW","w", DocxUtil.dxa(sv)+""); DocxUtil.addElement(pr,"tblW","type", DocxUtil.widthType(sv)); }else if(sk.equalsIgnoreCase("color")){ }else if(sk.equalsIgnoreCase("margin-left")){ DocxUtil.addElement(pr,"tblInd","w",DocxUtil.dxa(sv)+""); DocxUtil.addElement(pr,"tblInd","type","dxa"); }else if(sk.equalsIgnoreCase("padding-left")){ DocxUtil.addElement(mar,"left","w",DocxUtil.dxa(sv)+""); // 新版本用start,但07版本用start会报错 DocxUtil.addElement(mar,"left","type","dxa"); }else if(sk.equalsIgnoreCase("padding-right")){ DocxUtil.addElement(mar,"right","w",DocxUtil.dxa(sv)+""); // 新版本用end DocxUtil.addElement(mar,"right","type","dxa"); DocxUtil.addElement(mar,"end","w",DocxUtil.dxa(sv)+""); DocxUtil.addElement(mar,"end","type","dxa"); }else if(sk.equalsIgnoreCase("padding-top")){ DocxUtil.addElement(mar,"top","w",DocxUtil.dxa(sv)+""); DocxUtil.addElement(mar,"top","type","dxa"); }else if(sk.equalsIgnoreCase("padding-bottom")){ DocxUtil.addElement(mar,"bottom","w",DocxUtil.dxa(sv)+""); DocxUtil.addElement(mar,"bottom","type","dxa"); } } Element border = DocxUtil.addElement(pr,"tblBorders"); DocxUtil.border(border, styles); DocxUtil.background(pr, styles); }else if("tr".equalsIgnoreCase(name)){ for(String sk:styles.keySet()){ String sv = styles.get(sk); if(BasicUtil.isEmpty(sv)){ continue; } if("repeat-header".equalsIgnoreCase(sk)){ DocxUtil.addElement(pr,"tblHeader","val","true"); }else if("min-height".equalsIgnoreCase(sk)){ DocxUtil.addElement(pr,"trHeight","hRule","atLeast"); DocxUtil.addElement(pr,"trHeight","val",(int)DocxUtil.dxa2pt(DocxUtil.dxa(sv))*20+""); }else if("height".equalsIgnoreCase(sk)){ DocxUtil.addElement(pr,"trHeight","hRule","exact"); DocxUtil.addElement(pr,"trHeight","val",(int)DocxUtil.dxa2pt(DocxUtil.dxa(sv))*20+""); } } }else if("tc".equalsIgnoreCase(name)){ for(String sk:styles.keySet()){ String sv = styles.get(sk); if(BasicUtil.isEmpty(sv)){ continue; } Element mar = DocxUtil.addElement(pr,"tcMar"); /*DocxUtil.addElement(mar,"top","w","0"); DocxUtil.addElement(mar,"top","type","dxa"); DocxUtil.addElement(mar,"bottom","w","0"); DocxUtil.addElement(mar,"bottom","type","dxa"); DocxUtil.addElement(mar,"right","w","0"); // 新版本end DocxUtil.addElement(mar,"right","type","dxa"); DocxUtil.addElement(mar,"end","w","0"); DocxUtil.addElement(mar,"end","type","dxa"); DocxUtil.addElement(mar,"left","w","0");//新版本用start,但07版本用start会报错 DocxUtil.addElement(mar,"left","type","dxa");*/ if("vertical-align".equalsIgnoreCase(sk)){ DocxUtil.addElement(pr,"vAlign", "val", sv ); }else if("text-align".equalsIgnoreCase(sk)){ DocxUtil.addElement(pr, "jc","val", sv); }else if(sk.equalsIgnoreCase("white-space")){ DocxUtil.addElement(pr,"noWrap"); }else if(sk.equalsIgnoreCase("width")){ DocxUtil.addElement(pr,"tcW","w",DocxUtil.dxa(sv)+""); DocxUtil.addElement(pr,"tcW","type",DocxUtil.widthType(sv)); }else if(sk.equalsIgnoreCase("padding-left")){ DocxUtil.addElement(mar,"left","w",DocxUtil.dxa(sv)+""); // 新版本用start,但07版本用start会报错 DocxUtil.addElement(mar,"left","type","dxa"); }else if(sk.equalsIgnoreCase("padding-right")){ DocxUtil.addElement(mar,"right","w",DocxUtil.dxa(sv)+""); // 新版本用end DocxUtil.addElement(mar,"right","type","dxa"); DocxUtil.addElement(mar,"end","w",DocxUtil.dxa(sv)+""); DocxUtil.addElement(mar,"end","type","dxa"); }else if(sk.equalsIgnoreCase("padding-top")){ DocxUtil.addElement(mar,"top","w",DocxUtil.dxa(sv)+""); DocxUtil.addElement(mar,"top","type","dxa"); }else if(sk.equalsIgnoreCase("padding-bottom")){ DocxUtil.addElement(mar,"bottom","w",DocxUtil.dxa(sv)+""); DocxUtil.addElement(mar,"bottom","type","dxa"); } } // Element padding = DocxUtil.addElement(pr,"tcMar"); DocxUtil.padding(padding, styles); Element border = DocxUtil.addElement(pr,"tcBorders"); DocxUtil.border(border, styles); DocxUtil.background(pr, styles); } if(pr.elements().size()==0){ element.remove(pr); } return pr; } // 插入排版方向 public static void setOrient(Element pr, String orient, Map styles){ String w = styles.get("page-size-w"); String h = styles.get("page-size-h"); String top = styles.get("page-margin-top"); String right = styles.get("page-margin-right"); String bottom = styles.get("page-margin-bottom"); String left = styles.get("page-margin-left"); String header = styles.get("page-margin-left"); String footer = styles.get("page-margin-left"); header = BasicUtil.evl(header, "851").toString(); footer = BasicUtil.evl(footer, "992").toString(); if("portrait".equalsIgnoreCase(orient)){ // 竖板 w = BasicUtil.evl(w, "11906").toString(); h = BasicUtil.evl(h, "16838").toString(); top = BasicUtil.evl(top, "1440").toString(); right = BasicUtil.evl(right, "1134").toString(); bottom = BasicUtil.evl(bottom, "1440").toString(); left = BasicUtil.evl(left, "1531").toString(); }else { // 横板 // // w = BasicUtil.evl(w, "16838").toString(); h = BasicUtil.evl(h, "11906").toString(); top = BasicUtil.evl(top, "1531").toString(); right = BasicUtil.evl(right, "1134").toString(); bottom = BasicUtil.evl(bottom, "1440").toString(); left = BasicUtil.evl(left, "1531").toString(); } Element sectPr = DocxUtil.addElement(pr,"sectPr"); DocxUtil.addElement(sectPr,"pgSz","w", w); DocxUtil.addElement(sectPr,"pgSz","h", h); DocxUtil.addElement(sectPr,"pgSz","orient", orient); DocxUtil.addElement(sectPr,"pgMar","top", top); DocxUtil.addElement(sectPr,"pgMar","right", right); DocxUtil.addElement(sectPr,"pgMar","bottom", bottom); DocxUtil.addElement(sectPr,"pgMar","left", left); DocxUtil.addElement(sectPr,"pgMar","header", header); DocxUtil.addElement(sectPr,"pgMar","footer", footer); } public static void removeAttribute(Element element, String attribute){ Attribute att = element.attribute("w:"+attribute); if(null != att){ element.remove(att); } } public static void removeContent(Element parent){ List ts = DomUtil.elements(parent,"t"); for(Element t:ts){ t.getParent().remove(t); } List imgs = DomUtil.elements(parent,"drawing"); for(Element img:imgs){ img.getParent().remove(img); } List brs = DomUtil.elements(parent,"br"); for(Element br:brs){ br.getParent().remove(br); } } public static void removeElement(Element parent, String element){ List elements = DomUtil.elements(parent, element); for(Element item:elements){ item.getParent().remove(item); } } /** * 替换占位符 * @param src Element * @param replaces replaces */ public static void replace(Element src, Map replaces){ List ts = DomUtil.elements(src, "t"); for(Element t:ts){ String txt = t.getTextTrim(); List flags = DocxUtil.splitKey(txt); if(flags.size() == 0){ continue; } Collections.reverse(flags); Element r = t.getParent(); List elements = r.elements(); int index = elements.indexOf(t); for(int i=0; i fontSizes = new HashMap() { { put("初号", 84); put("小初", 72); put("一号", 52); put("小一", 48); put("二号", 44); put("小二", 36); put("三号", 33); put("小三", 30); put("四号", 28); put("小四", 24); put("五号", 21); put("小五", 18); put("六号", 15); put("小六", 13); put("七号", 11); put("八号", 10); } }; }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy