解析制度~~第一版代码

This commit is contained in:
chengli 2022-06-30 21:33:57 +08:00
parent 27a638908c
commit 413b303fd2
10 changed files with 2043 additions and 0 deletions

View File

@ -22,4 +22,19 @@ public class DataMigrationController {
public String ITAttributeImport(UserContext uc, String wsId,String groupValue,String fileValue,String fileName){
return new DataMigrationWeb(uc).ITAttributeImport(wsId,groupValue,fileValue,fileName);
}
/**
* by bzp 制度文件上传之后 解析文件
* @param me
* @param wsId
* @param groupValue
* @param fileValue
* @param fileName
* @return
*/
@Mapping("com.actionsoft.apps.coe.pal.systemImport_process_attribute_import")
public String processattributeimport(UserContext me,String wsId,String groupValue,String fileValue,String fileName){
new ReadWordUtil().translateDocTDocx(me,wsId,groupValue,fileValue,fileName);
ResponseObject ro = ResponseObject.newOkResponse();
return ro.toString();
}
}

View File

@ -0,0 +1,16 @@
package com.actionsoft.apps.coe.pal.datamigration.util.readword;
public class Constant {
public final static String APP_ID = "com.actionsoft.apps.coe.pal.datamigration";
public final static String UPFILE = "migration";
public final static String WORDIMPORT = "[{\"title\":\"文控信息\",\"type\":\"DirectFeild\"},{\"title\":\"修订记录\",\"type\":\"VerticalFeild\"},{\"title\":\"术语\",\"type\":\"Table\"},{\"title\":\"组织/角色与职责\",\"type\":\"Table\"},{\"title\":\"相关文件\",\"type\":\"File\"},{\"title\":\"支持文件\",\"type\":\"File\"}]";
//public final static String NAMETOID = "[{\"title\":\"目的\",\"type\":\"goal\"},{\"title\":\"拟制/修订人\",\"type\":\"reviser\"},{\"title\":\"拟制/修订日期\",\"type\":\"reviseddate\"},{\"title\":\"审核人\",\"type\":\"auditor\"},{\"title\":\"复核人\",\"type\":\"reviewer\"},{\"title\":\"审批人\",\"type\":\"approver\"},{\"title\":\"术语\",\"type\":\"term\"},{\"title\":\"术语定义\",\"type\":\"definition\"},{\"title\":\"组织/角色名称\",\"type\":\"Character\"},{\"title\":\"组织/角色职责\",\"type\":\"responsibilities\"},{\"title\":\"相关文件\",\"type\":\"relevant\"},{\"title\":\"支持文件\",\"type\":\"support\"},{\"title\":\"相关知识\",\"type\":\"related\"},{\"title\":\"附则\",\"type\":\"supplementary\"}]";
public final static String NAMETOID = "[{\"title\":\"目的\",\"type\":\"Purpose\"},{\"title\":\"拟制/修订人\",\"type\":\"Drafted_and_revised_by\"},{\"title\":\"拟制/修订日期\",\"type\":\"Drafted_and_revised_date\"},{\"title\":\"审核人\",\"type\":\"auditor\"},{\"title\":\"复核人\",\"type\":\"reviewer\"},{\"title\":\"审批人\",\"type\":\"approver\"},{\"title\":\"术语\",\"type\":\"term\"},{\"title\":\"组织/角色名称\",\"type\":\"Organization_role_name\"},{\"title\":\"组织/角色职责\",\"type\":\"Organization_and_role_responsibilities\"},{\"title\":\"相关文件\",\"type\":\"relevant_flies\"},{\"title\":\"支持文件\",\"type\":\"support_files\"},{\"title\":\"相关知识\",\"type\":\"relevant_flies\"},{\"title\":\"附则\",\"type\":\"T_supplementary_articles\"}]";
// 构造连线时的几个固定参数
public final static double ANGLE_RIGHT = 0;
public final static double ANGLE_DOWN = 1.5707963267948968;
public final static double ANGLE_LEFT = 3.141592653589793;
public final static double ANGLE_UP = 4.71238898038469;
}

View File

