Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
org.anyline.office.docx.util.DocxUtil Maven / Gradle / Ivy
/*
* 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);
}
};
}