|
@@ -16,6 +16,7 @@ import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.DataSe
|
|
|
import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.OriginalDataDto;
|
|
|
import com.anjiplus.template.gaea.business.modules.dataset.service.DataSetService;
|
|
|
import com.anjiplus.template.gaea.business.modules.file.service.GaeaFileService;
|
|
|
+import com.anjiplus.template.gaea.business.modules.file.util.FileUtils;
|
|
|
import com.anjiplus.template.gaea.business.modules.report.dao.ReportMapper;
|
|
|
import com.anjiplus.template.gaea.business.modules.report.dao.entity.Report;
|
|
|
import com.anjiplus.template.gaea.business.modules.reportexcel.controller.dto.ReportExcelDto;
|
|
@@ -32,6 +33,7 @@ import com.itextpdf.text.pdf.PdfPCell;
|
|
|
import com.itextpdf.text.pdf.PdfPTable;
|
|
|
import com.itextpdf.text.pdf.PdfWriter;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.poi.openxml4j.util.ZipSecureFile;
|
|
|
import org.apache.poi.ss.usermodel.Cell;
|
|
|
import org.apache.poi.ss.usermodel.Row;
|
|
|
import org.apache.poi.ss.usermodel.Sheet;
|
|
@@ -42,8 +44,12 @@ import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.http.MediaType;
|
|
|
+import org.springframework.http.ResponseEntity;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
import java.io.File;
|
|
|
import java.io.FileOutputStream;
|
|
|
import java.io.IOException;
|
|
@@ -145,21 +151,71 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
return reportExcelDto;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Excel导出
|
|
|
+ *
|
|
|
+ * @param request
|
|
|
+ * @param response
|
|
|
+ * @param reportExcelDto
|
|
|
+ * @return
|
|
|
+ * @throws IOException
|
|
|
+ */
|
|
|
@Override
|
|
|
- public Boolean exportExcel(ReportExcelDto reportExcelDto) {
|
|
|
- logger.error("导出...");
|
|
|
- exportExcelCore(reportExcelDto);
|
|
|
- return true;
|
|
|
+ public ResponseEntity<byte[]> exportExcel(HttpServletRequest request, HttpServletResponse response, ReportExcelDto reportExcelDto) throws IOException {
|
|
|
+ String userAgent = request.getHeader("User-Agent");
|
|
|
+ boolean isIeBrowser = userAgent.indexOf("MSIE") > 0;
|
|
|
+
|
|
|
+ String reportCode = reportExcelDto.getReportCode();
|
|
|
+ String exportType = reportExcelDto.getExportType();
|
|
|
+ List<List<ReportExcelStyleDto>> reportExcelStyleList = new ArrayList<>();
|
|
|
+ JSONObject rowData = JSON.parseObject(reportExcelDto.getRowDatas());
|
|
|
+ // 将JSONObject对象转换为列表
|
|
|
+ List<Integer> dataNumList = rowData.keySet().stream().map(Integer::parseInt).sorted().collect(Collectors.toList());
|
|
|
+ for (Integer i : dataNumList) {
|
|
|
+ JSONArray jsonArray = rowData.getJSONArray(i.toString());
|
|
|
+ List<ReportExcelStyleDto> reportExcelStyleDtos = jsonArray.toJavaList(ReportExcelStyleDto.class);
|
|
|
+ reportExcelStyleList.add(reportExcelStyleDtos);
|
|
|
+ }
|
|
|
+ ReportExcelDto report = detailByReportCode(reportCode);
|
|
|
+ reportExcelDto.setJsonStr(report.getJsonStr());
|
|
|
+ String jsonStr = analysisReportData(reportExcelDto);
|
|
|
+ List<JSONObject> lists = (List<JSONObject>) JSON.parse(jsonStr);
|
|
|
+ OutputStream out = null;
|
|
|
+ File file = null;
|
|
|
+ File pdfFile = null;
|
|
|
+
|
|
|
+ String fileName = report.getReportCode();
|
|
|
+ File dir = new File(dictPath + ZIP_PATH);
|
|
|
+ if (!dir.exists()) {
|
|
|
+ dir.mkdirs();
|
|
|
+ }
|
|
|
+ String filePath = dir.getAbsolutePath() + File.separator + fileName + ".xlsx";
|
|
|
+ file = new File(filePath);
|
|
|
+ out = Files.newOutputStream(Paths.get(filePath));
|
|
|
+ XlsUtil.exportXlsFile(out, true, lists);
|
|
|
+
|
|
|
+ ResponseEntity.BodyBuilder builder = ResponseEntity.ok();
|
|
|
+ builder.contentLength(file.length());
|
|
|
+ //application/octet-stream 二进制数据流(最常见的文件下载)
|
|
|
+ builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
|
|
|
+ if (isIeBrowser) {
|
|
|
+ builder.header("Content-Disposition", "attachment; filename=" + reportCode + ".xlsx");
|
|
|
+ } else {
|
|
|
+ builder.header("Content-Disposition", "attacher; filename*=UTF-8''" + reportCode + ".xlsx");
|
|
|
+ }
|
|
|
+ ResponseEntity<byte[]> body = builder.body(FileUtils.readFileToByteArray(file));
|
|
|
+
|
|
|
+ return body;
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 抽取导出Excel核心逻辑
|
|
|
*/
|
|
|
- public void exportExcelCore(ReportExcelDto reportExcelDto)
|
|
|
- {
|
|
|
+ public void exportExcelCore(ReportExcelDto reportExcelDto) {
|
|
|
String reportCode = reportExcelDto.getReportCode();
|
|
|
String exportType = reportExcelDto.getExportType();
|
|
|
List<List<ReportExcelStyleDto>> reportExcelStyleList = new ArrayList<>();
|
|
|
- JSONObject rowData= JSON.parseObject(reportExcelDto.getRowDatas());
|
|
|
+ JSONObject rowData = JSON.parseObject(reportExcelDto.getRowDatas());
|
|
|
// 将JSONObject对象转换为列表
|
|
|
List<Integer> dataNumList = rowData.keySet().stream().map(Integer::parseInt).sorted().collect(Collectors.toList());
|
|
|
for (Integer i : dataNumList) {
|
|
@@ -170,14 +226,14 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
ReportExcelDto report = detailByReportCode(reportCode);
|
|
|
reportExcelDto.setJsonStr(report.getJsonStr());
|
|
|
String jsonStr = analysisReportData(reportExcelDto);
|
|
|
- List<JSONObject> lists=(List<JSONObject> ) JSON.parse(jsonStr);
|
|
|
+ List<JSONObject> lists = (List<JSONObject>) JSON.parse(jsonStr);
|
|
|
OutputStream out = null;
|
|
|
File file = null;
|
|
|
File pdfFile = null;
|
|
|
try {
|
|
|
String fileName = report.getReportCode();
|
|
|
File dir = new File(dictPath + ZIP_PATH);
|
|
|
- if (!dir.exists()){
|
|
|
+ if (!dir.exists()) {
|
|
|
dir.mkdirs();
|
|
|
}
|
|
|
String filePath = dir.getAbsolutePath() + File.separator + fileName + ".xlsx";
|
|
@@ -186,24 +242,21 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
XlsUtil.exportXlsFile(out, true, lists);
|
|
|
if (exportType.equals(ExportTypeEnum.GAEA_TEMPLATE_EXCEL.getCodeValue())) {
|
|
|
gaeaFileService.upload(file);
|
|
|
- }
|
|
|
- else if(exportType.equals(ExportTypeEnum.GAEA_TEMPLATE_PDF.getCodeValue()))
|
|
|
- {
|
|
|
+ } else if (exportType.equals(ExportTypeEnum.GAEA_TEMPLATE_PDF.getCodeValue())) {
|
|
|
// 将Excel文件转换为PDF
|
|
|
String pdfFileName = fileName + ".pdf";
|
|
|
String pdfFilePath = dir.getAbsolutePath() + File.separator + pdfFileName;
|
|
|
- pdfFile = convertExcelToPdf(filePath, pdfFilePath,reportExcelStyleList);
|
|
|
+ pdfFile = convertExcelToPdf(filePath, pdfFilePath, reportExcelStyleList);
|
|
|
gaeaFileService.upload(pdfFile);
|
|
|
}
|
|
|
|
|
|
} catch (IOException e) {
|
|
|
logger.error("导出失败", e);
|
|
|
- }finally {
|
|
|
+ } finally {
|
|
|
try {
|
|
|
out.close();
|
|
|
file.delete();
|
|
|
- if(!Objects.isNull(pdfFile))
|
|
|
- {
|
|
|
+ if (!Objects.isNull(pdfFile)) {
|
|
|
pdfFile.delete();
|
|
|
}
|
|
|
} catch (IOException e) {
|
|
@@ -212,9 +265,12 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
// 将Excel文件转换为PDF
|
|
|
public File convertExcelToPdf(String excelFilePath, String pdfFilePath, List<List<ReportExcelStyleDto>> reportExcelStyleList) {
|
|
|
try {
|
|
|
+ // 解决excel转换为pdf zipboom问题
|
|
|
+ ZipSecureFile.setMinInflateRatio(0);
|
|
|
// 读取Excel文件
|
|
|
Workbook workbook = new XSSFWorkbook(excelFilePath);
|
|
|
Sheet sheet = workbook.getSheetAt(0);
|
|
@@ -241,9 +297,8 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
PdfPCell tableCell = new PdfPCell();
|
|
|
tableCell.setPhrase(new Phrase(getStringValue(headerCell), font));
|
|
|
ReportExcelStyleDto reportExcelStyleDto = reportExcelStyleList.get(0).get(i);
|
|
|
- if(!Objects.isNull(reportExcelStyleDto))
|
|
|
- {
|
|
|
- processCellStyle(reportExcelStyleDto,tableCell,font);
|
|
|
+ if (!Objects.isNull(reportExcelStyleDto)) {
|
|
|
+ processCellStyle(reportExcelStyleDto, tableCell, font);
|
|
|
}
|
|
|
table.addCell(tableCell);
|
|
|
}
|
|
@@ -263,9 +318,8 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
PdfPCell tableCell = new PdfPCell();
|
|
|
tableCell.setPhrase(new Phrase(getStringValue(cell), font));
|
|
|
ReportExcelStyleDto reportExcelStyleDto = reportExcelStyleList.get(i).get(j);
|
|
|
- if(!Objects.isNull(reportExcelStyleDto))
|
|
|
- {
|
|
|
- processCellStyle(reportExcelStyleDto,tableCell,font);
|
|
|
+ if (!Objects.isNull(reportExcelStyleDto)) {
|
|
|
+ processCellStyle(reportExcelStyleDto, tableCell, font);
|
|
|
}
|
|
|
table.addCell(tableCell);
|
|
|
}
|
|
@@ -291,15 +345,14 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
|
|
|
/**
|
|
|
* 处理导出pdf文件样式
|
|
|
+ *
|
|
|
* @param tableCell
|
|
|
*/
|
|
|
- public void processCellStyle(ReportExcelStyleDto reportExcelStyleDto,PdfPCell tableCell,Font font)
|
|
|
- {
|
|
|
+ public void processCellStyle(ReportExcelStyleDto reportExcelStyleDto, PdfPCell tableCell, Font font) {
|
|
|
// 处理单元格背景颜色
|
|
|
String bg = reportExcelStyleDto.getBg();
|
|
|
java.awt.Color color = null;
|
|
|
- if(!Objects.isNull(bg))
|
|
|
- {
|
|
|
+ if (!Objects.isNull(bg)) {
|
|
|
color = parseRGB(bg);
|
|
|
tableCell.setBackgroundColor(new BaseColor(color.getRed(), color.getGreen(), color.getBlue()));
|
|
|
}
|
|
@@ -315,88 +368,64 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
|
|
|
|
|
|
// 设置字体颜色
|
|
|
- if(!Objects.isNull(fc))
|
|
|
- {
|
|
|
+ if (!Objects.isNull(fc)) {
|
|
|
color = parseRGB(fc);
|
|
|
font.setColor(new BaseColor(color.getRed(), color.getGreen(), color.getBlue()));
|
|
|
}
|
|
|
// 设置字体
|
|
|
- if(!Objects.isNull(ff) && !Objects.equals("0",ff))
|
|
|
- {
|
|
|
+ if (!Objects.isNull(ff) && !Objects.equals("0", ff)) {
|
|
|
font.setFamily(ff.toString());
|
|
|
}
|
|
|
// 设置字体大小
|
|
|
- if(!Objects.isNull(fs) && !Objects.equals(0,fs))
|
|
|
- {
|
|
|
+ if (!Objects.isNull(fs) && !Objects.equals(0, fs)) {
|
|
|
font.setSize(fs);
|
|
|
}
|
|
|
// 设置字体加粗
|
|
|
- if(Objects.equals(Boolean.TRUE,bl))
|
|
|
- {
|
|
|
+ if (Objects.equals(Boolean.TRUE, bl)) {
|
|
|
font.setStyle(Font.BOLD);
|
|
|
}
|
|
|
// 设置字体斜体
|
|
|
- if(Objects.equals(Boolean.TRUE,it))
|
|
|
- {
|
|
|
+ if (Objects.equals(Boolean.TRUE, it)) {
|
|
|
font.setStyle(Font.ITALIC);
|
|
|
}
|
|
|
// 设置字体加粗且斜体
|
|
|
- if(Objects.equals(Boolean.TRUE,bl) && Objects.equals(Boolean.TRUE,it))
|
|
|
- {
|
|
|
+ if (Objects.equals(Boolean.TRUE, bl) && Objects.equals(Boolean.TRUE, it)) {
|
|
|
font.setStyle(Font.BOLDITALIC);
|
|
|
}
|
|
|
// 是否删除线
|
|
|
- if(Objects.equals(Boolean.TRUE,cl))
|
|
|
- {
|
|
|
+ if (Objects.equals(Boolean.TRUE, cl)) {
|
|
|
// 如果是粗体且斜体
|
|
|
- if (font.getStyle() == Font.BOLDITALIC)
|
|
|
- {
|
|
|
+ if (font.getStyle() == Font.BOLDITALIC) {
|
|
|
font.setStyle(Font.BOLDITALIC | Font.STRIKETHRU);
|
|
|
}
|
|
|
// 如果是粗体
|
|
|
- else if(font.getStyle() == Font.BOLD)
|
|
|
- {
|
|
|
+ else if (font.getStyle() == Font.BOLD) {
|
|
|
font.setStyle(Font.BOLD | Font.STRIKETHRU);
|
|
|
}
|
|
|
// 如果是斜体
|
|
|
- else if(font.getStyle() == Font.ITALIC)
|
|
|
- {
|
|
|
+ else if (font.getStyle() == Font.ITALIC) {
|
|
|
font.setStyle(Font.ITALIC | Font.STRIKETHRU);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
+ } else {
|
|
|
font.setStyle(Font.STRIKETHRU);
|
|
|
}
|
|
|
}
|
|
|
// 水平对齐
|
|
|
- if(!Objects.isNull(ht))
|
|
|
- {
|
|
|
- if(Objects.equals(ht,0))
|
|
|
- {
|
|
|
+ if (!Objects.isNull(ht)) {
|
|
|
+ if (Objects.equals(ht, 0)) {
|
|
|
tableCell.setHorizontalAlignment(Element.ALIGN_CENTER);
|
|
|
- }
|
|
|
- else if(Objects.equals(ht,1))
|
|
|
- {
|
|
|
+ } else if (Objects.equals(ht, 1)) {
|
|
|
tableCell.setHorizontalAlignment(Element.ALIGN_LEFT);
|
|
|
- }
|
|
|
- else if(Objects.equals(ht,2))
|
|
|
- {
|
|
|
+ } else if (Objects.equals(ht, 2)) {
|
|
|
tableCell.setHorizontalAlignment(Element.ALIGN_RIGHT);
|
|
|
}
|
|
|
}
|
|
|
// 垂直对齐
|
|
|
- if(!Objects.isNull(vt))
|
|
|
- {
|
|
|
- if(Objects.equals(ht,0))
|
|
|
- {
|
|
|
+ if (!Objects.isNull(vt)) {
|
|
|
+ if (Objects.equals(ht, 0)) {
|
|
|
tableCell.setVerticalAlignment(com.itextpdf.text.Element.ALIGN_MIDDLE);
|
|
|
- }
|
|
|
- else if(Objects.equals(ht,1))
|
|
|
- {
|
|
|
+ } else if (Objects.equals(ht, 1)) {
|
|
|
tableCell.setVerticalAlignment(Element.ALIGN_TOP);
|
|
|
- }
|
|
|
- else if(Objects.equals(ht,2))
|
|
|
- {
|
|
|
+ } else if (Objects.equals(ht, 2)) {
|
|
|
tableCell.setVerticalAlignment(Element.ALIGN_BOTTOM);
|
|
|
}
|
|
|
}
|
|
@@ -407,19 +436,19 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
|
|
|
}
|
|
|
|
|
|
- public static java.awt.Color parseRGB(String rgb) {
|
|
|
- try {
|
|
|
- String[] components = rgb.substring(rgb.indexOf("(") + 1, rgb.indexOf(")")).split(",");
|
|
|
- int red = Integer.parseInt(components[0].trim());
|
|
|
- int green = Integer.parseInt(components[1].trim());
|
|
|
- int blue = Integer.parseInt(components[2].trim());
|
|
|
-
|
|
|
- return new java.awt.Color(red, green, blue);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- return null; // 解析失败,返回null
|
|
|
- }
|
|
|
+ public static java.awt.Color parseRGB(String rgb) {
|
|
|
+ try {
|
|
|
+ String[] components = rgb.substring(rgb.indexOf("(") + 1, rgb.indexOf(")")).split(",");
|
|
|
+ int red = Integer.parseInt(components[0].trim());
|
|
|
+ int green = Integer.parseInt(components[1].trim());
|
|
|
+ int blue = Integer.parseInt(components[2].trim());
|
|
|
+
|
|
|
+ return new java.awt.Color(red, green, blue);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return null; // 解析失败,返回null
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
private String getStringValue(Cell cell) {
|
|
|
if (cell == null) {
|
|
@@ -428,6 +457,7 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
return cell.toString();
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
/**
|
|
|
* 解析报表数据,动态插入列表数据和对象数据
|
|
|
*/
|
|
@@ -496,7 +526,6 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -523,33 +552,34 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
celldata.addAll((List<JSONObject>) dbObject.get("celldata"));
|
|
|
|
|
|
//整理celldata数据,转换为map格式,方便后续使用单元格位置获取对应的cell对象
|
|
|
- Map<String,JSONObject> cellDataMap = cellDataList2Map(celldata);
|
|
|
+ Map<String, JSONObject> cellDataMap = cellDataList2Map(celldata);
|
|
|
//清除原有的数据
|
|
|
dbObject.getJSONArray("celldata").clear();
|
|
|
//获取配置项中的合并属性
|
|
|
JSONObject merge = dbObject.getJSONObject("config").getJSONObject("merge");
|
|
|
- if(merge != null) {
|
|
|
+ if (merge != null) {
|
|
|
merge.clear();
|
|
|
}
|
|
|
//定义存储每一列动态扩展的行数
|
|
|
- Map<Integer,Integer> colAddCntMap = new HashMap<>();
|
|
|
+ Map<Integer, Integer> colAddCntMap = new HashMap<>();
|
|
|
// 遍历已存在的单元格,查看是否存在动态参数
|
|
|
for (int i = 0; i < celldata.size(); i++) {
|
|
|
//单元格对象
|
|
|
JSONObject cellObj = celldata.get(i);
|
|
|
//fastjson深拷贝问题
|
|
|
String cellStr = cellObj.toJSONString();
|
|
|
- analysisCellData(cellObj,setParam,colAddCntMap,cellStr,merge, dbObject,cellDataMap, setMap);
|
|
|
+ analysisCellData(cellObj, setParam, colAddCntMap, cellStr, merge, dbObject, cellDataMap, setMap);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 开始解析并渲染 cellData
|
|
|
+ *
|
|
|
* @param cellObject
|
|
|
*/
|
|
|
- public void analysisCellData(JSONObject cellObject,String setParam,Map<Integer,Integer> colAddCntMap,String cellStr,
|
|
|
- JSONObject merge,JSONObject dbObject,Map<String,JSONObject> cellDataMap, Map<String, OriginalDataDto> setMap){
|
|
|
+ public void analysisCellData(JSONObject cellObject, String setParam, Map<Integer, Integer> colAddCntMap, String cellStr,
|
|
|
+ JSONObject merge, JSONObject dbObject, Map<String, JSONObject> cellDataMap, Map<String, OriginalDataDto> setMap) {
|
|
|
//获取行号
|
|
|
Integer cellR = cellObject.getInteger("r");
|
|
|
//获取列数
|
|
@@ -558,7 +588,7 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
int cnt = colAddCntMap.get(cellC) == null ? 0 : colAddCntMap.get(cellC);
|
|
|
//获取单元格类型
|
|
|
CellType cellType = getCellType(cellObject);
|
|
|
- switch (cellType){
|
|
|
+ switch (cellType) {
|
|
|
case BLACK:
|
|
|
//空数据单元格不处理
|
|
|
break;
|
|
@@ -567,17 +597,18 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
//处理动态单元格
|
|
|
String v = cellObject.getJSONObject("v").getString("v");
|
|
|
DataSetDto dataSet = getDataSet(v, setParam);
|
|
|
- handleDynamicCellObject(dataSet,v,cellStr,cnt,cellR,cellC,merge,dbObject,colAddCntMap, setMap);
|
|
|
+ handleDynamicCellObject(dataSet, v, cellStr, cnt, cellR, cellC, merge, dbObject, colAddCntMap, setMap);
|
|
|
break;
|
|
|
default:
|
|
|
//处理静态单元格
|
|
|
- handleStaticCellObject(cellStr,dbObject,cnt,cellR,cellC,cellDataMap,setParam,merge,colAddCntMap,cellType, setMap);
|
|
|
+ handleStaticCellObject(cellStr, dbObject, cnt, cellR, cellC, cellDataMap, setParam, merge, colAddCntMap, cellType, setMap);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 处理动态数据单元格自动扩展
|
|
|
+ *
|
|
|
* @param dataSet
|
|
|
* @param v
|
|
|
* @param cellStr
|
|
@@ -588,19 +619,19 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
* @param dbObject
|
|
|
* @param colAddCntMap
|
|
|
*/
|
|
|
- public void handleDynamicCellObject(DataSetDto dataSet,String v,String cellStr,int cnt,int r,int c,
|
|
|
- JSONObject merge,JSONObject dbObject,Map<Integer,Integer> colAddCntMap, Map<String, OriginalDataDto> setMap){
|
|
|
+ public void handleDynamicCellObject(DataSetDto dataSet, String v, String cellStr, int cnt, int r, int c,
|
|
|
+ JSONObject merge, JSONObject dbObject, Map<Integer, Integer> colAddCntMap, Map<String, OriginalDataDto> setMap) {
|
|
|
//获取动态数据
|
|
|
OriginalDataDto originalDataDto;
|
|
|
if (dataSet != null && setMap.containsKey(dataSet.getSetCode())) {
|
|
|
originalDataDto = setMap.get(dataSet.getSetCode());
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
originalDataDto = dataSetService.getData(dataSet);
|
|
|
setMap.put(dataSet.getSetCode(), originalDataDto);
|
|
|
}
|
|
|
List<JSONObject> cellDynamicData = originalDataDto.getData();
|
|
|
|
|
|
- if(cellDynamicData != null){
|
|
|
+ if (cellDynamicData != null) {
|
|
|
//循环数据赋值
|
|
|
for (int j = 0; j < cellDynamicData.size(); j++) {
|
|
|
//新增的行数据
|
|
@@ -614,25 +645,25 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
//转字符串,解决深拷贝问题
|
|
|
JSONObject addCellData = JSONObject.parseObject(cellStr);
|
|
|
|
|
|
- addCellData.put("r", cnt + r + j); //行数增加
|
|
|
+ addCellData.put("r", cnt + r + j); //行数增加
|
|
|
addCellData.put("c", c);
|
|
|
addCellData.getJSONObject("v").put("v", replace);
|
|
|
addCellData.getJSONObject("v").put("m", replace);
|
|
|
JSONObject cellMc = addCellData.getJSONObject("v").getJSONObject("mc");
|
|
|
//判断是否是合并单元格
|
|
|
- if(null != cellMc){
|
|
|
+ if (null != cellMc) {
|
|
|
//处理合并单元格
|
|
|
Integer rs = cellMc.getInteger("rs");
|
|
|
- cellMc.put("r", cnt + r + rs*j); //行数增加
|
|
|
+ cellMc.put("r", cnt + r + rs * j); //行数增加
|
|
|
cellMc.put("c", c);
|
|
|
- addCellData.put("r", cnt + r + rs*j);
|
|
|
+ addCellData.put("r", cnt + r + rs * j);
|
|
|
//合并单元格需要处理config.merge
|
|
|
- merge.put(cellMc.getString("r")+"_"+cellMc.getString("c"),cellMc);
|
|
|
+ merge.put(cellMc.getString("r") + "_" + cellMc.getString("c"), cellMc);
|
|
|
//处理单元格扩展之后此列扩展的总行数
|
|
|
- colAddCntMap.put(c,cnt + rs * cellDynamicData.size() - 1);
|
|
|
- }else{
|
|
|
+ colAddCntMap.put(c, cnt + rs * cellDynamicData.size() - 1);
|
|
|
+ } else {
|
|
|
//处理单元格扩展之后此列扩展的总行数
|
|
|
- colAddCntMap.put(c,cnt + cellDynamicData.size() - 1);
|
|
|
+ colAddCntMap.put(c, cnt + cellDynamicData.size() - 1);
|
|
|
}
|
|
|
dbObject.getJSONArray("celldata").add(addCellData);
|
|
|
}
|
|
@@ -641,6 +672,7 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
|
|
|
/**
|
|
|
* 处理静态单元格数据
|
|
|
+ *
|
|
|
* @param cellStr
|
|
|
* @param dbObject
|
|
|
* @param cnt
|
|
@@ -652,49 +684,49 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
* @param colAddCntMap
|
|
|
* @param cellType
|
|
|
*/
|
|
|
- public void handleStaticCellObject(String cellStr,JSONObject dbObject,int cnt,int r,int c,
|
|
|
- Map<String,JSONObject> cellDataMap,String setParam,
|
|
|
- JSONObject merge,Map<Integer,Integer> colAddCntMap,CellType cellType,Map<String, OriginalDataDto> setMap){
|
|
|
+ public void handleStaticCellObject(String cellStr, JSONObject dbObject, int cnt, int r, int c,
|
|
|
+ Map<String, JSONObject> cellDataMap, String setParam,
|
|
|
+ JSONObject merge, Map<Integer, Integer> colAddCntMap, CellType cellType, Map<String, OriginalDataDto> setMap) {
|
|
|
//转字符串,解决深拷贝问题
|
|
|
JSONObject addCellData = JSONObject.parseObject(cellStr);
|
|
|
int rows = 0;
|
|
|
- switch(cellType){
|
|
|
+ switch (cellType) {
|
|
|
case STATIC:
|
|
|
case STATIC_MERGE:
|
|
|
//静态不扩展单元格只需要初始化位置就可以
|
|
|
- initCellPosition(addCellData,cnt,merge);
|
|
|
+ initCellPosition(addCellData, cnt, merge);
|
|
|
break;
|
|
|
case STATIC_AUTO:
|
|
|
//获取静态单元格右侧动态单元格的总行数
|
|
|
- rows = getRightDynamicCellRows(addCellData,cellDataMap,setParam,rows,cellType, setMap);
|
|
|
- initCellPosition(addCellData,cnt,merge);
|
|
|
- if(rows > 1){
|
|
|
+ rows = getRightDynamicCellRows(addCellData, cellDataMap, setParam, rows, cellType, setMap);
|
|
|
+ initCellPosition(addCellData, cnt, merge);
|
|
|
+ if (rows > 1) {
|
|
|
//需要把这个静态扩展单元格 改变为 静态合并扩展单元格,就是增加合并属性 mc 以及merge配置
|
|
|
JSONObject mc = new JSONObject();
|
|
|
- mc.put("rs",rows);
|
|
|
- mc.put("cs",1);
|
|
|
- mc.put("r",addCellData.getIntValue("r"));
|
|
|
- mc.put("c",addCellData.getIntValue("c"));
|
|
|
- addCellData.getJSONObject("v").put("mc",mc);
|
|
|
+ mc.put("rs", rows);
|
|
|
+ mc.put("cs", 1);
|
|
|
+ mc.put("r", addCellData.getIntValue("r"));
|
|
|
+ mc.put("c", addCellData.getIntValue("c"));
|
|
|
+ addCellData.getJSONObject("v").put("mc", mc);
|
|
|
//合并单元格需要处理config.merge
|
|
|
- merge.put((mc.getInteger("r")) + "_" + mc.getString("c"),mc);
|
|
|
+ merge.put((mc.getInteger("r")) + "_" + mc.getString("c"), mc);
|
|
|
//处理单元格扩展之后此列扩展的总行数
|
|
|
- colAddCntMap.put(c,cnt + rows - 1);
|
|
|
+ colAddCntMap.put(c, cnt + rows - 1);
|
|
|
}
|
|
|
break;
|
|
|
case STATIC_MERGE_AUTO:
|
|
|
//获取静态单元格右侧动态单元格的总行数
|
|
|
rows = getRightDynamicCellRows(addCellData, cellDataMap, setParam, rows, cellType, setMap);
|
|
|
- initCellPosition(addCellData,cnt,merge);
|
|
|
- if(rows > 0){
|
|
|
+ initCellPosition(addCellData, cnt, merge);
|
|
|
+ if (rows > 0) {
|
|
|
//需要修改单元格mc中的rs
|
|
|
JSONObject cellMc = addCellData.getJSONObject("v").getJSONObject("mc");
|
|
|
int addCnt = cellMc.getInteger("rs");
|
|
|
- cellMc.put("rs",rows);
|
|
|
+ cellMc.put("rs", rows);
|
|
|
//合并单元格需要处理config.merge
|
|
|
- merge.put((cellMc.getInteger("r")) + "_" + cellMc.getString("c"),cellMc);
|
|
|
+ merge.put((cellMc.getInteger("r")) + "_" + cellMc.getString("c"), cellMc);
|
|
|
//处理单元格扩展之后此列扩展的总行数
|
|
|
- colAddCntMap.put(c,cnt + rows - addCnt);
|
|
|
+ colAddCntMap.put(c, cnt + rows - addCnt);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
@@ -703,31 +735,34 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
|
|
|
/**
|
|
|
* 初始化单元格位置,主要是这一列已经动态增加的行数
|
|
|
+ *
|
|
|
* @param addCellData
|
|
|
* @param cnt
|
|
|
* @param merge
|
|
|
*/
|
|
|
- public void initCellPosition(JSONObject addCellData,int cnt,JSONObject merge){
|
|
|
+ public void initCellPosition(JSONObject addCellData, int cnt, JSONObject merge) {
|
|
|
addCellData.put("r", cnt + addCellData.getInteger("r"));//行数增加
|
|
|
//是否是合并单元格
|
|
|
JSONObject mc = addCellData.getJSONObject("v").getJSONObject("mc");
|
|
|
- if(mc != null){
|
|
|
- mc.put("r",addCellData.getInteger("r"));
|
|
|
- initCellMerge(merge,mc);
|
|
|
+ if (mc != null) {
|
|
|
+ mc.put("r", addCellData.getInteger("r"));
|
|
|
+ initCellMerge(merge, mc);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 初始化单元格合并属性的行数
|
|
|
+ *
|
|
|
* @param merge
|
|
|
* @param mc
|
|
|
*/
|
|
|
- public void initCellMerge(JSONObject merge,JSONObject mc){
|
|
|
- merge.put((mc.getInteger("r"))+"_"+mc.getString("c"),mc);
|
|
|
+ public void initCellMerge(JSONObject merge, JSONObject mc) {
|
|
|
+ merge.put((mc.getInteger("r")) + "_" + mc.getString("c"), mc);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取合并单元格右侧的动态扩展行数,用来设置当前单元格的实际
|
|
|
+ *
|
|
|
* @param addCellData
|
|
|
* @param cellDataMap
|
|
|
* @param setParam
|
|
@@ -735,18 +770,18 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
* @param cellType
|
|
|
* @return
|
|
|
*/
|
|
|
- public int getRightDynamicCellRows(JSONObject addCellData,Map<String,JSONObject> cellDataMap,String setParam,int sumRows,CellType cellType,Map<String, OriginalDataDto> setMap){
|
|
|
+ public int getRightDynamicCellRows(JSONObject addCellData, Map<String, JSONObject> cellDataMap, String setParam, int sumRows, CellType cellType, Map<String, OriginalDataDto> setMap) {
|
|
|
//1、获取此单元格右侧关联的所有单元格
|
|
|
- List<JSONObject> rightCellList = getRightDynamicCell(addCellData,cellDataMap,cellType);
|
|
|
+ List<JSONObject> rightCellList = getRightDynamicCell(addCellData, cellDataMap, cellType);
|
|
|
//2、循环获取每个单元格的扩展行数
|
|
|
for (JSONObject rightCell : rightCellList) {
|
|
|
//首先判断这个单元格是否也是【静态扩展单元格】
|
|
|
CellType rightCellType = getCellType(rightCell);
|
|
|
- switch (rightCellType){
|
|
|
+ switch (rightCellType) {
|
|
|
case STATIC_AUTO:
|
|
|
case STATIC_MERGE_AUTO:
|
|
|
//递归查找
|
|
|
- sumRows = getRightDynamicCellRows(rightCell,cellDataMap,setParam,sumRows,rightCellType, setMap);
|
|
|
+ sumRows = getRightDynamicCellRows(rightCell, cellDataMap, setParam, sumRows, rightCellType, setMap);
|
|
|
break;
|
|
|
case BLACK:
|
|
|
case STATIC:
|
|
@@ -756,11 +791,11 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
sumRows += rightCell.getJSONObject("v").getJSONObject("mc").getInteger("rs");
|
|
|
break;
|
|
|
default:
|
|
|
- List<JSONObject> cellDynamicData = getDynamicDataList(rightCell.getJSONObject("v").getString("v"),setParam, setMap);
|
|
|
- if(cellDynamicData != null && cellDynamicData.size() > 1){
|
|
|
+ List<JSONObject> cellDynamicData = getDynamicDataList(rightCell.getJSONObject("v").getString("v"), setParam, setMap);
|
|
|
+ if (cellDynamicData != null && cellDynamicData.size() > 1) {
|
|
|
int size = cellDynamicData.size();
|
|
|
sumRows += size;
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
sumRows++;
|
|
|
}
|
|
|
break;
|
|
@@ -771,12 +806,13 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
|
|
|
/**
|
|
|
* 获取扩展单元格右侧相邻的所有单元格实体
|
|
|
+ *
|
|
|
* @param addCellData
|
|
|
* @param cellDataMap
|
|
|
* @param cellType
|
|
|
* @return
|
|
|
*/
|
|
|
- public List<JSONObject> getRightDynamicCell(JSONObject addCellData,Map<String,JSONObject> cellDataMap,CellType cellType){
|
|
|
+ public List<JSONObject> getRightDynamicCell(JSONObject addCellData, Map<String, JSONObject> cellDataMap, CellType cellType) {
|
|
|
//静态数据合并单元格需要根据右侧的单元格进行自动向下扩展
|
|
|
//1、先获取右侧一列的关联的单元格,根据自身的位置,以及自己合并的合并的信息推断
|
|
|
//如果自己位置是 2,5,并且本身合并 行数2,列数3,则需要推断出两个单元格的位置
|
|
@@ -785,7 +821,7 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
Integer cellC = addCellData.getInteger("c");
|
|
|
Integer cellRs = 0;
|
|
|
Integer cellCs = 0;
|
|
|
- switch (cellType){
|
|
|
+ switch (cellType) {
|
|
|
case STATIC_AUTO:
|
|
|
cellRs = 1;
|
|
|
cellCs = 1;
|
|
@@ -796,11 +832,11 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
break;
|
|
|
}
|
|
|
List<JSONObject> rightCells = new ArrayList<>();
|
|
|
- for(int nums = 0;nums < cellRs;nums++){
|
|
|
+ for (int nums = 0; nums < cellRs; nums++) {
|
|
|
int r = cellR + nums;
|
|
|
int c = cellC + cellCs;
|
|
|
String key = r + "," + c;
|
|
|
- if(cellDataMap.containsKey(key)){
|
|
|
+ if (cellDataMap.containsKey(key)) {
|
|
|
JSONObject cellData = cellDataMap.get(r + "," + c);
|
|
|
rightCells.add(cellData);
|
|
|
}
|
|
@@ -810,48 +846,50 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
|
|
|
/**
|
|
|
* 判断单元格类型
|
|
|
+ *
|
|
|
* @param cellObject
|
|
|
* @return
|
|
|
*/
|
|
|
- public CellType getCellType(JSONObject cellObject){
|
|
|
+ public CellType getCellType(JSONObject cellObject) {
|
|
|
JSONObject cellV1 = cellObject.getJSONObject("v");
|
|
|
if (null != cellV1 && cellV1.containsKey("v") && StringUtils.isNotBlank(cellV1.getString("v"))) {
|
|
|
String cellV2 = cellObject.getJSONObject("v").getString("v");
|
|
|
String auto = cellObject.getJSONObject("v").getString("auto");
|
|
|
JSONObject mc = cellObject.getJSONObject("v").getJSONObject("mc");
|
|
|
- if(cellV2.contains("#{") && cellV2.contains("}") ){
|
|
|
+ if (cellV2.contains("#{") && cellV2.contains("}")) {
|
|
|
//动态单元格
|
|
|
- if(mc != null){
|
|
|
+ if (mc != null) {
|
|
|
return CellType.DYNAMIC_MERGE;
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
return CellType.DYNAMIC;
|
|
|
}
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
//静态单元格
|
|
|
- if(mc != null && "1".equals(auto)){
|
|
|
+ if (mc != null && "1".equals(auto)) {
|
|
|
return CellType.STATIC_MERGE_AUTO;
|
|
|
- }else {
|
|
|
- if("1".equals(auto)){
|
|
|
+ } else {
|
|
|
+ if ("1".equals(auto)) {
|
|
|
return CellType.STATIC_AUTO;
|
|
|
- }else if(mc != null){
|
|
|
+ } else if (mc != null) {
|
|
|
return CellType.STATIC_MERGE;
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
return CellType.STATIC;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
return CellType.BLACK;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* list转为map结构,方便使用行列号查找对应cell对象
|
|
|
+ *
|
|
|
* @param cellDataList
|
|
|
* @return
|
|
|
*/
|
|
|
- public Map<String,JSONObject> cellDataList2Map(List<JSONObject> cellDataList){
|
|
|
- Map<String,JSONObject> cellDataMap = new HashMap<>();
|
|
|
+ public Map<String, JSONObject> cellDataList2Map(List<JSONObject> cellDataList) {
|
|
|
+ Map<String, JSONObject> cellDataMap = new HashMap<>();
|
|
|
for (JSONObject cellData : cellDataList) {
|
|
|
String r = cellData.getString("r");
|
|
|
String c = cellData.getString("c");
|
|
@@ -862,6 +900,7 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
|
|
|
/**
|
|
|
* 解析 #{xxxx.xxxxx} 数据
|
|
|
+ *
|
|
|
* @param v
|
|
|
* @return
|
|
|
*/
|
|
@@ -875,7 +914,7 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
String substring = v.substring(start, end);
|
|
|
if (substring.contains(".")) {
|
|
|
String[] split = substring.split("\\.");
|
|
|
- dto.setSetCode( split[0]);
|
|
|
+ dto.setSetCode(split[0]);
|
|
|
dto.setFieldLabel(split[1]);
|
|
|
getContextData(setParam, dto);
|
|
|
return dto;
|
|
@@ -887,32 +926,34 @@ public class ReportExcelServiceImpl implements ReportExcelService {
|
|
|
|
|
|
/**
|
|
|
* 获取单元格对应的动态数据集
|
|
|
+ *
|
|
|
* @param v
|
|
|
* @param setParam
|
|
|
* @return
|
|
|
*/
|
|
|
- private List<JSONObject> getDynamicDataList(String v, String setParam, Map<String, OriginalDataDto> setMap){
|
|
|
- if(StringUtils.isNotBlank(v)){
|
|
|
- DataSetDto dataSet = getDataSet(v,setParam);
|
|
|
- if(dataSet != null){
|
|
|
+ private List<JSONObject> getDynamicDataList(String v, String setParam, Map<String, OriginalDataDto> setMap) {
|
|
|
+ if (StringUtils.isNotBlank(v)) {
|
|
|
+ DataSetDto dataSet = getDataSet(v, setParam);
|
|
|
+ if (dataSet != null) {
|
|
|
OriginalDataDto originalDataDto;
|
|
|
if (setMap.containsKey(dataSet.getSetCode())) {
|
|
|
originalDataDto = setMap.get(dataSet.getSetCode());
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
originalDataDto = dataSetService.getData(dataSet);
|
|
|
setMap.put(dataSet.getSetCode(), originalDataDto);
|
|
|
}
|
|
|
return originalDataDto.getData();
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
return null;
|
|
|
}
|
|
|
- }else{
|
|
|
+ } else {
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 动态参数替换
|
|
|
+ *
|
|
|
* @param setParam
|
|
|
* @param dto
|
|
|
*/
|