@ -0,0 +1,301 @@
package com.actionsoft.apps.coe.pal.datamigration.util.readword;
import com.actionsoft.apps.coe.pal.pal.repository.cache.PALRepositoryCache;
import com.actionsoft.apps.coe.pal.pal.repository.dao.CoeProcessLevelDaoFacotory;
import com.actionsoft.apps.coe.pal.pal.repository.dao.PALRepository;
import com.actionsoft.apps.coe.pal.pal.repository.designer.manage.CoeDesignerAPIManager;
import com.actionsoft.apps.coe.pal.pal.repository.designer.model.BaseModel;
import com.actionsoft.apps.coe.pal.pal.repository.designer.util.CoeDesignerUtil;
import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel;
import com.actionsoft.apps.coe.pal.pal.repository.model.impl.PALRepositoryModelImpl;
import com.actionsoft.apps.coe.pal.pal.repository.util.CoeProcessLevelUtil;
import com.actionsoft.apps.resource.plugin.profile.DCPluginProfile;
import com.actionsoft.bpms.commons.database.RowMap;
import com.actionsoft.bpms.schedule.IJob;
import com.actionsoft.bpms.server.UserContext;
import com.actionsoft.bpms.server.fs.DCContext;
import com.actionsoft.bpms.server.fs.dc.DCProfileManager;
import com.actionsoft.bpms.util.DBSql;
import com.actionsoft.bpms.util.UUIDGener;
import com.actionsoft.sdk.local.SDK;
import com.alibaba.fastjson.JSONObject;
import lombok.SneakyThrows;
import org.apache.commons.lang.StringUtils;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.io.InputStream;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class CreateMaps implements IJob {
/**
* 定时从
*
* @param jobExecutionContext
* @throws JobExecutionException
*/
@SneakyThrows
@Override
public void execute(JobExecutionContext jobExecutionContext) {
/*Map<String, String> idRelationMap = new HashMap<>();
//先执行新建操作产生plid
PALRepository coeProcessLevel = CoeProcessLevelDaoFacotory.createCoeProcessLevel();
String plRid = UUIDGener.getUUID();
String id = UUIDGener.getUUID();
String parentId = "org";
String parentVersionId = "";
int level = 1;
if (parentId.length() < 36) {// 父节点是大类
parentVersionId = parentId;
} else {
PALRepositoryModel parentModel = PALRepositoryCache.getCache().get(parentId);
parentVersionId = parentModel.getVersionId();
level = parentModel.getLevel() + 1;
}
Timestamp nowTime = new Timestamp(System.currentTimeMillis());
PALRepositoryModelImpl model = CoeProcessLevelUtil.createPALRepositoryModel(id, plRid, "f71ba89d-a594-4144-b89b-25324d67f310", "伊利集团",
"", 1, "control", "control", true, 1,
id, false, "control.policy", "0", 1, null,
null, "admin", "admin", nowTime, null, null,
null, null, null, null, null, null, null, 1);
System.out.println(model.getId());
coeProcessLevel.insert(model);
BaseModel defineModel = CoeDesignerAPIManager.getInstance().getDefinition(model.getId(), 0);
if (defineModel == null) {
defineModel = CoeDesignerUtil.createModel(model.getId(), 0);
defineModel.setCreateHistory(false);
}
String define = defineModel.getDefinition();
JSONObject definition = JSONObject.parseObject(define);
JSONObject elements = definition.getJSONObject("elements");
//新建一个uuid
String shapeId = UUIDGener.getObjectId();
//拿到基础结构
//JSONObject shape = ShapeUtil.getProcessShapeDefinitionByName("org.normal", "position");
if (StringUtils.isNotEmpty(definition.getString("commonShapeConfig"))) {
definition.remove("commonShapeConfig");
}
List<RowMap> orgdepartmentList = DBSql.getMaps("select * from ORGUSER ");
int zindex = 1;
*//*
if(orgdepartmentList.size()>0){
for(int i=0;i<orgdepartmentList.size();i++){
//新建一个uuid
String shapeId1 = UUIDGener.getObjectId();
//拿到基础结构
JSONObject shape1 = ShapeUtil.getProcessShapeDefinitionByName("org.normal", "position");
String postionname=orgdepartmentList.get(i).getString("POSITION_NAME");
if(StringUtil.isNotEmpty(postionname)){
shape1.put("id", shapeId1);
shape1.put("text",orgdepartmentList.get(i).getString("POSITION_NAME"));
JSONObject props1 = shape1.getJSONObject("props");// 位置大小
props1.put("x", 100*zindex);
props1.put("y", 277);
props1.put("w", 110);
props1.put("h", 50);
props1.put("zindex", zindex++);
elements.put(shapeId1, shape1);
}
}
}*//*
//elements = new WordUtilXWPF().importWordLibrary(elements);
String filePath = "/Users/jiuyabai/Desktop/yili项目/制度样例1—伊利集团流程制度类文件管理规范1.docx";
File file = new File(filePath);
InputStream inputStream = new FileInputStream(file);
elements = new WordUtilXWPF().rewritContent(elements, inputStream);
// 设置画布大小
setDiagramHeightWidth(definition, elements);
defineModel.setDefinition(definition.toString());
// 保存文件
CoeDesignerAPIManager.getInstance().storeDefinition(defineModel);// dao操作*/
//String filePath = "/Users/jiuyabai/Desktop/yili项目/制度样例1—伊利集团流程制度类文件管理规范1.docx";
/*String filePath = "/Users/jiuyabai/Desktop/yili项目/new.docx";
System.out.println("");
File file = null;
try {
file = new File(filePath);
String plRid = UUIDGener.getUUID();
String id = UUIDGener.getUUID();
FileInputStream fileInputStream = new FileInputStream(filePath);
creatMap("解析文件", fileInputStream,plRid,id);
//上传附件
FileInputStream fileInputStream1 = new FileInputStream(filePath);
new WordFinal().copyWord(UserContext.fromUID("admin"), id, fileInputStream1,plRid);
} catch (Exception e) {
e.printStackTrace();
}*/
String id = "f71ba89d-a594-4144-b89b-25324d67f310";
String name = "制度样例1—伊利集团流程制度类文件管理规范(2)";
DCPluginProfile dcProfilepdf = DCProfileManager.getDCProfile("com.actionsoft.apps.coe.pal.datamigration", "migration");
DCContext dcContextpdf = new DCContext(UserContext.fromUID("admin"), dcProfilepdf, "com.actionsoft.apps.coe.pal.datamigration", "yili", "SystemType1656565751273", "制度样例1—伊利集团流程制度类文件管理规范(2).doc");
InputStream docfile = SDK.getDCAPI().read(dcContextpdf);
//InputStream docfile = new FileInputStream(new File("/Users/jiuyabai/Desktop/yili项目/制度样例1—伊利集团流程制度类文件管理规范(2).doc"));
ReadWordUtil tmp = new ReadWordUtil();
tmp.writeAttrbute(null,docfile, name, id);
DCContext dcContextpdf1 = new DCContext(UserContext.fromUID("admin"), dcProfilepdf, "com.actionsoft.apps.coe.pal.datamigration", "yili", "SystemType1656565751273", "制度样例1—伊利集团流程制度类文件管理规范(2).docx");
InputStream docxfile = SDK.getDCAPI().read(dcContextpdf1);
//InputStream docxfile = new FileInputStream(new File("/Users/jiuyabai/Desktop/yili项目/制度样例1—伊利集团流程制度类文件管理规范(2).docx"));
new CreateMaps().updateMaps(id, docxfile, name);
}
/**
* 创建制度图
*
* @param name
* @param inputStream
*/
public void creatMap(String name, InputStream inputStream, String plRid, String id) {
Map<String, String> idRelationMap = new HashMap<>();
//先执行新建操作产生plid
PALRepository coeProcessLevel = CoeProcessLevelDaoFacotory.createCoeProcessLevel();
String parentId = "org";
String parentVersionId = "";
int level = 1;
if (parentId.length() < 36) {// 父节点是大类
parentVersionId = parentId;
} else {
PALRepositoryModel parentModel = PALRepositoryCache.getCache().get(parentId);
parentVersionId = parentModel.getVersionId();
level = parentModel.getLevel() + 1;
}
Timestamp nowTime = new Timestamp(System.currentTimeMillis());
PALRepositoryModelImpl model = CoeProcessLevelUtil.createPALRepositoryModel(id, plRid, "f71ba89d-a594-4144-b89b-25324d67f310", name,
"", 1, "control", "control", true, 1,
id, false, "control.policy", "0", 1, null,
null, "admin", "admin", nowTime, null, null,
null, null, null, null, null, null, null, 1);
System.out.println(model.getId());
coeProcessLevel.insert(model);
BaseModel defineModel = CoeDesignerAPIManager.getInstance().getDefinition(model.getId(), 0);
if (defineModel == null) {
defineModel = CoeDesignerUtil.createModel(model.getId(), 0);
defineModel.setCreateHistory(false);
}
String define = defineModel.getDefinition();
JSONObject definition = JSONObject.parseObject(define);
JSONObject elements = definition.getJSONObject("elements");
String shapeId = UUIDGener.getObjectId();
if (StringUtils.isNotEmpty(definition.getString("commonShapeConfig"))) {
definition.remove("commonShapeConfig");
}
List<RowMap> orgdepartmentList = DBSql.getMaps("select * from ORGUSER ");
int zindex = 1;
elements = new WordUtilXWPF().rewritContent(elements, inputStream, "制度名称");
// 设置画布大小
setDiagramHeightWidth(definition, elements);
defineModel.setDefinition(definition.toString());
// 保存文件
CoeDesignerAPIManager.getInstance().storeDefinition(defineModel);// dao操作
}
public void updateMaps(String id, InputStream file, String name) {
PALRepositoryModel palRepositoryModel = ReadWordUtil.getRepositoryByName(id, name);
BaseModel defineModel = CoeDesignerAPIManager.getInstance().getDefinition(palRepositoryModel.getId(), 0);
if (defineModel == null) {
defineModel = CoeDesignerUtil.createModel(palRepositoryModel.getId(), 0);
defineModel.setCreateHistory(false);
}
String define = defineModel.getDefinition();
JSONObject definition = JSONObject.parseObject(define);
JSONObject elements = definition.getJSONObject("elements");
String shapeId = UUIDGener.getObjectId();
if (StringUtils.isNotEmpty(definition.getString("commonShapeConfig"))) {
definition.remove("commonShapeConfig");
}
List<RowMap> orgdepartmentList = DBSql.getMaps("select * from ORGUSER ");
int zindex = 1;
elements = new WordUtilXWPF().rewritContent(elements, file, name);
// 设置画布大小
setDiagramHeightWidth(definition, elements);
defineModel.setDefinition(definition.toString());
// 保存文件
CoeDesignerAPIManager.getInstance().storeDefinition(defineModel);// dao操作
}
/**
* 设置画布大小
*
* @param elements
*/
private void setDiagramHeightWidth(JSONObject definition, JSONObject elements) {
// 获取最大宽高给100长度富余
JSONObject maxHW = getMaxPositionXY(elements);
int maxX = maxHW.getInteger("maxX") + 400;
int maxH = maxHW.getInteger("maxY") + 150;
JSONObject page = definition.getJSONObject("page");
int pageW = page.getInteger("width");
int pageH = page.getInteger("height");
page.put("width", pageW > maxX ? pageW : maxX);
page.put("height", pageH > maxH ? pageH : maxH);
definition.put("page", page);
}
private JSONObject getMaxPositionXY(JSONObject elements) {
int maxX = -99999;
int maxY = -99999;
Iterator<String> it = elements.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
JSONObject shape = elements.getJSONObject(key);
String shapeName = shape.getString("name");
if (!"linker".equals(shapeName)) {
JSONObject props = shape.getJSONObject("props");
if (props == null || props.get("x") == null) {
continue;
}
int x = props.getInteger("x");
int y = props.getInteger("y");
maxX = maxX < x ? x : maxX;
maxY = maxY < y ? y : maxY;
}
}
JSONObject result = new JSONObject();
result.put("maxX", maxX);
result.put("maxY", maxY);
return result;
}
}

View File

