全文对比-导出接口。

This commit is contained in:
wangzhijiang
2024-03-06 20:28:54 +08:00
parent 111ed3ee73
commit 37fc4b526b
6 changed files with 273 additions and 1 deletions
@@ -328,4 +328,19 @@ public class SarFileCompareInfoController extends JeroController<SarFileCompareI
return Result.error("发起条款对比失败!" + ex.getMessage()); return Result.error("发起条款对比失败!" + ex.getMessage());
} }
} }
@ApiOperation(value = "全文对比-导出")
@GetMapping(value = "/exportFullTextCompareXls")
public void exportFullTextCompareXls(@ApiParam("导出名") @RequestParam(value = "exportName", required = false) String exportName,
@ApiParam("standHisId") @RequestParam(value = "id", required = false) String id,
HttpServletResponse response,
HttpServletRequest request) {
try {
this.sarFileCompareInfoService.exportFullTextCompareXls(id,exportName, response, request);
}catch (JeroBootException e){
throw new JeroBootException(e.getMessage());
}catch (Exception e){
throw new JeroBootException(MessageUtils.getMessage(ResultCommon.ERROR));
}
}
} }
@@ -0,0 +1,24 @@
package com.jero.modules.compare.entity;
public class MarkTextVO {
private int startIndex;
private int endIndex;
public int getStartIndex() {
return startIndex;
}
public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
}
public int getEndIndex() {
return endIndex;
}
public void setEndIndex(int endIndex) {
this.endIndex = endIndex;
}
}
@@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.jero.modules.compare.entity.SarFileCompareDetailVO; import com.jero.modules.compare.entity.SarFileCompareDetailVO;
import com.jero.modules.compare.entity.SarFileCompareInfo; import com.jero.modules.compare.entity.SarFileCompareInfo;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -98,4 +100,13 @@ public interface ISarFileCompareInfoService extends IService<SarFileCompareInfo>
* @return * @return
*/ */
String itemComparison(String leftStandard, String rightStandard, String remark) throws Exception; String itemComparison(String leftStandard, String rightStandard, String remark) throws Exception;
/**
* 导出全文对比
* @param id
* @param exportName
* @param response
* @param request
*/
void exportFullTextCompareXls(String id, String exportName, HttpServletResponse response, HttpServletRequest request);
} }
@@ -19,7 +19,9 @@ import com.jero.modules.compare.service.ISarItemsCompareHisEOService;
import com.jero.modules.compare.utils.CompHanLPUtils; import com.jero.modules.compare.utils.CompHanLPUtils;
import com.jero.modules.compare.utils.CompareConst; import com.jero.modules.compare.utils.CompareConst;
import com.jero.modules.compare.utils.EventEditHistoryHighLightUtil; import com.jero.modules.compare.utils.EventEditHistoryHighLightUtil;
import com.jero.modules.compare.utils.HtmlTextExcel;
import com.jero.modules.document.service.IBussDocumentLibraryEOService; import com.jero.modules.document.service.IBussDocumentLibraryEOService;
import com.jero.modules.split.common.ReadExcel;
import com.jero.modules.split.entity.SarFileSplitInfoEO; import com.jero.modules.split.entity.SarFileSplitInfoEO;
import com.jero.modules.split.entity.SarFileSplitItemsEO; import com.jero.modules.split.entity.SarFileSplitItemsEO;
import com.jero.modules.split.entity.SarFileSplitItemsValEO; import com.jero.modules.split.entity.SarFileSplitItemsValEO;
@@ -29,13 +31,26 @@ import com.jero.modules.split.service.IFileSplitItemsEOService;
import com.jero.modules.split.service.ISarFileSplitInfoService; import com.jero.modules.split.service.ISarFileSplitInfoService;
import com.jero.modules.split.service.ISarFileSplitItemsValEOService; import com.jero.modules.split.service.ISarFileSplitItemsValEOService;
import com.jero.modules.split.service.ISarFileSplitMenuEOService; import com.jero.modules.split.service.ISarFileSplitMenuEOService;
import com.jero.modules.sys.entity.LawsEnterpriseStandardLevel;
import com.jero.modules.system.util.MyStringUtils; import com.jero.modules.system.util.MyStringUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
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.xssf.usermodel.XSSFWorkbook;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.jeecgframework.poi.excel.ExcelExportUtil;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.enmus.ExcelType;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.text.NumberFormat; import java.text.NumberFormat;
import java.util.*; import java.util.*;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@@ -498,4 +513,147 @@ public class SarFileCompareInfoServiceImpl extends ServiceImpl<SarFileCompareInf
SarFileCompareInfo sfcInfo = addStandCompareHis(leftStandard, rightStandard, remark, CompareTypeEnum.ITEM.getValue()); SarFileCompareInfo sfcInfo = addStandCompareHis(leftStandard, rightStandard, remark, CompareTypeEnum.ITEM.getValue());
return sfcInfo.getId(); return sfcInfo.getId();
} }
@Override
public void exportFullTextCompareXls(String id, String exportName, HttpServletResponse response, HttpServletRequest request) {
OutputStream os = null;
OutputStream excelOS = null;
HSSFWorkbook workbook = new HSSFWorkbook();
String fileOriName = "全文比对信息";
if (StringUtils.isNotEmpty(exportName)) {
fileOriName = exportName;
}
String[] headers = {"条款号","条款名称","条款内容","备注"};
HSSFSheet sheetItemsLeft = workbook.createSheet("旧文档");
// 左侧在excel表中添加表头
HSSFRow row = sheetItemsLeft.createRow(0);
sheetItemsLeft.setColumnWidth(0,20*256);
sheetItemsLeft.setColumnWidth(1,30*256);
sheetItemsLeft.setColumnWidth(2,100*256);
sheetItemsLeft.setColumnWidth(3,80*256);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
HSSFSheet sheetItemsRight = workbook.createSheet("新文档");
HSSFRow rowRightHeader = sheetItemsRight.createRow(0);
sheetItemsRight.setColumnWidth(0,20*256);
sheetItemsRight.setColumnWidth(1,30*256);
sheetItemsRight.setColumnWidth(2,100*256);
sheetItemsRight.setColumnWidth(3,80*256);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = rowRightHeader.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
// 基础样式
HSSFCellStyle cellStyleBase =workbook.createCellStyle();
cellStyleBase.setWrapText(true);
cellStyleBase.setVerticalAlignment(VerticalAlignment.CENTER);
HSSFFont fontBase = workbook.createFont();
fontBase.setColor(IndexedColors.BLACK.index);
// 增加文字样式
HSSFFont fontAdd = workbook.createFont();
fontAdd.setColor(IndexedColors.LIGHT_BLUE.index);
// 删除文字样式
HSSFFont fontDel = workbook.createFont();
fontDel.setColor(IndexedColors.RED.index);
SarFileCompareInfo sfcInfo = this.queryById(id);
List<SarFileCompareItem> itemList = sarFileCompareItemService.queryListByInfoId(id);
Map<String, List<SarFileCompareItem>> itemMap = itemList.stream().collect(Collectors.groupingBy(SarFileCompareItem::getLeftOrRight));
List<SarFileCompareItem> leftData = itemMap.get(CompareConst.POS_LEFT);
if (CollectionUtils.isNotEmpty(leftData)) {
for (int rowNum = 0; rowNum < leftData.size(); rowNum++) {
SarFileCompareItem sarFileCompareItem = leftData.get(rowNum);
HSSFRow row1 = sheetItemsLeft.createRow(rowNum + 1);
row1.createCell(0).setCellValue(sfcInfo.getSerialNumberLeft() + " " +sfcInfo.getTitleLeft());
row1.createCell(1).setCellValue(sarFileCompareItem.getItemsNum());
row1.getCell(1).setCellStyle(cellStyleBase);
String itemText = sarFileCompareItem.getItemsText();
List<MarkTextVO> addList = new ArrayList<>();
List<MarkTextVO> delList = new ArrayList<>();
itemText = HtmlTextExcel.changeHtmlToExcel(itemText,addList,delList);
HSSFRichTextString ts= new HSSFRichTextString(itemText);
if (addList != null && !addList.isEmpty()) {
for (MarkTextVO markTextVO : addList) {
int stIndex = markTextVO.getStartIndex();
int edIndex = markTextVO.getEndIndex();
ts.applyFont(stIndex,edIndex,fontAdd);
}
}
if (delList != null && !delList.isEmpty()) {
for (MarkTextVO markTextVO : delList) {
int stIndex = markTextVO.getStartIndex();
int edIndex = markTextVO.getEndIndex();
ts.applyFont(stIndex,edIndex,fontDel);
}
}
row1.createCell(2).setCellValue(sarFileCompareItem.getItemsName());
row1.createCell(3).setCellValue(ts);
row1.getCell(3).setCellStyle(cellStyleBase);
row1.createCell(4).setCellValue(sarFileCompareItem.getRemark());
}
}
List<SarFileCompareItem> rightData = itemMap.get(CompareConst.POS_RIGHT);
if (CollectionUtils.isNotEmpty(rightData)) {
for (int rowNum = 0; rowNum < rightData.size(); rowNum++) {
SarFileCompareItem sarFileCompareItem = rightData.get(rowNum);
HSSFRow row1 = sheetItemsRight.createRow(rowNum + 1);
row1.createCell(0).setCellValue(sfcInfo.getSerialNumberRight() + " " +sfcInfo.getTitleRight());
row1.createCell(1).setCellValue(sarFileCompareItem.getItemsNum());
row1.getCell(1).setCellStyle(cellStyleBase);
String itemText = sarFileCompareItem.getItemsText();
List<MarkTextVO> addList = new ArrayList<>();
List<MarkTextVO> delList = new ArrayList<>();
itemText = HtmlTextExcel.changeHtmlToExcel(itemText,addList,delList);
HSSFRichTextString ts= new HSSFRichTextString(itemText);
if (addList != null && !addList.isEmpty()) {
for (MarkTextVO markTextVO : addList) {
int stIndex = markTextVO.getStartIndex();
int edIndex = markTextVO.getEndIndex();
ts.applyFont(stIndex,edIndex,fontAdd);
}
}
if (delList != null && !delList.isEmpty()) {
for (MarkTextVO markTextVO : delList) {
int stIndex = markTextVO.getStartIndex();
int edIndex = markTextVO.getEndIndex();
ts.applyFont(stIndex,edIndex,fontDel);
}
}
row1.createCell(2).setCellValue(sarFileCompareItem.getItemsName());
row1.createCell(3).setCellValue(ts);
row1.getCell(3).setCellStyle(cellStyleBase);
row1.createCell(4).setCellValue(sarFileCompareItem.getRemark());
}
}
try{
response.setHeader("Content-Disposition",
"attachment; filename=\"" + ReadExcel.encodeFileName(fileOriName, request) +"\"");
response.setContentType("application/force-download");
response.flushBuffer();
os = response.getOutputStream();
workbook.write(os);
os.flush();
os.close(); // 后开先关
} catch (Exception e) {
throw new JeroBootException("下载文件失败,请重试");
} finally {
org.apache.poi.util.IOUtils.closeQuietly(os);
org.apache.poi.util.IOUtils.closeQuietly(excelOS);
}
}
} }
@@ -100,7 +100,7 @@ public class SarItemsCompareHisEOServiceImpl extends ServiceImpl<SarItemsCompare
os = response.getOutputStream(); os = response.getOutputStream();
workbook.write(os); workbook.write(os);
os.flush(); os.flush();
os.close(); // 后开先关 os.close();
} catch (Exception e) { } catch (Exception e) {
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
throw new JeroBootException("下载文件失败,请重试"); throw new JeroBootException("下载文件失败,请重试");
@@ -0,0 +1,64 @@
package com.jero.modules.compare.utils;
import com.jero.modules.compare.entity.MarkTextVO;
import org.apache.commons.lang.StringUtils;
import java.util.List;
public class HtmlTextExcel {
public static String changeHtmlToExcel (String itemContent, List<MarkTextVO> addList, List<MarkTextVO> delList) {
if (StringUtils.isNotEmpty(itemContent)) {
itemContent = itemContent.replaceAll("<div>","");
itemContent = itemContent.replaceAll("<div class=\"compareBackgroundColor\">","");
itemContent = itemContent.replaceAll("</div>","\n");
itemContent = itemContent.replaceAll("<p>","");
itemContent = itemContent.replaceAll("</p>","\n");
//获取所有新增内容的位置
String splitContentAdd = itemContent;
int addSpiltIndex = 0;
int cirIndex = 0;
int stLen = "<span class=\"insertClass\">".length();
int edLen = "</span>".length();
while (splitContentAdd.contains("<span class=\"insertClass\">")) {
int addStIndex = splitContentAdd.indexOf("<span class=\"insertClass\">");
int addEdIndex = splitContentAdd.indexOf("</span>");
if (addStIndex > -1) {
MarkTextVO markTextVO = new MarkTextVO();
markTextVO.setStartIndex(addSpiltIndex + addStIndex - (cirIndex*(stLen+edLen)));
markTextVO.setEndIndex(addSpiltIndex + addEdIndex - (cirIndex*(stLen+edLen)) - stLen);
addList.add(markTextVO);
addSpiltIndex = addSpiltIndex + addEdIndex + 7;
// String replaceStr = splitContentAdd.substring(0,addStIndex);
splitContentAdd = splitContentAdd.substring(addEdIndex + 7,splitContentAdd.length());
cirIndex++;
}
}
//获取所有删除内容的位置
String splitContentDel = itemContent;
int delSpiltIndex = 0;
int cirIndexDel = 0;
int stLenDel = "<span class=\"delClass\">".length();
int edLenDel = "</span>".length();
while (splitContentDel.contains("<span class=\"delClass\">")) {
int delStIndex = splitContentDel.indexOf("<span class=\"delClass\">");
int delEdIndex = splitContentDel.indexOf("</span>");
if (delStIndex > -1) {
MarkTextVO markTextVO = new MarkTextVO();
markTextVO.setStartIndex(delSpiltIndex + delStIndex - (cirIndexDel*(stLenDel+edLenDel)));
markTextVO.setEndIndex(delSpiltIndex + delEdIndex - (cirIndexDel*(stLenDel+edLenDel)) - stLenDel);
delList.add(markTextVO);
delSpiltIndex = delSpiltIndex + delEdIndex + 7;
// String replaceStr = splitContentDel.substring(0,delStIndex);
splitContentDel = splitContentDel.substring(delEdIndex + 7,splitContentDel.length());
cirIndexDel++;
}
}
itemContent = itemContent.replaceAll("<span class=\"insertClass\">","");
itemContent = itemContent.replaceAll("</span>","");
itemContent = itemContent.replaceAll("<span class=\"delClass\">","");
itemContent = itemContent.replaceAll("</span>","");
}
return itemContent;
}
}