| | |
| | | import com.ots.project.exam.domain.TReportTemplate; |
| | | import com.ots.project.exam.dto.JAQTableStyle; |
| | | import com.ots.project.exam.dto.WordParam; |
| | | import com.ots.project.tool.PdfUtil; |
| | | import com.ots.project.tool.ShellTool; |
| | | import com.ots.project.tool.exam.ExamUtil; |
| | | import com.ots.project.tool.exam.ImageUtil; |
| | |
| | | import com.ots.project.tool.report.JAQ.condition.Table2; |
| | | import com.ots.project.tool.report.JAQ.condition.Table3; |
| | | import com.ots.project.tool.report.JAQ.condition.Table4; |
| | | import com.ots.project.tool.report.PAQ.chart.PAQChart; |
| | | import com.ots.project.tool.report.SAQ.chart.SAQChart; |
| | | import org.apache.commons.collections.map.HashedMap; |
| | | import org.apache.poi.ooxml.POIXMLDocument; |
| | | import org.apache.poi.openxml4j.exceptions.InvalidFormatException; |
| | |
| | | import java.awt.image.BufferedImage; |
| | | import java.io.*; |
| | | import java.util.*; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | | public class WordUtil { |
| | | private static final Logger log = LoggerFactory.getLogger(WordUtil.class); |
| | |
| | | if (run.toString().indexOf("%TTime%") != -1) { |
| | | run.setText(textMap.get("reportGenerationDate").toString(), 0); |
| | | } |
| | | if (run.toString().indexOf("%LIBSAQGS0018%") != -1) { |
| | | run.setText(textMap.get("LIBSAQGS0018").toString(), 0); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | public static CTAnchor getAnchorWithGraphic(CTGraphicalObject ctGraphicalObject, |
| | | String deskFileName, int width, int height, |
| | | int leftOffset, int topOffset, boolean behind, int topPosition) { |
| | | long relativeHeight = 251649024l + topPosition; |
| | | long relativeHeight = 251649024L + topPosition; |
| | | String anchorXML = |
| | | "<wp:anchor xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" " |
| | | + "simplePos=\"0\" relativeHeight=\"" + relativeHeight + "\" behindDoc=\"" + ((behind) ? 1 : 0) + "\" locked=\"0\" layoutInCell=\"1\" allowOverlap=\"1\">" |
| | |
| | | List<XWPFTableCell> cells = row.getTableCells(); |
| | | for (XWPFTableCell cell : cells) { |
| | | |
| | | |
| | | //如果当前表格包含%就代表需要替换 |
| | | if (checkText(cell.getText())) { |
| | | List<XWPFParagraph> paragraphs = cell.getParagraphs(); |
| | | for (XWPFParagraph paragraph : paragraphs) { |
| | | |
| | | //获取所有行 |
| | | List<IRunElement> iRunElements = paragraph.getIRuns(); |
| | | List<XWPFRun> runs = new ArrayList<>(); |
| | | //遍历所有行 |
| | | for (IRunElement iRunElement : iRunElements) { |
| | | runs.add((XWPFRun) iRunElement); |
| | | } |
| | | int runPosition = 0; |
| | | //替换所有表格的文字 |
| | | for (XWPFRun run : runs) { |
| | | setTextValue(textMap, document, paragraph, runPosition, run); |
| | | } |
| | |
| | | } |
| | | } |
| | | private static void setTextValue(Map<String, Object> textMap, XWPFDocument document, XWPFParagraph paragraph, int runPosition, XWPFRun run) { |
| | | System.out.println("表格的:" + run.toString()); |
| | | log.info("表格的:{}", run.toString()); |
| | | try { |
| | | run.setText(changeValue(run.toString(), textMap, run, paragraph, document, runPosition), 0); |
| | | } catch (Exception e) { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | //校验文本是否需要替换 |
| | | public static boolean checkText(String text) { |
| | | //替换文本包含% |
| | | if (text.indexOf("%") != -1 || StringUtils.equals(text, "N/A NONE")) { |
| | | return true; |
| | | //只有%大于1 才通过 |
| | | if(getCount(text) > 1){ |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | //判断%出现的次数 |
| | | public static int getCount(String text){ |
| | | //旧长度 |
| | | int oldLength = text.length(); |
| | | text = text.replace("%", ""); |
| | | //新长度 |
| | | int newLength = text.length(); |
| | | //出现次数 = 旧长度 - 新长度 |
| | | int count = oldLength - newLength; |
| | | return count; |
| | | } |
| | | |
| | | public static String changeValue(String runValue, Map<String, Object> textMap, XWPFRun run, XWPFParagraph paragraph, XWPFDocument document, int runPosition) throws IOException, org.apache.poi.openxml4j.exceptions.InvalidFormatException { |
| | | |
| | | log.debug("changeText:{}",runValue); |
| | | Set<Map.Entry<String, Object>> textSets = textMap.entrySet(); |
| | | for (Map.Entry<String, Object> textSet : textSets) { |
| | | |
| | |
| | | if (runValue.indexOf("<BoldText>") != -1) { |
| | | return setOtherStyle(runValue, paragraph, runPosition, run); |
| | | } |
| | | break; |
| | | //有些表格可能存在多个字典 需替换多次不能轻易break |
| | | //没有可替换内容直接break |
| | | if(getTextSize(runValue) == 0){ |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | private static void changOtherPicture(XWPFParagraph paragraph) { |
| | | |
| | | String paragraphText = paragraph.getText(); |
| | |
| | | setChageWord(fileName, out, textMap, tReportTemplate.getReportType(), templateType, autoTableMap); |
| | | out.flush(); |
| | | changColorIfJAQ(textMap, out, reportName, tReportTemplate.getReportType()); |
| | | ShellTool.execLibreofficeCommand("pdf", EssConfig.getProfile() + "/" + reportName, EssConfig.getProfile() + "/"); |
| | | //PAQ采用新的doc转pdf |
| | | if(!ReportTypeEnum.PAQ.getCode().equals(reportType)){ |
| | | ShellTool.execLibreofficeCommand("pdf", EssConfig.getProfile() + "/" + reportName, EssConfig.getProfile() + "/"); |
| | | }else{ |
| | | PdfUtil.convertPDF(EssConfig.getProfile() + "/" + reportName); |
| | | } |
| | | zipFilePath = getPdfPath(reportName); |
| | | |
| | | deleteFileStrList.add(EssConfig.getProfile() + "/" + reportName); |
| | |
| | | String filePath = getTemplateDownLoadPathByUpLoad(fileName); |
| | | |
| | | XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage(getTemplateDownLoadPathByUpLoad(fileName))); |
| | | |
| | | |
| | | //设置文本 |
| | | changeText(document, textMap); |
| | | |
| | | |
| | | //设置文本框 |
| | | changeTextBox(document, textMap); |
| | | |
| | | |
| | | //设置图表 |
| | | if (Objects.equals(reportType, ReportTypeEnum.PAQ.getCode())) { |
| | | PAQChart.changeChart(document, textMap); |
| | | } |
| | | |
| | | //插入表格 |
| | | addTableValue(document, autoTableMap); |
| | | |
| | | |
| | | //更改表格的值 |
| | | changeTable(document, textMap); |
| | | |
| | | |
| | | //设置图表控件 |
| | | changChar(textMap, document, reportType, templateType); |
| | | document.write(out); |
| | | } |
| | |
| | | } |
| | | } |
| | | private static String getValByKey(String text, Map<String, Object> textMap) { |
| | | log.debug("changeTextBox:{}",text); |
| | | if (!checkText(text)) { |
| | | return text; |
| | | } |
| | |
| | | document.write(out); |
| | | out.flush(); |
| | | } |
| | | |
| | | /** |
| | | * 设置图标控件 |
| | | * @param textMap |
| | | * @param document |
| | | * @param reportType |
| | | * @param templateType |
| | | */ |
| | | private static void changChar(Map<String, Object> textMap, XWPFDocument document, String reportType, String templateType) { |
| | | if (StringUtils.isEmpty(reportType) || StringUtils.isEmpty(templateType)) { |
| | | return; |
| | |
| | | if (ExamUtil.isListEmpty(charts)) { |
| | | return; |
| | | } |
| | | if (StringUtils.equals(reportType, "MAQ")) { |
| | | |
| | | if (StringUtils.equals(reportType, ReportTypeEnum.MAQ.getCode())) { |
| | | setMAQCompleteChars(textMap, charts); |
| | | } else if (StringUtils.equals(reportType, ReportTypeEnum.MAQV2.getCode())) { |
| | | } else if (StringUtils.equals(reportType, ReportTypeEnum.MAQV2.getCode()) || StringUtils.equals(reportType, ReportTypeEnum.MAQ_IAR.getCode())) { |
| | | setMAQ_V2CompleteChars(textMap, charts); |
| | | } else if (StringUtils.equals(reportType, "RuiLin")) { |
| | | } else if (StringUtils.equals(reportType, ReportTypeEnum.RuiLin.getCode())) { |
| | | setRuiLinChar(textMap, charts); |
| | | } else { |
| | | return; |
| | | } |
| | | } |
| | | private static void setMAQ_V2CompleteChars(Map<String, Object> textMap, List<XWPFChart> charts) { |
| | | String p_People32 = textMap.get("P_Task31").toString(); |
| | | String p_Task31 = textMap.get("P_People32").toString(); |
| | | String p_Task31 = textMap.get("P_Task31").toString(); |
| | | String p_People32 = textMap.get("P_People32").toString(); |
| | | String P_INCON25 = textMap.get("P_INCON25").toString(); |
| | | String P_IM24 = textMap.get("P_IM24").toString(); |
| | | String P_SDE23 = textMap.get("P_SDE23").toString(); |
| | |
| | | List<CTBarSer> serList = ctBarChart.getSerList(); |
| | | CTBarSer ctBarSer = serList.get(0); |
| | | CTNumDataSource val = ctBarSer.getVal(); |
| | | val.getNumRef().getNumCache().getPtList().get(0).setV(p_Task31); |
| | | val.getNumRef().getNumCache().getPtList().get(1).setV(p_People32); |
| | | val.getNumRef().getNumCache().getPtList().get(0).setV(p_People32); |
| | | val.getNumRef().getNumCache().getPtList().get(1).setV(p_Task31); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | textMap.put("JAQTableStyle", jaqTableStyleList); |
| | | } |
| | | } |
| | | |
| | | public static int getTextSize(String runValue){ |
| | | Pattern pattern = Pattern.compile("%\\w+%"); |
| | | Matcher matcher = pattern.matcher(runValue); |
| | | List<String> result = new ArrayList<>(); |
| | | while(matcher.find()){ |
| | | result.add(matcher.group()); |
| | | } |
| | | return result.size(); |
| | | } |
| | | |
| | | |
| | | public static void main(String[] args) { |
| | | if (!checkText("人才选拔的目的就是找到能够胜任工作、愿意承担工作,且与组织的需求、文化、价值观相匹配的人。PAQ报告是根据候选人对PAQ问卷中题目的作答信息而生成的,测量的是候选人在工作中偏好的行为风格。PAQ也包括了对作答真实性的测量,同时也装入了TAI专有的作假防范程序,可以有效降低候选人的伪装好倾向(全球30%的自评问卷中都出现了伪装好现象)。")) { |
| | | System.out.println("11"); |
| | | } |
| | | } |
| | | } |