@ -0,0 +1,241 @@
package com.actionsoft.apps.coe.pal.datamigration.util.readword;
import com.actionsoft.apps.coe.pal.datamigration.model.po.WordAttribute;
import com.actionsoft.apps.coe.pal.datamigration.model.po.WordField;
import com.alibaba.fastjson.JSON;
import org.apache.poi.xwpf.usermodel.*;
import java.io.*;
import java.util.*;
/**
* @author baizp
* @Description:
* @date 2022/6/30 16:00
*/
public class ReadDocxTable {
//相关文件存文件名称
private String version = "";
private String fileName = "";
public static Map<String, WordAttribute> wordAttributeMap = new HashMap<>();
public static Map<String, String> nameToIdMap = new HashMap<>();
public Map<String, String> fieldMap = new HashMap<>();
//表格字段
public Map<String, List<List<String>>> tableMap = new HashMap<>();
//文档字段
public Map<String, List<String>> fileMap = new HashMap<>();
public Map<String, WordField<Object>> fileFieldMap = new HashMap<>();
static {
List<WordAttribute> wordAttributes = JSON.parseArray(Constant.WORDIMPORT, WordAttribute.class);
List<WordAttribute> nameToId = JSON.parseArray(Constant.NAMETOID, WordAttribute.class);
wordAttributes.forEach(wordAttribute -> {
wordAttributeMap.put(wordAttribute.getTitle(), wordAttribute);
});
nameToId.forEach(wordAttribute -> {
nameToIdMap.put(wordAttribute.getTitle(), wordAttribute.getType());
});
}
public static void main(String[] args) throws IOException {
InputStream docfile = new FileInputStream(new File("/Users/jiuyabai/Desktop/yili项目/制度样例1—伊利集团流程制度类文件管理规范(2).docx"));
new ReadDocxTable().analysisDocxTable(docfile);
}
public boolean analysisDocxTable(InputStream file) throws IOException {
XWPFDocument doc = new XWPFDocument(file);
Iterator<IBodyElement> iter = doc.getBodyElementsIterator();
List<IBodyElement> listIbody = doc.getBodyElements();
String lastStr = "";
for(int i=0;i < listIbody.size();i++){
IBodyElement element = listIbody.get(i);
if (element instanceof XWPFParagraph) {
XWPFParagraph paragraph = (XWPFParagraph) element;
String text = paragraph.getText();
if(!text.isEmpty()){
lastStr = paragraph.getParagraphText();
}
if("目的".equals(text.trim())){
int index = i + 1 > listIbody.size() ? i : i + 1;
XWPFParagraph paragraph1 = (XWPFParagraph)listIbody.get(index);
fieldMap.put("目的", paragraph1.getParagraphText());
fileFieldMap.put("目的", new WordField<>(paragraph1.getParagraphText()));
continue;
}
if ("附则".equals(text.trim())) {
int index = i + 1 > listIbody.size() ? i : i + 1;
XWPFParagraph paragraph1 = (XWPFParagraph)listIbody.get(index);
fieldMap.put("目的", paragraph1.getParagraphText());
fileFieldMap.put("目的", new WordField<>(paragraph1.getParagraphText()));
continue;
}
continue;
}
if(element instanceof XWPFTable){
XWPFTable nowtable = (XWPFTable) element;
WordAttribute wordAttribute = wordAttributeMap.get(lastStr.trim());
if(wordAttribute == null){
continue;
}
if (wordAttribute.getType().equals("DirectFeild")) {
Map<String, String> tabelDocText = this.getHorizontalTableMapText(nowtable,nameToIdMap);
//在基本信息中特殊获取文件名称和版本号
if (lastStr.trim().equals("文控信息")) {
tabelDocText.keySet().forEach(key -> {
if (key.replaceAll(" ", "").equals("版本")) {
String strings = tabelDocText.get(key);
if (!strings.isEmpty()) {
version = strings;
}
}
/* if (key.equals("文件名称")) {
List<String> strings = tabelDocText.get(key);
if (!strings.isEmpty()) {
fileName = strings.get(0);
}
}*/
});
}
tabelDocText.keySet().forEach(key -> {
String strings = tabelDocText.get(key);
if (!strings.isEmpty()) {
fieldMap.put(key, strings);
fileFieldMap.put(key, new WordField<>(strings));
}
});
continue;
}
//修订信息
if (wordAttribute.getType().equals("VerticalFeild")) {
Map<String, List<String>> verticalTableText = this.getVerticalTableText(nowtable,nameToIdMap);
if (lastStr.trim().equals("修订记录")) {
List<String> strings = verticalTableText.get("版本");
int subIndex = 0;
for (int j = 0; j < strings.size(); j++) {
String s = strings.get(j);
if (s.equals(version)) {
subIndex = j;
}
}
for (String key : verticalTableText.keySet()) {
List<String> values = verticalTableText.get(key);
fieldMap.put(key, values.get(subIndex));
fileFieldMap.put(key, new WordField<>(values.get(subIndex)));
}
} else {
}
continue;
}
//术语
if (wordAttribute.getType().equals("Table")) {
List<List<String>> horizontalTableText = this.getHorizontalTableText(nowtable,nameToIdMap);
tableMap.put(wordAttribute.getTitle(), horizontalTableText);
fileFieldMap.put(wordAttribute.getTitle(), new WordField<>(horizontalTableText));
continue;
}
//支持文件 相关文件
if (wordAttribute.getType().equals("File")) {
if ("相关文件,支持文件".contains(lastStr.trim())) {
//取文件名名称即可
Map<String, List<String>> verticalTableText = this.getVerticalTableText(nowtable,nameToIdMap);
List<String> strings = verticalTableText.get("文件");
fileMap.put(wordAttribute.getTitle(), strings);
fileFieldMap.put(wordAttribute.getTitle(), new WordField<>(strings));
}
continue;
}
}
}
return true;
}
/**
* 横着key:value
* @param xwpfTable
* @param nameToid
* @return
*/
private Map<String, String> getHorizontalTableMapText(XWPFTable xwpfTable,Map nameToid) {
Map<String, String> result = new HashMap<>(16);
for(XWPFTableRow xwpfTableRow : xwpfTable.getRows()){
List<XWPFTableCell> tableCells = xwpfTableRow.getTableCells();
int cllnum = tableCells.size();
//单元格
for(int i =0 ;i<=cllnum;i++){
XWPFTableCell xwpfTableCell = tableCells.get(i);
String text = xwpfTableCell.getText();
if(nameToid.containsKey(text)){
if(i+1 < cllnum){
XWPFTableCell xwpfTableCell1 = tableCells.get(i+1);
String text1 = xwpfTableCell.getText();
result.put(text,text1);
}
}
}
}
return result;
}
/**
*处理术语
* @param table
* @return
*/
private List<List<String>> getHorizontalTableText(XWPFTable xwpfTable,Map nameToid) {
List<List<String>> list = new ArrayList<>();
for(XWPFTableRow xwpfTableRow : xwpfTable.getRows()){
List<XWPFTableCell> tableCells = xwpfTableRow.getTableCells();
List<String> rowList = new ArrayList<>();
int cllnum = tableCells.size();
//单元格
for(int i =0 ;i<=cllnum;i++){
XWPFTableCell xwpfTableCell = tableCells.get(i);
String text = xwpfTableCell.getText();
//去除text特殊符号
if (null != text && !"".equals(text)) {
text = text.replaceAll("\\p{C}", "");
}
rowList.add(text);
}
list.add(rowList);
}
return list;
}
/**
* 处理修订记录
* @param xwpfTable
* @param nameToid
* @return
*/
private Map<String, List<String>> getVerticalTableText(XWPFTable xwpfTable,Map nameToid) {
Map<String, List<String>> result = new HashMap<>();
List<String> stringList = new ArrayList<>();
for(XWPFTableRow xwpfTableRow : xwpfTable.getRows()) {
List<XWPFTableCell> tableCells = xwpfTableRow.getTableCells();
List<String> rowList = new ArrayList<>();
int cllnum = tableCells.size();
//单元格
for (int i = 0; i <= cllnum; i++) {
XWPFTableCell xwpfTableCell = tableCells.get(i);
String text = xwpfTableCell.getText();
if (i == 0) {
//首行为标题行
result.put(text, new ArrayList<>());
stringList.add(text);
} else {
result.get(stringList.get(i)).add(text);
}
}
}
return result;
}
}

View File

