diff --git a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/service/impl/SarFileCompareInfoServiceImpl.java b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/service/impl/SarFileCompareInfoServiceImpl.java index 9726db6..b1f5776 100644 --- a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/service/impl/SarFileCompareInfoServiceImpl.java +++ b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/service/impl/SarFileCompareInfoServiceImpl.java @@ -1,14 +1,17 @@ package com.jero.modules.compare.service.impl; import com.alibaba.fastjson.JSONObject; +import com.aliyuncs.utils.IOUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.jero.common.constant.enums.LanguageEnum; import com.jero.common.exception.JeroBootException; import com.jero.common.system.vo.LoginUser; import com.jero.common.util.MessageUtils; +import com.jero.common.util.MinioUtil; import com.jero.common.util.UUIDUtils; import com.jero.modules.compare.entity.*; +import com.jero.modules.compare.enums.AssessConsistencyEnum; import com.jero.modules.compare.enums.CompareTypeEnum; import com.jero.modules.compare.enums.ReleaseConditionEnum; import com.jero.modules.compare.mapper.SarFileCompareInfoMapper; @@ -16,10 +19,7 @@ import com.jero.modules.compare.service.ISarFileCompareInfoService; import com.jero.modules.compare.service.ISarFileCompareItemService; import com.jero.modules.compare.service.ISarFileCompareMenuService; import com.jero.modules.compare.service.ISarItemsCompareHisEOService; -import com.jero.modules.compare.utils.CompHanLPUtils; -import com.jero.modules.compare.utils.CompareConst; -import com.jero.modules.compare.utils.EventEditHistoryHighLightUtil; -import com.jero.modules.compare.utils.HtmlTextExcel; +import com.jero.modules.compare.utils.*; import com.jero.modules.document.service.IBussDocumentLibraryEOService; import com.jero.modules.split.common.ReadExcel; import com.jero.modules.split.entity.SarFileSplitInfoEO; @@ -33,12 +33,15 @@ import com.jero.modules.split.service.ISarFileSplitItemsValEOService; import com.jero.modules.split.service.ISarFileSplitMenuEOService; import com.jero.modules.sys.entity.LawsEnterpriseStandardLevel; import com.jero.modules.system.util.MyStringUtils; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.poi.common.usermodel.HyperlinkType; import org.apache.poi.hssf.usermodel.*; -import org.apache.poi.ss.usermodel.IndexedColors; -import org.apache.poi.ss.usermodel.VerticalAlignment; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.shiro.SecurityUtils; import org.jeecgframework.poi.excel.ExcelExportUtil; @@ -48,11 +51,17 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.OutputStream; +import javax.servlet.http.HttpSession; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; import java.text.NumberFormat; +import java.text.SimpleDateFormat; import java.util.*; +import java.util.List; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -63,6 +72,7 @@ import java.util.stream.Collectors; * @Version: V1.0 */ @Service +@Slf4j public class SarFileCompareInfoServiceImpl extends ServiceImpl implements ISarFileCompareInfoService { @Autowired @@ -570,7 +580,12 @@ public class SarFileCompareInfoServiceImpl extends ServiceImpl leftData = itemMap.get(CompareConst.POS_LEFT); if (CollectionUtils.isNotEmpty(leftData)) { + //记录需要合并的单元格 + List mergeCells = new ArrayList<>(); + for (int rowNum = 0; rowNum < leftData.size(); rowNum++) { + SarFileCompareExcelMergeCell sarFileCompareExcelMergeCell = new SarFileCompareExcelMergeCell(); + SarFileCompareItem sarFileCompareItem = leftData.get(rowNum); HSSFRow row1 = sheetItemsLeft.createRow(rowNum + 1); @@ -581,7 +596,7 @@ public class SarFileCompareInfoServiceImpl extends ServiceImpl addList = new ArrayList<>(); List delList = new ArrayList<>(); - itemText = HtmlTextExcel.changeHtmlToExcel(itemText,addList,delList); + itemText = HtmlTextExcel.changeHtmlToExcel(sheetItemsLeft,workbook,request,itemText,addList,delList); HSSFRichTextString ts= new HSSFRichTextString(itemText); if (addList != null && !addList.isEmpty()) { for (MarkTextVO markTextVO : addList) { @@ -602,6 +617,44 @@ public class SarFileCompareInfoServiceImpl extends ServiceImpl mergeCellSet = new HashSet<>(mergeCells); + for (SarFileCompareExcelMergeCell mergeCell : mergeCellSet) { + Integer leftCount = 0; + if (ObjectUtils.isNotEmpty(mergeCell.getLeftEnd())&&ObjectUtils.isNotEmpty(mergeCell.getLeftStart())) { + leftCount = mergeCell.getLeftEnd() - mergeCell.getLeftStart() + 1; + } + Integer rightCount = 0; + if (ObjectUtils.isNotEmpty(mergeCell.getRightEnd())&&ObjectUtils.isNotEmpty(mergeCell.getRightStart())) { + rightCount = mergeCell.getRightEnd() - mergeCell.getRightStart() + 1; + } + Integer start = leftCount - rightCount >= 0 ? mergeCell.getLeftStart() : mergeCell.getRightStart(); + log.info("-------------- 合并开始行数:" + start + " -----------------"); + Integer end = leftCount - rightCount >= 0 ? mergeCell.getLeftEnd() : mergeCell.getRightEnd(); + log.info("-------------- 合并结束行数: " + end + " -----------------"); + //合并 + if (ObjectUtils.isNotEmpty(start)&&ObjectUtils.isNotEmpty(end)) { + CellRangeAddress region0 = new CellRangeAddress(start, end, 0, 0); + sheetItemsLeft.addMergedRegion(region0); + CellRangeAddress region1 = new CellRangeAddress(start, end, 1, 1); + sheetItemsLeft.addMergedRegion(region1); + CellRangeAddress region2 = new CellRangeAddress(start, end, 2, 2); + sheetItemsLeft.addMergedRegion(region2); + CellRangeAddress region4 = new CellRangeAddress(start, end, 4, 4); + sheetItemsLeft.addMergedRegion(region4); + CellRangeAddress region5 = new CellRangeAddress(start, end, 5, 5); + sheetItemsLeft.addMergedRegion(region5); + CellRangeAddress region6 = new CellRangeAddress(start, end, 6, 6); + sheetItemsLeft.addMergedRegion(region6); + CellRangeAddress region7 = new CellRangeAddress(start, end, 8, 8); + sheetItemsLeft.addMergedRegion(region7); + } + + } + log.info("-------------- 单元格合并成功 -----------------"); + } } List rightData = itemMap.get(CompareConst.POS_RIGHT); @@ -617,7 +670,7 @@ public class SarFileCompareInfoServiceImpl extends ServiceImpl addList = new ArrayList<>(); List delList = new ArrayList<>(); - itemText = HtmlTextExcel.changeHtmlToExcel(itemText,addList,delList); + itemText = HtmlTextExcel.changeHtmlToExcel(sheetItemsRight,workbook,request,itemText,addList,delList); HSSFRichTextString ts= new HSSFRichTextString(itemText); if (addList != null && !addList.isEmpty()) { for (MarkTextVO markTextVO : addList) { diff --git a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/service/impl/SarFileCompareItemCommentServiceImpl.java b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/service/impl/SarFileCompareItemCommentServiceImpl.java index fecbdac..cc2c244 100644 --- a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/service/impl/SarFileCompareItemCommentServiceImpl.java +++ b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/service/impl/SarFileCompareItemCommentServiceImpl.java @@ -250,7 +250,7 @@ public class SarFileCompareItemCommentServiceImpl extends ServiceImpl sfcItemMap = SarFileCompareItemServiceImpl.queryMapByInfoId(infoId); diff --git a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/utils/HtmlTextExcel.java b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/utils/HtmlTextExcel.java index c904db2..1ce3546 100644 --- a/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/utils/HtmlTextExcel.java +++ b/byd-structuredplugins-serve/laws-modules/src/main/java/com/jero/modules/compare/utils/HtmlTextExcel.java @@ -1,13 +1,40 @@ package com.jero.modules.compare.utils; +import com.jero.common.util.MinioUtil; import com.jero.modules.compare.entity.MarkTextVO; +import com.jero.modules.compare.entity.SarFileCompareExcelMergeCell; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.poi.common.usermodel.HyperlinkType; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.hssf.util.HSSFColor; +import org.apache.poi.ss.usermodel.*; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; import java.util.List; +import java.util.UUID; +@Slf4j public class HtmlTextExcel { - public static String changeHtmlToExcel (String itemContent, List addList, List delList) { + public static String changeHtmlToExcel (HSSFSheet sheetItemsLeft,HSSFWorkbook wb, HttpServletRequest request, String itemContent, List addList, List delList) { + //超链接样式 + Workbook workbook = new HSSFWorkbook(); + CellStyle cellStyleLink =workbook.createCellStyle(); + HSSFFont font = ((HSSFWorkbook) workbook).createFont(); + font.setColor(HSSFColor.HSSFColorPredefined.LIGHT_BLUE.getIndex()); + cellStyleLink.setFont(font); + cellStyleLink.setWrapText(true); if (StringUtils.isNotEmpty(itemContent)) { itemContent = itemContent.replaceAll("
",""); itemContent = itemContent.replaceAll("
",""); @@ -58,7 +85,232 @@ public class HtmlTextExcel { itemContent = itemContent.replaceAll("",""); itemContent = itemContent.replaceAll("",""); itemContent = itemContent.replaceAll("",""); + String rowDataAndPath = getSplitContent(request, itemContent); +// String dir = filePath + File.separator + UUID.randomUUID().toString().replace("-", ""); + String sheetName = "对比结果"; + Sheet sheet = workbook.createSheet(sheetName); + HSSFPatriarch patriarch = (HSSFPatriarch) sheet.createDrawingPatriarch(); + String[] leftSplit = null; + leftSplit = rowDataAndPath.split("---"); + int i = 1; + Row row = sheet.createRow(i); + if (leftSplit.length > 1) { + for (int j = 0; j < leftSplit.length; j++) { + if (ObjectUtils.isNotEmpty(leftSplit[j])) { + ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); + if (j > 0) { + Row row2 = sheet.getRow(j ); + if (ObjectUtils.isEmpty(row2)) { + row2 = sheet.createRow(j); + } + log.info("-------------- 开始开始处理左侧图片、表格 -----------------"); + try { + handleSpecificData(wb, patriarch, cellStyleLink, byteArrayOut, row2, i, j, leftSplit[j], 3); + } catch (IOException e) { + e.printStackTrace(); + } + log.info("-------------- 左侧图片、表格 处理成功 -----------------"); + } else { + log.info("-------------- 开始开始处理左侧图片、表格 -----------------"); + try { + handleSpecificData(wb, patriarch, cellStyleLink, byteArrayOut, row, i, j, leftSplit[j], 3); + } catch (IOException e) { + e.printStackTrace(); + } + log.info("-------------- 左侧图片、表格 处理成功 -----------------"); + } + } + } + List mergeCells = new ArrayList<>(); + SarFileCompareExcelMergeCell sarFileCompareExcelMergeCell = new SarFileCompareExcelMergeCell(); + sarFileCompareExcelMergeCell.setLeftStart(i); + sarFileCompareExcelMergeCell.setLeftEnd(i + leftSplit.length - 1); + sarFileCompareExcelMergeCell.setRightStart(0); + sarFileCompareExcelMergeCell.setRightEnd(0); + mergeCells.add(sarFileCompareExcelMergeCell); + } + } return itemContent; } + /** + * 处理图片跟表格类型的数据 + * @param workbook + + * @param patriarch + * @param cellStyleLink + * @param byteArrayOut + * @param row + * @param i + * @param j + * @param text + * @param cellNum + * @throws IOException + */ + private static void handleSpecificData(HSSFWorkbook workbook, HSSFPatriarch patriarch, CellStyle cellStyleLink, ByteArrayOutputStream byteArrayOut, Row row, int i, int j, String text, int cellNum) throws IOException { + if (text.contains("/upFiles")) { + String dir = "dcjd"; + row.setHeight((short) 3000); //设置行高 + //先将图片下载到本地 + log.info("-------------------------将图片下载到本地文件夹中----------------------------"); + String fileLastName = text.substring(text.lastIndexOf("/") + 1); + if (MinioUtil.doesObjectExist(text)) { + try (InputStream in = MinioUtil.download(text)) { + copyFile2(in, dir + File.separator + fileLastName); + } catch (IOException e) { + e.printStackTrace(); + log.error(e.getMessage(), e); + } + } + File file = new File(dir + File.separator + fileLastName); + log.info("-------------------------图片下载成功:"+ file.getAbsolutePath() +"----------------------------"); + if (file.exists()) { + log.info("-------------------------将图片插入excel指定单元格中----------------------------"); + BufferedImage bufferImg = ImageIO.read(file); + //获取文件后缀 + String fileName = file.getName(); + String formatName = fileName.substring(fileName.lastIndexOf(".") + 1); + //如果是jpg或者是jpeg,需要重画一下,否则会变色 + if (formatName.equalsIgnoreCase("jpg") || formatName.equalsIgnoreCase("jpeg")) { //重画一下,要么会变色 + BufferedImage tag; + tag = new BufferedImage(bufferImg.getWidth(), bufferImg.getHeight(), BufferedImage.TYPE_INT_BGR); + Graphics g = tag.getGraphics(); + g.drawImage(bufferImg, 0, 0, null); // 绘制缩小后的图 + g.dispose(); + bufferImg = tag; + } + ImageIO.write(bufferImg, formatName, byteArrayOut); + //anchor主要用于设置图片的属性 + HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 600, 200, (short) cellNum, j + i, (short) cellNum, j + i); + patriarch.createPicture(anchor, workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)); + log.info("-------------------------将图片插入成功----------------------------"); + } + } else { + Cell cell = row.createCell(cellNum); + if (text.contains(" 0) { + bos.write(bytes, 0, len); + } + // 关闭流 先开后关 后开先关 + // 先开后关,先开的输入流,再开的输出流,那么应该先关输出流,再关输入流 + // 先关外层,再关内层。如BufferedInputStream包装了一个FileInputStream,那么先关BufferedInputStream,再关FileInputStream。 + bos.close(); // 后开先关 + bis.close(); // 先开后关 + } + /** + * 当前excel中新开sheet生成表格,并在指定单元格用超链接关联 + * @param workbook + * @param cellStyleLink + * @param cell + * @param tableHtml + */ + private static void tableAssociate(Workbook workbook, CellStyle cellStyleLink, Cell cell, String tableHtml) { + cell.setCellValue("点击查看详情"); + //新开sheet生成表格 + log.info("-------------------------开始生成表格----------------------------"); + if (org.apache.commons.lang3.StringUtils.isNotEmpty(tableHtml) && tableHtml.indexOf("") < 0) { + if (tableHtml.indexOf("") < 0) { + tableHtml = tableHtml.replaceFirst("", ""); + tableHtml = tableHtml.replaceFirst("", ""); + } else { + tableHtml = tableHtml.replaceFirst("", ""); + tableHtml = tableHtml.replaceFirst("", ""); + } + } + String cnt = "\n"; + tableHtml = tableHtml.replaceAll("<[\\s]*?br[^>]*?>|<[\\s]*?\\/[\\s]*?br[\\s]*?>", cnt); + String tableSheetName = "表格" + System.currentTimeMillis(); + ConvertHtml2Excel.table2Excel(tableHtml, (HSSFWorkbook) workbook, tableSheetName); + log.info("-------------------------表格生产完毕----------------------------"); + //添加超链接 + log.info("-------------------------开始添加超链接---------------------------"); + CreationHelper createHelper = workbook.getCreationHelper(); + Hyperlink hyperlink1 = createHelper.createHyperlink(HyperlinkType.DOCUMENT); + String tableName = "#\'" + tableSheetName + "\'!A1"; + hyperlink1.setAddress(tableName); + cell.setHyperlink(hyperlink1);// 链接 + cell.setCellStyle(cellStyleLink); + log.info("-------------------------超链接添加完毕---------------------------"); + } + /** + * 获取文字、图片、表格分割后的内容 + * @param request + * @param text + * @return + */ + private static String getSplitContent(HttpServletRequest request, String text) { + text = text.replace("

", "").replace("

", "\r\n"); + //分割图片 + log.info("-------------------------开始分割文字与图片---------------------------"); + splitImg(text, request.getSession()); + log.info("-------------------------文字与图片分割完毕---------------------------"); + //分割表格 + log.info("-------------------------从剩余文字中开始分割表格---------------------------"); + String txtAndImg = (String) request.getSession().getAttribute("txtAndImg"); + txtAndImg = txtAndImg.replaceAll("table", "replaceTable"); + splitTable(txtAndImg, request.getSession()); + log.info("-------------------------表格分割完毕---------------------------"); + return (String) request.getSession().getAttribute("textAndTableAndImg"); + } + + /** + * 分割表格 + * @param textAndImg + * @param session + */ + private static void splitTable(String textAndImg,HttpSession session) { + if (textAndImg.contains("") + 14); + String table = textAndImg.substring(textAndImg.indexOf("")+14); + table = table.replaceAll("replaceTable", "table"); + textAndImg = left + "---" + table + "---" + right; + splitTable(textAndImg, session); + } else { + session.setAttribute("textAndTableAndImg", textAndImg); + } + } + + /** + * 分割图片 + * @param text + * @param session + * @return + */ + private static void splitImg(String text, HttpSession session) { + if (text.contains("") + 3); + String img = text.substring(text.indexOf("")); + String path = img.substring(img.lastIndexOf("=") + 1)+"g"; + text = txtLeft + "---" + path + "---" + txtRight; + splitImg(text, session); + } else { + session.setAttribute("txtAndImg", text); + } + } + }