package cn.com.goldenwater.dcproj.service.impl; import cn.com.goldenwater.core.service.AbstractCrudService; import cn.com.goldenwater.dcproj.common.WtprjConvert; import cn.com.goldenwater.dcproj.dao.BisInspPblmDao; import cn.com.goldenwater.dcproj.dao.BisInspWtprjUnitDao; import cn.com.goldenwater.dcproj.model.*; import cn.com.goldenwater.dcproj.param.BisInspPblmParam; import cn.com.goldenwater.dcproj.param.BisInspWtprjUnitParam; import cn.com.goldenwater.dcproj.param.GwComFileParam; import cn.com.goldenwater.dcproj.service.*; import cn.com.goldenwater.dcproj.util.PdfPTableUtil; import cn.com.goldenwater.dcproj.utils.Builder; import cn.com.goldenwater.dcproj.utils.Constant; import cn.com.goldenwater.dcproj.utils.DateUtils; import cn.com.goldenwater.dcproj.utils.InspPblmUtils; import cn.com.goldenwater.id.util.UuidUtil; import com.itextpdf.text.*; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import java.util.List; import java.util.*; import java.util.stream.Collectors; /** * @author lhc * @date 2021-4-14 */ @Service @Transactional public class BisInspWtprjUnitServiceImpl extends AbstractCrudService implements BisInspWtprjUnitService { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private BisInspWtprjUnitDao bisInspWtprjUnitDao; @Autowired private BisInspWtprjSectionService bisInspWtprjSectionService; @Autowired private BisInspWtprjRegisterService bisInspWtprjRegisterService; @Autowired private BisInspPblmService bisInspPblmService; @Autowired private GwComFileService gwComFileService; @Value("${web.upload-path}") public String webUploadPath; @Value("${export.templatePath}") private String templatePath; @Autowired private BisInspPblmDao bisInspPblmDao; public BisInspWtprjUnitServiceImpl(BisInspWtprjUnitDao bisInspWtprjUnitDao) { super(bisInspWtprjUnitDao); this.bisInspWtprjUnitDao = bisInspWtprjUnitDao; } @Override public int insert(BisInspWtprjUnit bisInspWtprjUnit) { String uuid = UuidUtil.uuid(); // 生成uuid bisInspWtprjUnit.setId(uuid); bisInspWtprjUnit.setIntm(new Date()); bisInspWtprjUnit.setUptm(new Date()); bisInspWtprjUnit.setDataStat("0"); int ret = this.bisInspWtprjUnitDao.insert(bisInspWtprjUnit); updateRgstrState(bisInspWtprjUnit.getId()); return ret; } @Override public int update(BisInspWtprjUnit bisInspWtprjUnit) { // 更新登记表 bisInspWtprjUnit.setUptm(new Date()); int ret = this.bisInspWtprjUnitDao.update(bisInspWtprjUnit); updateRgstrState(bisInspWtprjUnit.getId()); return ret; } void updateRgstrState(String unitId) { BisInspWtprjRegister rgstr = bisInspWtprjUnitDao.getRgstrById(unitId); Optional.ofNullable(rgstr).ifPresent(r -> { if (!Constant.STRING_TWO.equals(r.getState()) && !Constant.STRING_ONE.equals(r.getState())) { r.setUptm(new Date()); r.setState(Constant.STRING_ONE); // 更新登记表状态 bisInspWtprjRegisterService.update(r); } }); } @Override public int delete(String id) { BisInspWtprjRegister bisInspWtprjRegister = bisInspWtprjUnitDao.getRgstrById(id); if (bisInspWtprjRegister != null) { bisInspPblmService.deleteBy(Builder.of(BisInspPblmParam::new) .with(BisInspPblmParam::setObjId, bisInspWtprjRegister.getObjId()) .with(BisInspPblmParam::setRegid, id) .build()); } return this.bisInspWtprjUnitDao.delete(id); } @Override public List listBySecId(String secId) { return bisInspWtprjUnitDao.findList(Builder.of(BisInspWtprjUnitParam::new).with(BisInspWtprjUnitParam::setSecId, secId).build()); } @Override public List> getResponsibility(String id) { // 1. 获取 公司信息 BisInspWtprjUnit unit = get(id); BisInspWtprjSection section = bisInspWtprjSectionService.get(unit.getSecId()); List bisInspPblmList = bisInspPblmDao.list(Builder.of(BisInspPblmParam::new) .with(BisInspPblmParam::setObjId, section.getObjId()) .with(BisInspPblmParam::setRegid, id).build()); List> res = new ArrayList<>(); int index = 0; while (index < 3) { int finalIndex = index; Long yibanCount = bisInspPblmList.stream().filter(p -> String.valueOf(finalIndex).equals(p.getInspPblmCate())).count(); Map map = new HashMap(5); map.put("level", String.valueOf(finalIndex)); map.put("count", yibanCount); zhenggai(map, unit.getNature()); res.add(map); index++; } return res; } // 责任追究方式监理、施工、质量检测 // 1:责令整改 2:约谈 3:停工整改 4:经济责任 5:通报批评 6:建议解除合同 7:降低资质 // 项目法人 8:责令整改 9:约谈 10 通报批评 // 1:项目法人(建设单位) 2:施工单位 3:监理单位 4:勘测设计单位 private void zhenggai(Map map, String type) { if ("1".equals(type)) { xiangmufaren(map); } else { sjg(map); } } private void xiangmufaren(Map map) { String level = MapUtils.getString(map, "level"); int count = MapUtils.getIntValue(map, "count"); if (count == 0) { return; } String max = ""; String chose = ""; Set set = new HashSet<>(); switch (level) { case "0": if (count <= 15) { max = "责令整改"; set.add("8"); } else { max = "约谈"; chose = "责令整改"; set.add("9"); set.add("8"); } break; case "1": if (count <= 10) { max = "责令整改"; set.add("8"); } else if (count <= 20) { max = "约谈"; chose = "责令整改"; set.add("9"); set.add("8"); } else { max = "通报批评"; chose = "责令整改、约谈"; set.add("10"); set.add("8"); set.add("9"); } break; case "2": if (count <= 7) { max = "责令整改"; set.add("8"); } else if (count <= 15) { max = "约谈"; chose = "责令整改"; set.add("9"); set.add("8"); } else { max = "通报批评"; chose = "责令整改、约谈"; set.add("10"); set.add("8"); set.add("9"); } default: } map.put("chose", chose); map.put("max", max); map.put("set", set); } private void sjg(Map map) { String level = MapUtils.getString(map, "level"); int count = MapUtils.getIntValue(map, "count"); if (count == 0) { return; } String max = ""; String chose = ""; Set set = new HashSet<>(); switch (level) { case "0": if (count <= 20) { max = "责令整改"; set.add("8"); } else { max = "约谈"; chose = "责令整改"; set.add("9"); set.add("8"); } break; case "1": if (count <= 6) { max = "责令整改"; set.add("8"); } else if (count <= 12) { max = "约谈"; chose = "责令整改"; set.add("9"); set.add("8"); } else if (count <= 20) { max = "停工整改"; chose = "责令整改、约谈"; set.add("3"); set.add("8"); set.add("9"); } else { max = "通报批评"; chose = "责令整改、停工整改、经济责任"; set.add("10"); set.add("8"); set.add("3"); set.add("4"); } break; case "2": if (count <= 5) { max = "责令整改"; set.add("8"); } else if (count <= 10) { max = "约谈"; chose = "责令整改"; set.add("9"); set.add("8"); } else if (count <= 15) { max = "停工整改"; chose = "责令整改"; set.add("3"); set.add("8"); } else if (count <= 20) { max = "通报批评"; chose = "责令整改、经济责任"; set.add("10"); set.add("8"); set.add("4"); } else { max = "建议解除合同"; chose = "责令整改、经济责任、通报批评、降低资质"; set.add("6"); set.add("8"); set.add("4"); set.add("10"); set.add("7"); } default: } map.put("chose", chose); map.put("max", max); map.put("set", set); } /** * 水利项目安全生产巡检样表 * * @param id 公司ID * @param response 导出PDF版检样表文件 */ @Override public void exportCheckList(String id, String orgId, HttpServletResponse response) { response.setContentType("application/x-msdownload"); try (OutputStream out = response.getOutputStream()) { Map checkListData = getCheckListData(id, orgId); String fileName = MapUtils.getString(checkListData, "unitNm") + "检查表.pdf"; String fileNameURL = URLEncoder.encode(fileName, "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileNameURL + ";filename*=utf-8''" + fileNameURL); // 1.获取数据 updateCheckList(checkListData, out); out.flush(); } catch (IOException | DocumentException e) { e.printStackTrace(); } } private void updateCheckList(Map checkListData, OutputStream out) throws IOException, DocumentException { BaseFont bfCN = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false); // 正文的字体 Font topFont = new Font(bfCN, 24f, Font.BOLD); Font headFont = new Font(bfCN, 12f, Font.BOLD); Font textFont = new Font(bfCN, 12f, Font.NORMAL); Document document = new Document(); PdfWriter.getInstance(document, out); document.open(); //建立一个4列的表格 PdfPTableUtil table = new PdfPTableUtil(new PdfPTable(new float[]{6f, 20f, 20f, 40f, 14f})); table.getTable().setTotalWidth(PageSize.A4.getWidth() - 20f); table.getTable().setLockedWidth(true); table.addNoBorderPCell(new Paragraph(MapUtils.getString(checkListData, "title"), topFont), PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, 5); table.addNoBorderPCell(new Paragraph(" ", topFont), PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, 5); // 在相应的单元格进行赋值 setPdfPCell(table.getTable(), MapUtils.getString(checkListData, "name"), 3, 0, Element.ALIGN_LEFT); setPdfPCell(table.getTable(), MapUtils.getString(checkListData, "time"), 2, 0, Element.ALIGN_LEFT); setPdfPCell(table.getTable(), MapUtils.getString(checkListData, "unit"), 5, 0, Element.ALIGN_LEFT); setPdfPCell(table.getTable(), MapUtils.getString(checkListData, "prjCtgy"), 5, 0, Element.ALIGN_LEFT); setPdfPCell(table.getTable(), MapUtils.getString(checkListData, "prjType"), 5, 0, Element.ALIGN_LEFT); setPdfPCell(table.getTable(), MapUtils.getString(checkListData, "prjRisk"), 5, 0, Element.ALIGN_LEFT); //加表格头部序号 类别 巡查项目 严重程度 问题描述 String[] titleArr = {"序号", "类别", "项目", "发现问题", "严重程度"}; for (String aTitleArr : titleArr) { table.addPCell(new Paragraph(aTitleArr, headFont), PdfPCell.ALIGN_CENTER); } //遍历问题 List> bisInspPblmList = (List>) checkListData.get("pblms"); int index = 0; //计算'合并列'的合并相关集合 List indexs; //每个'合并列'的初始下标集合 List spanStartIndex; //每个'合并列'的合并数量集合 List spanNumList; //取出'合并列'的所有数据计算 List ListIn = new ArrayList<>(); for (Map res : bisInspPblmList) { ListIn.add(MapUtils.getString(res, "SEQ")); } spanNumList = getSpanNumList(ListIn); spanStartIndex = getStartIndexList(ListIn, spanNumList); indexs = getIndexs(bisInspPblmList.size(), spanNumList, spanStartIndex); for (Map pblm : bisInspPblmList) { PdfPCell cell1 = new PdfPCell(new Paragraph(MapUtils.getString(pblm, "SEQ"), textFont)); cell1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); cell1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); setRowsSpan(indexs, spanStartIndex, spanNumList, table.getTable(), cell1, index); //合并列 PdfPCell cell2 = new PdfPCell(new Paragraph(MapUtils.getString(pblm, "CHECK_POINT", ""), textFont)); cell2.setHorizontalAlignment(PdfPCell.ALIGN_CENTER); cell2.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE); setRowsSpan(indexs, spanStartIndex, spanNumList, table.getTable(), cell2, index); if ("true".equals(MapUtils.getString(pblm, "CHECK", ""))) { table.addPCell(new Paragraph(" ", textFont), PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, 3); } else { table.addPCell(new Paragraph(MapUtils.getString(pblm, "PBLM_DESC", ""), textFont)); table.addPCell(new Paragraph(MapUtils.getString(pblm, "desc", ""), textFont)); table.addPCell(new Paragraph(MapUtils.getString(pblm, "level", ""), textFont)); } index++; } table.addPCell(new Paragraph("整改意见", textFont), PdfPCell.ALIGN_CENTER, PdfPCell.ALIGN_MIDDLE, 2); table.addPCell(new Paragraph(MapUtils.getString(checkListData, "mendNote", ""), textFont), PdfPCell.ALIGN_LEFT, PdfPCell.ALIGN_MIDDLE, 3); PdfPCell leftTitle3 = new PdfPCell(); leftTitle3.setColspan(3); leftTitle3.setMinimumHeight(28f); leftTitle3.setLeading(0, 1.2F); leftTitle3.addElement(new Paragraph("督查人员签字:", textFont)); if (StringUtils.isNotBlank(MapUtils.getString(checkListData, "ducha"))) { String imgPath = webUploadPath.replace("/upload/", "") + MapUtils.getString(checkListData, "ducha"); logger.info("督查人员签字:" + imgPath); Image img = Image.getInstance(imgPath); img.setRotation((float) Math.PI / 2); img.setAlignment(Image.RIGHT); img.scaleAbsolute(100,50); leftTitle3.addElement(img); } table.getTable().addCell(leftTitle3); PdfPCell leftTitle4 = new PdfPCell(); leftTitle4.setColspan(2); leftTitle4.setMinimumHeight(28f); leftTitle4.setLeading(0, 1.2F); leftTitle4.addElement(new Paragraph("被检查单位负责人签字:", textFont)); if (StringUtils.isNotBlank(MapUtils.getString(checkListData, "beijiancha"))) { String imgPath = webUploadPath.replace("/upload/", "") + MapUtils.getString(checkListData, "beijiancha"); logger.info("被检查单位负责人签字:" + imgPath); Image img = Image.getInstance(imgPath); img.setRotation((float) Math.PI / 2); img.setAlignment(Image.RIGHT); img.scaleAbsolute(100,50); leftTitle4.addElement(img); } table.getTable().addCell(leftTitle4); document.add(table.getTable()); document.close(); out.flush(); out.close(); } private Map getCheckListData(String id, String orgId) { // 获取数据 BisInspWtprjUnit bisInspWtprjUnit = bisInspWtprjUnitDao.get(id); BisInspWtprjSection bisInspWtprjSection = bisInspWtprjSectionService.get(bisInspWtprjUnit.getSecId()); BisInspWtprjRegister bisInspWtprjRegister = bisInspWtprjRegisterService.get(bisInspWtprjSection.getRgstrId()); List bisInspPblmList = bisInspPblmDao.list(Builder.of(BisInspPblmParam::new) .with(BisInspPblmParam::setObjId, bisInspWtprjSection.getObjId()) .with(BisInspPblmParam::setRegid, id).build()); String duchaImage = ""; String beijianchaImage = ""; List ducha = gwComFileService.findList(Builder.of(GwComFileParam::new).with(GwComFileParam::setBizId, bisInspWtprjUnit.getId() + orgId).with(GwComFileParam::setBizType, "liableSignature1").build()); logger.info("督查人员:{}", ducha); if (ducha != null && ducha.size() > 0) { duchaImage = ducha.get(0).getFilePath(); } List beijiancha = gwComFileService.findList(Builder.of(GwComFileParam::new).with(GwComFileParam::setBizId, bisInspWtprjUnit.getId() + orgId).with(GwComFileParam::setBizType, "liableSignature2").build()); logger.info("被检查人员:{}", beijiancha); if (beijiancha != null && beijiancha.size() > 0) { beijianchaImage = beijiancha.get(0).getFilePath(); } Map checkListMap = new HashMap<>(6); checkListMap.put("title", "水利项目" + WtprjConvert.nature(bisInspWtprjUnit.getNature()) + "安全生产巡查检查表"); checkListMap.put("name", "工程名称:" + bisInspWtprjRegister.getNm()); checkListMap.put("time", "巡查时间:" + DateUtils.Date2Str(bisInspWtprjRegister.getUptm(), "yyyy-MM-dd")); checkListMap.put("unit", "被检查单位:" + bisInspWtprjUnit.getNm()); checkListMap.put("unitNm", bisInspWtprjUnit.getNm()); checkListMap.put("prjCtgy", "工程类别:" + WtprjConvert.prjType(bisInspWtprjRegister.getPrjType())); checkListMap.put("prjType", "工程类型:" + WtprjConvert.prjCtgy(bisInspWtprjRegister.getPrjCtgy())); checkListMap.put("prjRisk", "所包含的危险性较大工程:" + WtprjConvert.prjRisk(bisInspWtprjRegister.getPrjRisk())); checkListMap.put("ducha", duchaImage); checkListMap.put("beijiancha", beijianchaImage); checkListMap.put("mendNote", bisInspWtprjUnit.getMendNote()); checkListMap.put("pblms", getPblmData(bisInspPblmList, bisInspWtprjUnit.getNature())); return checkListMap; } private List> getPblmData(List bisInspPblmList, String type) { List> pblmDataList = new ArrayList<>(); if (StringUtils.isBlank(type)) { return null; } List checkPointList = new ArrayList<>(); switch (type) { case "1": checkPointList.add("安全管理体系"); checkPointList.add("安全技术管理"); checkPointList.add("安全过程控制"); checkPointList.add("事故隐患排查与治理"); checkPointList.add("危险源管理"); checkPointList.add("安全事故处理"); checkPointList.add("项目法人安全责任"); checkPointList.add("其他"); break; case "2": checkPointList.add("安全管理体系"); checkPointList.add("技术方案管理"); checkPointList.add("设施、设备、材料管理"); checkPointList.add("施工作业管理"); checkPointList.add("施工环境管理"); checkPointList.add("危险源、隐患及事故处理"); checkPointList.add("防洪度汛与应急管理"); checkPointList.add("安全培训教育"); checkPointList.add("档案管理"); checkPointList.add("其他"); break; case "3": checkPointList.add("安全控制体系"); checkPointList.add("安全过程控制"); checkPointList.add("安全检查"); checkPointList.add("其他"); break; case "4": checkPointList.add("安全管理体系"); checkPointList.add("勘察设计文件"); checkPointList.add("勘察设计服务"); checkPointList.add("其他"); break; default: return null; } for (int i = 1; i <= checkPointList.size(); i++) { String checkPoint = checkPointList.get(i - 1); List pblmList = new ArrayList<>(); if (bisInspPblmList != null && bisInspPblmList.size() > 0) { pblmList = bisInspPblmList.stream() .filter(p -> checkPoint.equals(p.getCheckPointBz())) .collect(Collectors.toList()); } if (pblmList == null || pblmList.size() == 0) { Map pblm = new HashMap<>(5); pblm.put("SEQ", String.valueOf(i)); pblm.put("CHECK_POINT", checkPoint); pblm.put("CHECK", "true"); pblmDataList.add(pblm); continue; } List pblmsTypeIdList = pblmList.stream().map(BisInspPblm::getPblmsTypeId).distinct().collect(Collectors.toList()); for (String pblmsTypeId : pblmsTypeIdList) { Map pblm = new HashMap<>(5); pblm.put("SEQ", String.valueOf(i)); pblm.put("CHECK_POINT", checkPoint); pblm.put("PBLM_DESC", bisInspPblmList.stream() .filter(p -> pblmsTypeId.equals(p.getPblmsTypeId())) .map(BisInspPblm::getPblmDescBz) .findFirst().orElse("")); pblm.put("desc", bisInspPblmList.stream() .filter(p -> pblmsTypeId.equals(p.getPblmsTypeId())) .map(BisInspPblm::getInspPblmDesc) .collect(Collectors.joining(";"))); pblm.put("level", bisInspPblmList.stream() .filter(p -> pblmsTypeId.equals(p.getPblmsTypeId())) .map(o -> InspPblmUtils.plbmCateDesc(o.getInspPblmCate())) .distinct() .collect(Collectors.joining("、"))); pblmDataList.add(pblm); } } return pblmDataList; } private void setPdfPCell(PdfPTable table, String value, int colspan, int border, int horizontalAlignment) { Font fontZh = FontFactory.getFont("STSongStd-Light", "UniGB-UCS2-H", 14); PdfPCell leftTitleOne = new PdfPCell(new Paragraph(value, fontZh)); leftTitleOne.setColspan(colspan); leftTitleOne.setBorder(border); leftTitleOne.setHorizontalAlignment(horizontalAlignment); leftTitleOne.setMinimumHeight(28f); leftTitleOne.setLeading(0, 1.2F); table.addCell(leftTitleOne); } /** * 获取某列要合并的单元格数量 * * @param list 内容必须符合'A,A,B,C,D,D,D,E' 而不是 'A,A,B,C,A,D,D,D,E' ,即所有相同的值必须在一起不能分散 * @return */ private List getSpanNumList(List list) { LinkedHashMap map = new LinkedHashMap<>(); if (list.size() > 0) { for (int i = 0; i < list.size(); i = i + 1) { map.put(list.get(i), i); } } //修改对应key值的value Set s = map.keySet();//获取KEY集合 List strings = new ArrayList<>(s); int spanNum = 0; for (String string : strings) { int tmpSpanNum = map.get(string) - spanNum + 1; map.put(string, tmpSpanNum); spanNum += tmpSpanNum; } List res = new ArrayList<>(); for (String string : strings) { res.add(map.get(string)); } return res; } /** * 获取某列要合并的单元格初始下标 * * @param list 内容必须符合'A,A,B,C,D,D,D,E' 而不是 'A,A,B,C,A,D,D,D,E' ,即所有相同的值必须在一起不能分散 * @param resSpanNumList * @return */ private List getStartIndexList(List list, List resSpanNumList) { LinkedHashMap map = new LinkedHashMap<>(); if (list.size() > 0) { for (int i = 0; i < list.size(); i = i + 1) { map.put(list.get(i), i); } } Set keys = map.keySet();//获取KEY集合 List stringKeys = new ArrayList<>(keys); List res = new ArrayList<>(); if (stringKeys.size() == resSpanNumList.size()) { for (int i = 0; i < stringKeys.size(); i++) { res.add(map.get(stringKeys.get(i)) - resSpanNumList.get(i) + 1); } } return res; } /** * 不加某字段的索引集合 * * @param listLength * @param resSpanNumList * @param resStartIndexList * @return */ private List getIndexs(int listLength, List resSpanNumList, List resStartIndexList) { List indexs = new ArrayList<>(); for (int i = 0; i < listLength; i++) { for (int j = 0; j < resStartIndexList.size(); j++) { if (i == resStartIndexList.get(j)) { for (int k = i + 1; k < i + resSpanNumList.get(j); k++) { indexs.add(k); } } } } return indexs; } /** * 设置恰当位置的setRowSpan属性 * * @param indexs 不加单元格的索引集合 * @param spanStartIndex 要加的单元格开始索引集合 * @param spanNumList 要加的单元格合并的值集合 * @param table table * @param cell cell * @param i 索引 */ private void setRowsSpan(List indexs, List spanStartIndex, List spanNumList, PdfPTable table, PdfPCell cell, int i) { if (indexs != null) { boolean isAllNotEqual = true; for (Integer index : indexs) { if (i == index) { isAllNotEqual = false; break; } } //没有不加的下标 if (isAllNotEqual) { // 判断在哪里设置span值 if (spanStartIndex != null) { boolean isSpan = false; int copyJ = 0; for (int j = 0; j < spanStartIndex.size(); j++) { if (i == spanStartIndex.get(j)) { isSpan = true; copyJ = j; break; } } if (isSpan) { int spanNum = spanNumList.get(copyJ); cell.setRowspan(spanNum); } } table.addCell(cell); } } else { table.addCell(cell); } } }