@ -0,0 +1,454 @@
package com.actionsoft.apps.coe.pal.datamigration.util.readword;
import com.actionsoft.apps.coe.pal.datamigration.model.po.WordAttribute;
import com.actionsoft.apps.coe.pal.datamigration.model.po.WordField;
import com.actionsoft.apps.coe.pal.pal.repository.dao.CoeProcessLevelDaoFacotory;
import com.actionsoft.apps.coe.pal.pal.repository.model.PALRepositoryModel;
import com.actionsoft.apps.coe.pal.pal.repository.web.CoeProcessLevelWeb;
import com.actionsoft.apps.resource.plugin.profile.DCPluginProfile;
import com.actionsoft.bpms.server.UserContext;
import com.actionsoft.bpms.server.fs.DCContext;
import com.actionsoft.bpms.server.fs.dc.DCProfileManager;
import com.actionsoft.bpms.util.DBSql;
import com.actionsoft.bpms.util.UUIDGener;
import com.actionsoft.sdk.local.SDK;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.*;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
public class ReadWordUtil {
//相关文件存文件名称
private String version = "";
private String fileName = "";
public static Map<String, WordAttribute> wordAttributeMap = new HashMap<>();
public static Map<String, String> nameToIdMap = new HashMap<>();
//基础字段
public Map<String, String> fieldMap = new HashMap<>();
//表格字段
public Map<String, List<List<String>>> tableMap = new HashMap<>();
//文档字段
public Map<String, List<String>> fileMap = new HashMap<>();
public Map<String, WordField<Object>> fileFieldMap = new HashMap<>();
static {
List<WordAttribute> wordAttributes = JSON.parseArray(Constant.WORDIMPORT, WordAttribute.class);
List<WordAttribute> nameToId = JSON.parseArray(Constant.NAMETOID, WordAttribute.class);
wordAttributes.forEach(wordAttribute -> {
wordAttributeMap.put(wordAttribute.getTitle(), wordAttribute);
});
nameToId.forEach(wordAttribute -> {
nameToIdMap.put(wordAttribute.getTitle(), wordAttribute.getType());
});
}
public static void main(String[] args) throws FileNotFoundException {
String id = "b8f71f46-a8fa-4add-9bc0-5713b028ea5f";
String name = "制度样例1—伊利集团流程制度类文件管理规范(2)";
InputStream docfile = new FileInputStream(new File("/Users/jiuyabai/Desktop/yili项目/制度样例1—伊利集团流程制度类文件管理规范(2).doc"));
ReadWordUtil tmp = new ReadWordUtil();
boolean result = tmp.analysisWordTable(docfile);
tmp.writeAttrbute(null,docfile, name, id);
InputStream docxfile = new FileInputStream(new File("/Users/jiuyabai/Desktop/yili项目/制度样例1—伊利集团流程制度类文件管理规范(2).docx"));
new CreateMaps().updateMaps(id, docxfile, name);
System.out.println(result);
}
public ReadWordUtil() {
}
public void writeAttrbute(UserContext userContext,InputStream file, String name, String wsdl) {
boolean result = analysisWordTable(file);
if (result) {
//根据名称获取PAL制度模型
PALRepositoryModel palRepositoryModel = getRepositoryByName(wsdl, name);
if (palRepositoryModel != null) {
String id = palRepositoryModel.getId();
String sql = "update APP_ACT_COE_PAL_PROP set PROPERTYVALUE='%s' where PROPERTYID='%s' AND PLID='%s'";
nameToIdMap.forEach((key, value) -> {
//根据key去更新
WordField tmp = fileFieldMap.get(key);
if (tmp != null) {
//如果是术语~则特殊处理 还有相关文件
if ("术语".equals(key)) {
List nowdata = (List) tmp.getData();
JSONObject jsonObject = new JSONObject();
jsonObject.put("name","术语");
JSONArray jsonArray = new JSONArray();
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("name","名称");
jsonObject1.put("id", "table_head");
jsonObject1.put("desc","定义");
jsonArray.add(jsonObject1);
//存表格 将名称过滤掉
nowdata.stream().filter(datatmp->{
return !"名称".equals(((List)datatmp).get(0));
}).forEach(datatmp->{
JSONObject tmpjb = new JSONObject();
tmpjb.put("name",((List)datatmp).get(0));
tmpjb.put("id", UUIDGener.getUUID());
tmpjb.put("desc",((List)datatmp).get(1));
//{"name":"术语","table":[{"name":"名称","id":"table_head","desc":"定义"},{"name":"流程责任人","id":"c0723266-bff1-410c-b49e-4332e58cc633","desc":"流程责任人是指对流程全生命周期管理负责的人,流程责任人拥有流程全生命周期管理的权力,同时承担相应的职责,是流程绩效的第一负责人。"},{"name":"业务归属","id":"2e3bbc32-1d3d-4f19-8b2e-75302bf2aed4","desc":"是指流程制度文件所属的流程架构位置以及文件适用范围。"}]}
jsonArray.add(tmpjb);
});
jsonObject.put("table",jsonArray);
new CoeProcessLevelWeb(userContext).moreAttrContentSave(id,"term",jsonObject.toJSONString());
} else if ("支持文件".equals(key) || "相关文件".equals(key)) {
//拼文件
List nowdata = (List) tmp.getData();
String alldata = nowdata.stream().collect(Collectors.joining(",")).toString();
String sql1 = String.format(sql, alldata, value, id);
System.out.println("执行的sql有" + sql1);
DBSql.update(sql1);
} else {
String sql1 = String.format(sql, tmp.getData().toString(), value, id);
System.out.println("执行的sql有" + sql1);
DBSql.update(sql1);
}
}
});
}
}
}
public void translateDocTDocx(UserContext userContext,String wsId,String groupValue,String fileValue,String fileName){
DCPluginProfile dcProfilepdf = DCProfileManager.getDCProfile("com.actionsoft.apps.coe.pal.datamigration", "migration");
DCContext dcContextpdf = new DCContext(userContext, dcProfilepdf, "com.actionsoft.apps.coe.pal.datamigration", groupValue, fileValue, fileName);
//InputStream docfile = SDK.getDCAPI().read(dcContextpdf);
String filepath = dcContextpdf.getFilePath();
String fileNewPath = dcContextpdf.getFilePath();
String docname = fileName.replace(".docx",".doc");
String docxname = fileName;
if(fileName.endsWith(".docx")){
docname = dcContextpdf.getFileName().replace(".docx",".doc");
docxname = dcContextpdf.getFileName();
fileNewPath = fileNewPath.replace(".docx",".doc");
try{
File out = new File(fileNewPath);
FileOutputStream outputStream = new FileOutputStream(out);
Document doc = new Document(filepath);
doc.save(outputStream, SaveFormat.DOC);
}catch (Exception e){
e.printStackTrace();
}
}else{
docxname = dcContextpdf.getFileName().replace(".doc",".docx");
docname = dcContextpdf.getFileName();
fileNewPath = fileNewPath.replace(".doc",".docx");
try{
File out = new File(fileNewPath);
FileOutputStream outputStream = new FileOutputStream(out);
Document doc = new Document(filepath);
doc.save(outputStream, SaveFormat.DOCX);
}catch (Exception e){
e.printStackTrace();
}
}
//进行文件解析
DCPluginProfile dcProfilepdfdoc = DCProfileManager.getDCProfile("com.actionsoft.apps.coe.pal.datamigration", "migration");
DCContext dcContextpdfdoc = new DCContext(userContext, dcProfilepdfdoc, "com.actionsoft.apps.coe.pal.datamigration", groupValue, fileValue, docname);
InputStream docfile = SDK.getDCAPI().read(dcContextpdfdoc);
ReadWordUtil tmp = new ReadWordUtil();
tmp.writeAttrbute(userContext,docfile, docname.replace(".doc",""), wsId);
DCContext dcContextpdf1 = new DCContext(userContext, dcProfilepdfdoc, "com.actionsoft.apps.coe.pal.datamigration", groupValue, fileValue, docxname);
InputStream docxfile = SDK.getDCAPI().read(dcContextpdf1);
new CreateMaps().updateMaps(wsId, docxfile, docxname.replace(".docx",""));
}
public boolean analysisWordTable(InputStream file) {
try {
HWPFDocument doc = new HWPFDocument(file);
//XWPFDocument doc = new XWPFDocument(file);
Range range = doc.getRange();
for (int i = 0; i < range.numParagraphs(); i++) {
Paragraph nowPara = range.getParagraph(i);
String text = nowPara.text();
if (StringUtils.isEmpty(text)) {
continue;
}
WordAttribute wordAttribute = wordAttributeMap.get(text.trim());
if ("目的".equals(text.trim())) {
int index = i + 1 > range.numParagraphs() ? i : i + 1;
Paragraph tmpPara = range.getParagraph(index);
fieldMap.put("目的", tmpPara.text());
fileFieldMap.put("目的", new WordField<>(tmpPara.text()));
continue;
}
if ("附则".equals(text.trim())) {
int index = i + 1 > range.numParagraphs() ? i : i + 1;
Paragraph tmpPara = range.getParagraph(index);
fieldMap.put("附则", tmpPara.text());
fileFieldMap.put("附则", new WordField<>(tmpPara.text()));
continue;
}
if (null == wordAttribute) {
continue;
}
//文控信息
if (wordAttribute.getType().equals("DirectFeild")) {
int index = i + 1 > range.numParagraphs() ? i : i + 1;
Paragraph paragraph = range.getParagraph(index);
if ("".equals(paragraph.text())) {
continue;
}
while (!paragraph.isInTable()) {
i += 1;
paragraph = range.getParagraph(i);
if ("".equals(paragraph.text())) {
break;
}
}
//标题后续直接为table
if (paragraph.isInTable()) {
Table table = range.getTable(paragraph);
Map<String, List<String>> tabelDocText = this.getHorizontalTableMapText(table);
//在基本信息中特殊获取文件名称和版本号
if (text.trim().equals("文控信息")) {
tabelDocText.keySet().forEach(key -> {
if (key.replaceAll(" ", "").equals("版本")) {
List<String> strings = tabelDocText.get(key);
if (!strings.isEmpty()) {
version = strings.get(0);
}
}
if (key.equals("文件名称")) {
List<String> strings = tabelDocText.get(key);
if (!strings.isEmpty()) {
fileName = strings.get(0);
}
}
});
}
tabelDocText.keySet().forEach(key -> {
List<String> strings = tabelDocText.get(key);
if (!strings.isEmpty()) {
fieldMap.put(key, strings.get(0));
fileFieldMap.put(key, new WordField<>(strings.get(0)));
}
});
i += table.numParagraphs();
}
continue;
}
//修订信息
if (wordAttribute.getType().equals("VerticalFeild")) {
int index = i + 1 > range.numParagraphs() ? i : i + 1;
Paragraph paragraph = range.getParagraph(index);
int level = paragraph.getIlvl();
if (paragraph.isInTable()) {
Table table = range.getTable(paragraph);
Map<String, List<String>> verticalTableText = this.getVerticalTableText(table);
if (text.trim().equals("修订记录")) {
List<String> strings = verticalTableText.get("版本");
int subIndex = 0;
for (int j = 0; j < strings.size(); j++) {
String s = strings.get(j);
if (s.equals(version)) {
subIndex = j;
}
}
for (String key : verticalTableText.keySet()) {
List<String> values = verticalTableText.get(key);
fieldMap.put(key, values.get(subIndex));
fileFieldMap.put(key, new WordField<>(values.get(subIndex)));
}
} else {
}
i += table.numParagraphs();
}
continue;
}
//术语
if (wordAttribute.getType().equals("Table")) {
int index = i + 1 > range.numParagraphs() ? i : i + 1;
Paragraph paragraph = range.getParagraph(index);
if (paragraph.isInTable()) {
Table table = range.getTable(paragraph);
List<List<String>> horizontalTableText = this.getHorizontalTableText(table);
tableMap.put(wordAttribute.getTitle(), horizontalTableText);
fileFieldMap.put(wordAttribute.getTitle(), new WordField<>(horizontalTableText));
i += table.numParagraphs();
}
continue;
}
//支持文件 相关文件
if (wordAttribute.getType().equals("File")) {
int index = i + 1 > range.numParagraphs() ? i : i + 1;
Paragraph paragraph = range.getParagraph(index);
if (paragraph.isInTable()) {
if ("相关文件,支持文件".contains(text.trim())) {
//取文件名名称即可
Table table = range.getTable(paragraph);
Map<String, List<String>> verticalTableText = this.getVerticalTableText(table);
List<String> strings = verticalTableText.get("文件");
fileMap.put(wordAttribute.getTitle(), strings);
fileFieldMap.put(wordAttribute.getTitle(), new WordField<>(strings));
i += table.numParagraphs();
}
}
continue;
}
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
private Map<String, List<String>> getHorizontalTableMapText(Table tb) {
Map<String, List<String>> result = new HashMap<>(16);
//迭代行默认从0开始,可以依据需要设置i的值,改变起始行数也可设置读取到那行只需修改循环的判断条件即可
for (int i = 0; i < tb.numRows(); i++) {
List<String> list = new ArrayList<>(16);
int x = 0;
TableRow tr = tb.getRow(i);
String key = null;
//迭代列默认从0开始
for (int j = 0; j < tr.numCells(); j++) {
//取得单元格
TableCell td = tr.getCell(j);
StringBuffer sb = new StringBuffer();
String text = td.text();
//取得单元格的内容
for (int k = 0; k < td.numParagraphs(); k++) {
Paragraph paragraph = td.getParagraph(k);
String s = paragraph.text();
//去除后面的特殊符号
if (null != s && !"".equals(s)) {
s = s.substring(0, s.length() - 1);
}
sb.append(s);
}
if (x == 0) {
key = sb.toString();
} else {
String value = sb.toString();
list.add(value == null || Objects.deepEquals(value, "") ? null : value.replace(",", ""));
}
x++;
}
result.put(key, list);
}
return result;
}
private List<List<String>> getHorizontalTableText(Table table) {
List<List<String>> list = new ArrayList<>();
for (int i = 0; i < table.numRows(); i++) {
List<String> rowList = new ArrayList<>();
TableRow row = table.getRow(i);
for (int j = 0; j < row.numCells(); j++) {
TableCell cell = row.getCell(j);
String text = cell.text();
//去除text特殊符号
if (null != text && !"".equals(text)) {
text = text.replaceAll("\\p{C}", "");
}
rowList.add(text);
}
list.add(rowList);
}
return list;
}
private Map<String, List<String>> getVerticalTableText(Table table) {
Map<String, List<String>> result = new HashMap<>();
List<String> stringList = new ArrayList<>();
for (int i = 0; i < table.numRows(); i++) {
TableRow row = table.getRow(i);
for (int j = 0; j < row.numCells(); j++) {
TableCell cell = row.getCell(j);
String text = cell.text();
//去除text特殊符号
if (null != text && !"".equals(text)) {
text = text.replaceAll("\\p{C}", "");
}
if (i == 0) {
//首行为标题行
result.put(text, new ArrayList<>());
stringList.add(text);
} else {
result.get(stringList.get(j)).add(text);
}
}
}
return result;
}
/**
* 根据名字寻找palmode
*
* @param wsId
* @param repositoryName
* @return
*/
public static PALRepositoryModel getRepositoryByName(String wsId, String repositoryName) {
List<PALRepositoryModel> palRepositoryModels = CoeProcessLevelDaoFacotory.createCoeProcessLevel().getAllCoeProcessLevelByWsId(wsId);
for (PALRepositoryModel palRepositoryModel : palRepositoryModels) {
if (palRepositoryModel.getName().equals(repositoryName)) {
return palRepositoryModel;
}
}
return null;
}
public String getVersion() {
return version;
}
public void setVersion(String version) {
this.version = version;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public Map<String, WordField<Object>> getFileFieldMap() {
return fileFieldMap;
}
public void setFileFieldMap(Map<String, WordField<Object>> fileFieldMap) {
this.fileFieldMap = fileFieldMap;
}
}

View File

@ -0,0 +1,61 @@
package com.actionsoft.apps.coe.pal.datamigration.util.readword;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author baizp
* @Description:将doc生成附件
* @date 2022/6/21 15:41
*/
public class WordCreatFile {
public void createFile(XWPFDocument doc) throws IOException {
String absolutePath = "/Users/jiuyabai/Desktop/yili项目/生成测试文件/测试.docx";
File file = new File(absolutePath);
File pFile = file.getParentFile();
if (!pFile.exists()) {
pFile.mkdirs();
}
FileOutputStream out = new FileOutputStream(file);
doc.write(out);
out.close();
}
public static void copyAllRunsToAnotherParagraph(XWPFParagraph oldPar, XWPFParagraph newPar) {
final int DEFAULT_FONT_SIZE = 10;
for (XWPFRun run : oldPar.getRuns()) {
String textInRun = run.getText(0);
if (textInRun == null || textInRun.isEmpty()) {
continue;
}
int fontSize = run.getFontSize();
//System.out.println("run text = '" + textInRun + "' , fontSize = " + fontSize);
XWPFRun newRun = newPar.createRun();
// Copy text
newRun.setText(textInRun);
// Apply the same style
newRun.setFontSize( ( fontSize == -1) ? DEFAULT_FONT_SIZE : run.getFontSize() );
newRun.setFontFamily( run.getFontFamily() );
newRun.setBold( run.isBold() );
newRun.setItalic( run.isItalic() );
newRun.setStrike( run.isStrike() );
newRun.setColor( run.getColor() );
newRun.setUnderline(run.getUnderline());
newRun.setCapitalized(run.isCapitalized());
newRun.setTextPosition(run.getTextPosition());
newRun.setItalic(run.isItalic());
newRun.setShadow(run.isShadowed());
}
}
}

View File

@ -0,0 +1,297 @@
package com.actionsoft.apps.coe.pal.datamigration.util.readword;
/**
* @author baizp
* @Description:
* @date 2022/6/21 17:21
*/
import com.actionsoft.apps.coe.pal.datamigration.constant.CoEConstant;
import com.actionsoft.apps.coe.pal.pal.repository.upfile.constant.CoeFileConstant;
import com.actionsoft.apps.coe.pal.pal.repository.upfile.dao.UpFileDao;
import com.actionsoft.apps.coe.pal.pal.repository.upfile.model.UpfileModel;
import com.actionsoft.apps.resource.plugin.profile.DCPluginProfile;
import com.actionsoft.bpms.server.UserContext;
import com.actionsoft.bpms.server.fs.DCContext;
import com.actionsoft.bpms.server.fs.dc.DCProfileManager;
import com.actionsoft.bpms.util.UUIDGener;
import com.actionsoft.sdk.local.SDK;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.poifs.filesystem.FileMagic;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.xmlbeans.XmlException;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageMar;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageSz;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STPageOrientation.Enum;
import java.io.*;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.List;
public class WordFinal {
public static void main(String[] args) throws IOException, OpenXML4JException {
new WordFinal().emedFileCopy();
}
/**
* 文档内附件复制
*
* @param args
* @throws IOException
* @throws XmlException
* @throws OpenXML4JException
*/
public void copyWord(UserContext me, String reid, InputStream inputStream, String pluuid) throws IOException, XmlException, OpenXML4JException {
//XWPFDocument srcDoc = new XWPFDocument(new FileInputStream("/Users/jiuyabai/Desktop/yili项目/制度样例2—创新中心功效研究管理办法1.docx"));
XWPFDocument srcDoc = new XWPFDocument(inputStream);
//XWPFDocument srcDoc = new XWPFDocument(new FileInputStream("/Users/jiuyabai/Desktop/yili项目/测试附件.docx"));
//XWPFDocument srcDoc = new XWPFDocument(new FileInputStream("/Users/jiuyabai/Desktop/yili项目/制度样例3-伊利集团关联方关系及关联交易管理规定.docx"));
CustomXWPFDocument destDoc = new CustomXWPFDocument();
// Copy document layout.
copyLayout(srcDoc, destDoc);
ByteArrayOutputStream out = null;
boolean isstart = false;
boolean isend = false;
int count = 1;
String filename = "";
for (IBodyElement bodyElement : srcDoc.getBodyElements()) {
BodyElementType elementType = bodyElement.getElementType();
if (elementType == BodyElementType.PARAGRAPH) {
XWPFParagraph srcPr = (XWPFParagraph) bodyElement;
String tmptext = srcPr.getParagraphText();
if (tmptext.matches("附件\\d{1,}")) {
//if (tmptext.matches("附件:")) {
if (count != 1) {
destDoc.write(out);
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
writeFileTodisk(me, reid, filename, in, pluuid);
out.close();
}
isstart = true;
//out = new FileOutputStream("/Users/jiuyabai/Desktop/yili项目/生成测试文件/管理办法11"+count+".docx");
filename = "上传附件测试" + count + ".docx";
out = new ByteArrayOutputStream();
destDoc = new CustomXWPFDocument();
copyLayout(srcDoc, destDoc);
count += 1;
continue;
}
}
if (!isstart) {
continue;
}
if (elementType == BodyElementType.PARAGRAPH) {
XWPFParagraph srcPr = (XWPFParagraph) bodyElement;
copyStyle(srcDoc, destDoc, srcDoc.getStyles().getStyle(srcPr.getStyleID()));
boolean hasImage = false;
XWPFParagraph dstPr = destDoc.createParagraph();
// Extract image from source docx file and insert into destination docx file.
for (XWPFRun srcRun : srcPr.getRuns()) {
// You need next code when you want to call XWPFParagraph.removeRun().
dstPr.createRun();
if (srcRun.getEmbeddedPictures().size() > 0)
hasImage = true;
for (XWPFPicture pic : srcRun.getEmbeddedPictures()) {
byte[] img = pic.getPictureData().getData();
long cx = pic.getCTPicture().getSpPr().getXfrm().getExt().getCx();
long cy = pic.getCTPicture().getSpPr().getXfrm().getExt().getCy();
try {
// Working addPicture Code below...
String blipId = dstPr.getDocument().addPictureData(new ByteArrayInputStream(img),
Document.PICTURE_TYPE_PNG);
destDoc.createPictureCxCy(blipId, destDoc.getNextPicNameNumber(Document.PICTURE_TYPE_PNG),
cx, cy);
} catch (InvalidFormatException e1) {
e1.printStackTrace();
}
}
}
if (hasImage == false) {
int pos = destDoc.getParagraphs().size() - 1;
destDoc.setParagraph(srcPr, pos);
}
} else if (elementType == BodyElementType.TABLE) {
XWPFTable table = (XWPFTable) bodyElement;
copyStyle(srcDoc, destDoc, srcDoc.getStyles().getStyle(table.getStyleID()));
destDoc.createTable();
int pos = destDoc.getTables().size() - 1;
destDoc.setTable(pos, table);
}
}
if(count != 1){
destDoc.write(out);
ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
writeFileTodisk(me, reid, filename, in, pluuid);
out.close();
}
}
/**
* @param me
* @param bindId
* @param reid 制度图id
* @throws FileNotFoundException
*/
public void writeFileTodisk(UserContext me, String reid, String filename, ByteArrayInputStream inputStream, String pl_uuid) throws FileNotFoundException {
//InputStream ins = new FileInputStream("");
DCPluginProfile fileProfile = DCProfileManager.getDCProfile(CoEConstant.APP_ID, CoeFileConstant.COE_UPFILE);
DCContext dcContextpdf = new DCContext(me, fileProfile, CoEConstant.APP_ID, "file", reid, filename);
boolean isOK = false;
//DataInputStream ds = new DataInputStream(ins);
//isOK = WriteDCFile.getInstance().write(inputStream, dcContextpdf);
SDK.getDCAPI().write(inputStream, dcContextpdf);
//创建数据库数据
UpfileModel model = new UpfileModel();
model.setShape_uuid("");
model.setType("f");
model.setUuid(UUIDGener.getUUID());
model.setPl_uuid(reid);
model.setFileName(filename);
model.setDownload(1);
model.setCreateUser(me.getUID());
model.setCreateTime(new Timestamp(System.currentTimeMillis()));
new UpFileDao().create(model);
}
/**
* 文档外文件复制
*/
public void emedFileCopy() throws IOException, OpenXML4JException {
FileInputStream file = new FileInputStream("/Users/jiuyabai/Desktop/yili项目/测试附件.docx");
XWPFDocument srcDoc = new XWPFDocument(file);
srcDoc.getAllEmbedds().stream().forEach(tmp -> {
tmp.getPartName().getExtension();
/*System.out.println(tmp.getPartName());
System.out.println(tmp.getContentType());
System.out.println(tmp.getContentTypeDetails().getSubType());
System.out.println(tmp.getContentTypeDetails());*/
try {
InputStream inputStream = tmp.getInputStream();
OutputStream outputStream = tmp.getOutputStream();
System.out.println(FileMagic.valueOf(inputStream));
} catch (IOException e) {
e.printStackTrace();
}
/*InputStream inputStream = null;
try {
inputStream = tmp.getInputStream();
String filetype = tmp.getContentType();
System.out.println("filetype"+filetype);
byte[] readbyte = new byte[1024];
String name = tmp.getPartName().getName();
int read = 0;
OutputStream out1 = new FileOutputStream("/Users/jiuyabai/Desktop/yili项目/生成测试文件/文件插入附件.doc");;
while ((read = inputStream.read(readbyte)) != -1){
out1.write(readbyte,0,read);
}
*//*String xxx = bytesToHexString(readbyte);
xxx = xxx.toUpperCase();
System.out.println("头文件是:" + xxx);
String ooo = checkType(xxx);*//*
out1.close();
} catch (IOException e) {
e.printStackTrace();
}*/
});
}
// Copy Styles of Table and Paragraph.
private static void copyStyle(XWPFDocument srcDoc, XWPFDocument destDoc, XWPFStyle style) {
if (destDoc == null || style == null)
return;
if (destDoc.getStyles() == null) {
destDoc.createStyles();
}
List<XWPFStyle> usedStyleList = srcDoc.getStyles().getUsedStyleList(style);
for (XWPFStyle xwpfStyle : usedStyleList) {
destDoc.getStyles().addStyle(xwpfStyle);
}
}
// Copy Page Layout.
//
// if next error message shows up, download "ooxml-schemas-1.1.jar" file and
// add it to classpath.
//
// [Error]
// The type org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageMar
// cannot be resolved.
// It is indirectly referenced from required .class files
//
// This error happens because there is no CTPageMar class in
// poi-ooxml-schemas-3.10.1-20140818.jar.
//
// [ref.] http://poi.apache.org/faq.html#faq-N10025
// [ref.] http://poi.apache.org/overview.html#components
//
// < ooxml-schemas 1.1 download >
// http://repo.maven.apache.org/maven2/org/apache/poi/ooxml-schemas/1.1/
//
private static void copyLayout(XWPFDocument srcDoc, XWPFDocument destDoc) {
CTPageMar pgMar = srcDoc.getDocument().getBody().getSectPr().getPgMar();
BigInteger bottom = pgMar.getBottom();
BigInteger footer = pgMar.getFooter();
BigInteger gutter = pgMar.getGutter();
BigInteger header = pgMar.getHeader();
BigInteger left = pgMar.getLeft();
BigInteger right = pgMar.getRight();
BigInteger top = pgMar.getTop();
CTPageMar addNewPgMar = destDoc.getDocument().getBody().addNewSectPr().addNewPgMar();
addNewPgMar.setBottom(bottom);
addNewPgMar.setFooter(footer);
addNewPgMar.setGutter(gutter);
addNewPgMar.setHeader(header);
addNewPgMar.setLeft(left);
addNewPgMar.setRight(right);
addNewPgMar.setTop(top);
CTPageSz pgSzSrc = srcDoc.getDocument().getBody().getSectPr().getPgSz();
BigInteger code = pgSzSrc.getCode();
BigInteger h = pgSzSrc.getH();
Enum orient = pgSzSrc.getOrient();
BigInteger w = pgSzSrc.getW();
CTPageSz addNewPgSz = destDoc.getDocument().getBody().addNewSectPr().addNewPgSz();
addNewPgSz.setCode(code);
addNewPgSz.setH(h);
addNewPgSz.setOrient(orient);
addNewPgSz.setW(w);
}
}

View File

@ -0,0 +1,651 @@
package com.actionsoft.apps.coe.pal.datamigration.util.readword;
import cn.jpush.api.utils.StringUtils;
import com.actionsoft.apps.coe.pal.datamigration.aris.mapping.ModelMappingAPIManager;
import com.actionsoft.apps.coe.pal.datamigration.constant.Constant;
import com.actionsoft.apps.coe.pal.datamigration.util.ShapeUtil;
import com.actionsoft.bpms.util.UUIDGener;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.xwpf.usermodel.*;
import java.io.*;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
/**
* @author baizp
* @Description:
* @date 2022/6/16 15:53
*/
public class WordUtilXWPF {
private static final String WORD_BLANK = "[\u00a0|\u3000|\u0020|\b|\t]";
/**
* word的它自己造换行符 要换成string的换行符
*/
private static final String WORD_LINE_BREAK = "[\u000B|\r]";
/**
* 抽取文字时去掉不必须字符正则
*/
private static final String splitter = "[\\t|\\n|\\r|\\s+|\u00a0+]";
private static final String regexClearBeginBlank = "^" + splitter + "*|" + splitter + "*$";
public static void main(String[] args) {
JSONObject elements = null;
JSONObject shape = null;
/*props1.put("x", 130*zindex);
props1.put("y", 277);
props1.put("w", 110);
props1.put("h", 50);*/
String filePath = "/Users/jiuyabai/Desktop/yili项目/制度样例1—伊利集团流程制度类文件管理规范1.docx";
File file = null;
try {
file = new File(filePath);
XWPFDocument doc = new XWPFDocument(new FileInputStream(filePath));
JSONArray jsonArray = getXParagraph(doc);
System.out.println("");
} catch (Exception e) {
}
//new WordUtilXWPF().importWordLibrary(elements);
}
public static JSONArray getXParagraph(XWPFDocument doc) {
JSONArray jsons = new JSONArray();
Iterator<IBodyElement> iter = doc.getBodyElementsIterator();
int count = 1;
int img = 1;
int table = 1;
while (iter.hasNext()) {
IBodyElement element = iter.next();
if (element instanceof XWPFParagraph) {
// 获取段落元素
XWPFParagraph paragraph = (XWPFParagraph) element;
Paragraph paragraph1 = (Paragraph)element;
String text = paragraph.getText();
String style = paragraph.getStyle();//标题级别
if (org.apache.commons.lang3.StringUtils.isNotEmpty(text)) {//文字
// 将word中的特有字符转化为普通的换行符空格符等
String textWithSameBlankAndBreak = text.replaceAll(WORD_BLANK, " ").replaceAll(WORD_LINE_BREAK, "\n")
.replaceAll("\n+", "\n");
// 去除word特有的不可见字符
String textClearBeginBlank = textWithSameBlankAndBreak.replaceAll(regexClearBeginBlank, "");
// 为抽取的每一个段落加上\n作为换行符标识
//System.out.println("text="+textClearBeginBlank);
//System.out.println("style="+style);
//System.out.println("------");
JSONObject json = new JSONObject();
json.put("text", text);
json.put("style", style);
json.put("index", count);
json.put("flag", "text");
jsons.add(json);
count++;
}
}
}
return jsons;
}
/**
* 重写解析代码
*
* @param elements
* @return
*/
public JSONObject rewritContent(JSONObject elements,InputStream inputStream,String name) {
//File file = null;
List<String> failTitleList = new ArrayList<>();
//String filePath = "/Users/jiuyabai/Desktop/yili项目/制度样例1—伊利集团流程制度类文件管理规范1.docx";
try {
//file = new File(filePath);
XWPFDocument doc = new XWPFDocument(inputStream);
JSONObject shapeze = ShapeUtil.getProcessShapeDefinitionByName("control.policy", "regulation");
String shapeIdz = UUIDGener.getObjectId();
shapeze.put("text", name);//不生效
shapeze.put("level", 0);
JSONObject props1 = shapeze.getJSONObject("props");// 位置大小
shapeze.put("id", shapeIdz);
props1.put("x", 100);
props1.put("y", 277);
props1.put("w", 110);
props1.put("h", 50);
props1.put("zindex", 0);
shapeze.put("next", true);
elements.put(shapeIdz, shapeze);
shapeze.put("p", 0);
//获取段落
List<XWPFParagraph> paras = doc.getParagraphs();
//级别依次
//记录x横向的位置
int x = 1;
//记录y轴的位置
int y = 1;
//记录上次层级
int lastindex = 0;
boolean isfirst = true;
//所以条数
int countall = 0;
//上级节点是否已有子节点
boolean hasnext = false;
//内容的所有数据
StringBuilder strb = new StringBuilder();
//记录这条线上的所有节点 顺序就是层级
//List<JSONObject> onlinedata = new ArrayList<JSONObject>();
JSONArray onlinedata = new JSONArray();
onlinedata.add(shapeze);
boolean lastislast = false;
XWPFDocument newfile = new XWPFDocument();
boolean isend = false;
boolean isstart = true;
for (XWPFParagraph para : paras) {
BigInteger numlevel = para.getNumIlvl();
countall += 1;
if("内容".equals(para.getParagraphText()) && numlevel == null){
isstart = false;
continue;
}
if(isstart){
continue;
}
if (!para.getParagraphText().isEmpty()) {
if(para.getParagraphText().matches("附件\\d{1,}")){
isend = true;
}
XWPFParagraph tmpp = newfile.createParagraph();
WordCreatFile.copyAllRunsToAnotherParagraph(para,tmpp);
}
if(isend){
continue;
}
hasnext = false;
JSONObject shap = new JSONObject();
String leveltext = para.getNumLevelText();
String titleLvl = getTitleLvl(doc, para);//获取段落级别
//System.out.println("numlevel" + numlevel + "======leveltext=====" + leveltext + "=====获取到的级别为=====" + titleLvl + " =======内容为=====" + para.getText());
//System.out.println("=====当前level为" + (numlevel != null ? numlevel.intValue() : "") + "=====上一节点层级为" + lastindex + " ");
//标题级别
if (numlevel != null && numlevel.intValue() > 0) {
int nowlevel = numlevel.intValue();
//如果换层级了 就清空后面的数据
if ((nowlevel < lastindex || lastindex == 0) && onlinedata.size() >= (nowlevel + 1)) {
// System.out.println("进行数据清理");
JSONArray tmp = new JSONArray();
for (int i = 0; i <= nowlevel; i++) {
tmp.add(onlinedata.getJSONObject(i));
}
onlinedata = tmp;
}
lastislast = false;
String shapeId1 = UUIDGener.getObjectId();
int pnode = lastindex;
boolean issamelevel = false;
//如果是同级需要找到父节点
if (lastindex == nowlevel) {
JSONObject tmpshap1 = onlinedata.getJSONObject(lastindex);
pnode = tmpshap1.getInteger("p");
x = 0;
} else {
if (nowlevel > lastindex && (lastindex != 0 || isfirst)) {
x = 1;
} else {
x = 0;
}
/**
* 如果不是同级 需要找到同级
*/
if ((onlinedata.size() - 1) >= nowlevel && onlinedata.get(nowlevel) != null) {
JSONObject tmpshap1 = onlinedata.getJSONObject(nowlevel);
pnode = tmpshap1.getInteger("p");
lastindex = nowlevel;
}
/**
* 找上一级
*/
if (onlinedata.size() == nowlevel && lastindex == 0) {
lastindex = nowlevel - 1;
JSONObject tmpshap1 = onlinedata.getJSONObject(lastindex);
pnode = lastindex;
hasnext = tmpshap1.getBoolean("next");
x = 1;
}
}
isfirst = false;
//如果是父节点新增则要父节点的节点
JSONObject tmpshap = onlinedata.getJSONObject(lastindex);
// System.out.println("======获取上一节点位置为:" + lastindex + " ====节点内容为:" + tmpshap.getString("text"));
int len = para.getParagraphText().length() / 8 - 2;
/**
* 计算y
*/
if (nowlevel <= lastindex || hasnext) {
y += 1;
}
shap = getSharp(x, y, countall, len, tmpshap,para.getParagraphText());
shap.put("id", shapeId1);
shap.put("text", getShowText(para.getParagraphText()));
shap.put("level", nowlevel);
shap.put("p", pnode);
elements.put(shapeId1, shap);
JSONObject linkshap = onlinedata.getJSONObject(pnode);
linkshap.put("next", true);
onlinedata.set(pnode, linkshap);
craetline(elements, linkshap, shap, countall);
onlinedata.set(nowlevel, shap);
lastindex = nowlevel;
} else {
//内容
if (StringUtils.isNotEmpty(para.getParagraphText())) {
if(para.getParagraphText().contains("表单/模板适用范围")){
System.out.println("断电测试11111");
}
//countall += 1;
//判断下一个是否同一级
boolean islast = false;
if (countall == paras.size()) {
islast = true;
}
if (countall < paras.size()) {
BigInteger nextlevel = paras.get(countall).getNumIlvl();
//后面数据为高级别文字
if (nextlevel != null && nextlevel.intValue() > 0) {
islast = true;
} else {
//后面为图片 或者表格 则要判断这之后是否有同级文字
int tmp = countall;
while (tmp < paras.size()) {
XWPFParagraph paratmp = paras.get(tmp);
BigInteger nextleveltmp = paratmp.getNumIlvl();
if (nextleveltmp == null && paratmp.getParagraphText().length() == 0) {
tmp += 1;
} else {
//有同级文字
if ((nextleveltmp == null || nextleveltmp.intValue() == 0) && paratmp.getParagraphText().length() > 0) {
islast = false;
} else {
islast = true;
}
if(paratmp.getParagraphText().matches("附件\\d{1,}")){
islast = true;
}
if("相关文件".equals(para.getParagraphText()) && numlevel == null){
islast = true;
}
break;
}
}
}
}
if (islast) {
strb.append(para.getParagraphText());
}
if (strb.length() > 0 && islast) {
String shapeId1 = UUIDGener.getObjectId();
//System.out.println("段落内容===" + para.getParagraphText());//段落内容
lastindex = onlinedata.size() - 1;
//获取级数
int len = strb.length() / 8 - 2;
int pnode = lastindex;
int nowlevel = 0;
if (numlevel != null) {
nowlevel = numlevel.intValue();
}
/* if (lastindex == nowlevel) {
JSONObject tmpshap1 = onlinedata.getJSONObject(lastindex);
pnode = tmpshap1.getInteger("p");
}*/
x = 1;
JSONObject tmpshap = onlinedata.getJSONObject(lastindex);
//根据上一个位置计算当前位置
shap = getSharp(x, y, countall, len, tmpshap,strb.toString());
shap.put("id", shapeId1);
shap.put("text", getShowText(strb.toString()));
//shap.put("p", pnode);
shap.put("level", 0);
JSONObject linkshap = onlinedata.getJSONObject(lastindex);
craetline(elements, linkshap, shap, countall);
linkshap.put("next", true);
onlinedata.set(pnode, linkshap);
elements.put(shapeId1, shap);
strb = new StringBuilder();
} else {
strb.append(para.getParagraphText());
}
lastislast = true;
lastindex = 0;
}
}
}
new WordCreatFile().createFile(newfile);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 会在本地产生临时文件用完后需要删除
/*if (file.exists()) {
//file.delete();
}*/
}
return elements;
}
/**
* 处理超长的字符
*
* @param text
* @return
*/
public String getShowText(String text) {
if (!text.isEmpty() && text.length() >= 64) {
return text.substring(0, 64) + "...";
}
return text;
}
public JSONObject importWordLibrary(JSONObject elements) {
File file = null;
List<String> failTitleList = new ArrayList<>();
String filePath = "/Users/jiuyabai/Desktop/yili项目/制度样例1—伊利集团流程制度类文件管理规范1.docx";
try {
file = new File(filePath);
XWPFDocument doc = new XWPFDocument(new FileInputStream(filePath));
JSONObject shapeze = ShapeUtil.getProcessShapeDefinitionByName("control.policy", "regulation");
String shapeIdz = UUIDGener.getObjectId();
shapeze.put("text", "12312312312");//不生效
JSONObject props1 = shapeze.getJSONObject("props");// 位置大小
shapeze.put("id", shapeIdz);
props1.put("x", 100);
props1.put("y", 277);
props1.put("w", 110);
props1.put("h", 50);
props1.put("zindex", 0);
elements.put(shapeIdz, shapeze);
//获取段落
List<XWPFParagraph> paras = doc.getParagraphs();
int f = 0;//判断只从标题开始
int inE = 0;//判断词条库什么时候添加
int inT = 0;//判断词条库什么时候添加
int level = 1;//判断级别什么时候添加
Integer libraryTypeId = 0;//类型id
int leavone = 0;
int leatwo = 0;
int leatthee = 0;
int countall = 1;
int x = 2;
int y = 2;
int lastindex = 0;
StringBuilder strb = new StringBuilder();
JSONObject leoj = new JSONObject();
JSONObject letj = new JSONObject();
//JSONObject lethreej = new JSONObject();
for (XWPFParagraph para : paras) {
String failTitle = "";//返回错误标题
String shapeId1 = UUIDGener.getObjectId();
try {
String leveltext = para.getNumLevelText();
BigInteger numlevel = para.getNumIlvl();
String titleLvl = getTitleLvl(doc, para);//获取段落级别
System.out.println("numlevel" + numlevel + "======leveltext=====" + leveltext + "=====获取到的级别为=====" + titleLvl + " =======内容为=====" + para.getText());
if ("a5".equals(titleLvl) || "a7".equals(titleLvl) || "HTML".equals(titleLvl) || "".equals(titleLvl) || null == titleLvl) {
titleLvl = "8";
}
Date date = new Date();//时间
JSONObject shap = new JSONObject();
if (null != titleLvl && !"".equals(titleLvl) && !"8".equals(titleLvl)) {
if (f != 1 && "0".equals(titleLvl)) {//这里是去除目录只从内容标题开始
f = 1;
}
if ("0".equals(titleLvl)) {
++inT;
level = 0;
if (inT != 1) {//第一次不添加第二次到的时候说明前边的段落内容已经循环完成然后添加
//System.out.println("级别===" + titleLvl + " 数值======= " + para.getNumLevelText() + " 内容===" + para.getParagraphText());
leavone += 1;
countall += 1;
lastindex = 0;
int len = para.getParagraphText().length() / 8 - 2;
shap = getSharp(x, y, countall, len, null,"");
shap.put("id", shapeId1);
shap.put("text", para.getParagraphText());
}
} else if ("1".equals(titleLvl)) {
++inE;
if (inE != 1 && level == 1) {//第一次不添加第二次到的时候说明前边的段落内容已经循环完成然后添加
//System.out.println("级别===" + titleLvl + " 数值======= " + para.getNumLevelText() + " 内容===" + para.getParagraphText());
leavone += 1;
countall += 1;
if (lastindex == 2) {
x -= 1;
y += 1;
}
if (lastindex == 3) {
x -= 2;
y += 1;
}
if (lastindex == 1) {
y += 1;
}
if (x < 2) {
x = 2;
}
lastindex = 1;
int len = para.getParagraphText().length() / 8 - 2;
shap = getSharp(x, y, countall, len, null,"");
shap.put("id", shapeId1);
shap.put("text", para.getParagraphText());
leoj = shap;
craetline(elements, shapeze, shap, countall);
}
level = 1;
} else if ("2".equals(titleLvl)) {
//level = 2;
//System.out.println("级别===" + titleLvl + " 数值======= " + para.getNumLevelText() + " 内容===" + para.getParagraphText());
leatwo += 1;
countall += 1;
if (lastindex == 1) {
x += 1;
}
if (lastindex == 2) {
y += 1;
}
if (lastindex == 3) {
x -= 1;
y += 1;
}
lastindex = 2;
int len = para.getParagraphText().length() / 8 - 2;
shap = getSharp(x, y, countall, len, null,"");
shap.put("id", shapeId1);
shap.put("text", para.getParagraphText());
letj = shap;
craetline(elements, leoj, shap, countall);
} else {
System.out.println("未匹配到级别");
}
} else {
//if (f != 1) {//这里是去除目录只从内容标题开始
if (StringUtils.isNotEmpty(para.getParagraphText())) {
leatthee += 1;
countall += 1;
if (strb.length() > 0 && lastindex != 3) {
JSONObject tmpshap = new JSONObject();
//System.out.println("段落内容===" + para.getParagraphText());//段落内容
if (lastindex == 3) {
y += 1;
}
if (lastindex == 2) {
x += 1;
tmpshap = letj;
}
if (lastindex == 1) {
x += 2;
tmpshap = leoj;
}
int len = para.getParagraphText().length() / 8 - 2;
shap = getSharp(x, y, countall, len, null,"");
shap.put("id", shapeId1);
shap.put("text", para.getParagraphText());
craetline(elements, tmpshap, shap, countall);
strb = new StringBuilder();
}
strb.append(para.getParagraphText());
lastindex = 3;
}
// }
}
if (shap != null && !shap.isEmpty()) {
elements.put(shapeId1, shap);
}
} catch (Exception e) {
failTitleList.add(failTitle);
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 会在本地产生临时文件用完后需要删除
/*if (file.exists()) {
//file.delete();
}*/
}
return elements;
}
/**
* 连线处理
*
* @param x
* @param y
* @param zindex
* @return
*/
public void craetline(JSONObject elements, JSONObject shapef1, JSONObject shapt1, int zindex) {
JSONObject linkerObj = ModelMappingAPIManager.getInstance().getLinkerDef();
JSONObject shafp = shapef1.getJSONObject("props");
JSONObject shatp = shapt1.getJSONObject("props");
String linkerId = UUIDGener.getObjectId();
linkerObj.put("id", linkerId);
JSONObject props = linkerObj.getJSONObject("props");
props.put("zindex", zindex);// 层次
linkerObj.put("props", props);
//linkerObj.put("points", getLinkerPoints(positionModels));
JSONObject from = linkerObj.getJSONObject("from");
from.put("id", shapef1.get("id"));
from.put("angle", Constant.ANGLE_LEFT);
from.put("x", shafp.getInteger("x") + shafp.getInteger("w"));
from.put("y", shafp.getInteger("y") + 25);
linkerObj.put("from", from);
JSONObject to = linkerObj.getJSONObject("to");
to.put("id", shapt1.get("id"));
to.put("angle", Constant.ANGLE_RIGHT);
to.put("x", shatp.getInteger("x"));
to.put("y", shatp.getInteger("y") + 25);
linkerObj.put("to", to);
elements.put(linkerId, linkerObj);
}
public JSONObject getSharp(int x, int y, int zindex, int len, JSONObject lastshap, String str) {
// String shapeId1 = UUIDGener.getObjectId();
JSONObject shape1 = ShapeUtil.getProcessShapeDefinitionByName("control.policy", "item");
// shape1.put("id", shapeId1);
JSONArray attribute = shape1.getJSONArray("dataAttributes").getJSONObject(0).getJSONArray("attributesJsonArray");
JSONObject tmp = new JSONObject();
tmp.put("ref", "");
tmp.put("readonly", false);
tmp.put("scope", "%,*");
tmp.put("name", "描述");
tmp.put("id", "desc");
tmp.put("type", "textarea");
tmp.put("value", str);
tmp.put("groupPath", "baseAttribute");
tmp.put("key", "desc");
attribute.add(tmp);
// shape1.put("text",orgdepartmentList.get(i).getString("POSITION_NAME"));
if (lastshap.getString("text").contains("适用范围设定")) {
System.out.println("断点");
}
lastshap = lastshap.getJSONObject("props");
JSONObject props1 = shape1.getJSONObject("props");// 位置大小
if (len < 0) {
len = 0;
}
int xtmp = lastshap.getInteger("x") + (lastshap.getInteger("w") + 100) * x;
props1.put("x", xtmp);
props1.put("y", 100 * y);
//props1.put("w", 150 + (len * 35));
props1.put("w", 325);
props1.put("h", 50);
//System.out.println("坐标为x" + xtmp + " y:" + y);
props1.put("zindex", zindex);
return shape1;
}
/**
* Word中的大纲级别可以通过getPPr().getOutlineLvl()直接提取但需要注意Word中段落级别通过如下三种方式定义
* 1直接对段落进行定义
* 2对段落的样式进行定义
* 3对段落样式的基础样式进行定义
* 因此在通过getPPr().getOutlineLvl()提取时需要依次在如上三处读取
*
* @param doc
* @param para
* @return
*/
private String getTitleLvl(XWPFDocument doc, XWPFParagraph para) {
String titleLvl = "";
try {
//判断该段落是否设置了大纲级别
if (para.getCTP().getPPr().getOutlineLvl() != null) {
return String.valueOf(para.getCTP().getPPr().getOutlineLvl().getVal());
}
} catch (Exception e) {
}
try {
//判断该段落的样式是否设置了大纲级别
if (doc.getStyles().getStyle(para.getStyle()).getCTStyle().getPPr().getOutlineLvl() != null) {
return String.valueOf(doc.getStyles().getStyle(para.getStyle()).getCTStyle().getPPr().getOutlineLvl().getVal());
}
} catch (Exception e) {
}
try {
//判断该段落的样式的基础样式是否设置了大纲级别
if (doc.getStyles().getStyle(doc.getStyles().getStyle(para.getStyle()).getCTStyle().getBasedOn().getVal())
.getCTStyle().getPPr().getOutlineLvl() != null) {
String styleName = doc.getStyles().getStyle(para.getStyle()).getCTStyle().getBasedOn().getVal();
return String.valueOf(doc.getStyles().getStyle(styleName).getCTStyle().getPPr().getOutlineLvl().getVal());
}
} catch (Exception e) {
}
try {
if (para.getStyleID() != null) {
return para.getStyleID();
}
} catch (Exception e) {
}
return titleLvl;
}
}

View File

@ -18,4 +18,11 @@
<param name="fileValue"/>
<param name="fileName"/>
</cmd-bean>
<!--by bzp-->
<cmd-bean name="com.actionsoft.apps.coe.pal.systemImport_process_attribute_import">
<param name="wsId"/>
<param name="groupValue"/>
<param name="fileValue"/>
<param name="fileName"/>
</cmd-bean>
</aws-actions>