|  | @@ -346,10 +346,10 @@ function _setupPgBrks(pageData) {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      for (const page of pageData.items) {
 | 
	
		
			
				|  |  |          const maxBottomArr = [];
 | 
	
		
			
				|  |  | -        _insertMaxBottom(page.cells, maxBottomArr);
 | 
	
		
			
				|  |  | -        _insertMaxBottom(page.signature_cells, maxBottomArr);
 | 
	
		
			
				|  |  | -        _insertMaxBottom(page.signature_date_cells, maxBottomArr);
 | 
	
		
			
				|  |  | -        _insertMaxBottom(page.signature_audit_cells, maxBottomArr);
 | 
	
		
			
				|  |  | +        _insertMaxBottom(page[JV.PROP_CELLS], maxBottomArr);
 | 
	
		
			
				|  |  | +        _insertMaxBottom(page[JV.PROP_SIGNATURE_CELLS], maxBottomArr);
 | 
	
		
			
				|  |  | +        _insertMaxBottom(page[JV.PROP_SIGNATURE_DATE_CELLS], maxBottomArr);
 | 
	
		
			
				|  |  | +        _insertMaxBottom(page[JV.PROP_SIGNATURE_AUDIT_CELLS], maxBottomArr);
 | 
	
		
			
				|  |  |          pgBrkIdx += maxBottomArr.length;
 | 
	
		
			
				|  |  |          pgBrk.push(pgBrkIdx);
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -814,8 +814,8 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
 | 
	
		
			
				|  |  |          rst.push('<mergeCells count="?">');
 | 
	
		
			
				|  |  |          const startIdx = rst.length - 1;
 | 
	
		
			
				|  |  |          const self_setMergedCells = function(theData, theYPos, offsetY) {
 | 
	
		
			
				|  |  | -            for (let i = 0; i < theData.cells.length; i++) {
 | 
	
		
			
				|  |  | -                const cell = theData.cells[i];
 | 
	
		
			
				|  |  | +            for (let i = 0; i < theData[JV.PROP_CELLS].length; i++) {
 | 
	
		
			
				|  |  | +                const cell = theData[JV.PROP_CELLS][i];
 | 
	
		
			
				|  |  |                  const idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
 | 
	
		
			
				|  |  |                  const idxL = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_LEFT]);
 | 
	
		
			
				|  |  |                  const idxB = theYPos.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
 | 
	
	
		
			
				|  | @@ -846,6 +846,37 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
 | 
	
		
			
				|  |  |          const spanX = xPos.length - 2;
 | 
	
		
			
				|  |  |          let cellIdx = 0;
 | 
	
		
			
				|  |  |          let h = 0;
 | 
	
		
			
				|  |  | +        const self_create_cell = function(cells, rows, theYPos) {
 | 
	
		
			
				|  |  | +            let rowIdx1 = 0;
 | 
	
		
			
				|  |  | +            let colIdx1 = 0;
 | 
	
		
			
				|  |  | +            let rowIdx2 = 0;
 | 
	
		
			
				|  |  | +            let colIdx2 = 0;
 | 
	
		
			
				|  |  | +            for (let cIdx = 0; cIdx < cells.length; cIdx++) {
 | 
	
		
			
				|  |  | +                const styleIdx = private_getStyleId(cells[cIdx]);
 | 
	
		
			
				|  |  | +                rowIdx1 = theYPos.indexOf(cells[cIdx][JV.PROP_AREA][JV.PROP_TOP]);
 | 
	
		
			
				|  |  | +                colIdx1 = xPos.indexOf(cells[cIdx][JV.PROP_AREA][JV.PROP_LEFT]);
 | 
	
		
			
				|  |  | +                let cellObj = rows[rowIdx1 - 1].items[colIdx1 - 1];
 | 
	
		
			
				|  |  | +                cellObj.s = styleIdx;
 | 
	
		
			
				|  |  | +                cellObj.isBlank = false;
 | 
	
		
			
				|  |  | +                if (!(strUtil.isEmptyString(cells[cIdx][JV.PROP_VALUE]))) {
 | 
	
		
			
				|  |  | +                    const valIdx = private_getSharedStrIdx(cells[cIdx][JV.PROP_VALUE]);
 | 
	
		
			
				|  |  | +                    cellObj.v = valIdx;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                rowIdx2 = theYPos.indexOf(cells[cIdx][JV.PROP_AREA][JV.PROP_BOTTOM]);
 | 
	
		
			
				|  |  | +                colIdx2 = xPos.indexOf(cells[cIdx][JV.PROP_AREA][JV.PROP_RIGHT]);
 | 
	
		
			
				|  |  | +                if ((rowIdx2 - rowIdx1 > 1) || (colIdx2 - colIdx1 > 1)) {
 | 
	
		
			
				|  |  | +                    for (let i = 0; i < rowIdx2 - rowIdx1; i++) {
 | 
	
		
			
				|  |  | +                        for (let j = 0; j < colIdx2 - colIdx1; j++) {
 | 
	
		
			
				|  |  | +                            if (i === 0 && j === 0) continue;
 | 
	
		
			
				|  |  | +                            cellObj = rows[rowIdx1 - 1 + i].items[colIdx1 - 1 + j];
 | 
	
		
			
				|  |  | +                            cellObj.s = styleIdx;
 | 
	
		
			
				|  |  | +                            cellObj.isBlank = true;
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  |          const self_setDataEx = function(theShtData, theYPos, rowOffset) {
 | 
	
		
			
				|  |  |              const rows = [];
 | 
	
		
			
				|  |  |              // 1. build full set of blank rows/cells
 | 
	
	
		
			
				|  | @@ -867,36 +898,10 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |              // 2. then fill up the cell style-ids and values
 | 
	
		
			
				|  |  | -            let rowIdx1 = 0;
 | 
	
		
			
				|  |  | -            let colIdx1 = 0;
 | 
	
		
			
				|  |  | -            let rowIdx2 = 0;
 | 
	
		
			
				|  |  | -            let colIdx2 = 0;
 | 
	
		
			
				|  |  | -            // let colIdxStr = '';
 | 
	
		
			
				|  |  | -            for (let cIdx = 0; cIdx < theShtData.cells.length; cIdx++) {
 | 
	
		
			
				|  |  | -                const styleIdx = private_getStyleId(theShtData.cells[cIdx]);
 | 
	
		
			
				|  |  | -                rowIdx1 = theYPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_TOP]);
 | 
	
		
			
				|  |  | -                colIdx1 = xPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_LEFT]);
 | 
	
		
			
				|  |  | -                let cellObj = rows[rowIdx1 - 1].items[colIdx1 - 1];
 | 
	
		
			
				|  |  | -                cellObj.s = styleIdx;
 | 
	
		
			
				|  |  | -                cellObj.isBlank = false;
 | 
	
		
			
				|  |  | -                if (!(strUtil.isEmptyString(theShtData.cells[cIdx][JV.PROP_VALUE]))) {
 | 
	
		
			
				|  |  | -                    const valIdx = private_getSharedStrIdx(theShtData.cells[cIdx][JV.PROP_VALUE]);
 | 
	
		
			
				|  |  | -                    cellObj.v = valIdx;
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | +            self_create_cell(theShtData[JV.PROP_CELLS], rows, theYPos);
 | 
	
		
			
				|  |  | +            self_create_cell(theShtData[JV.PROP_SIGNATURE_DATE_CELLS], rows, theYPos);
 | 
	
		
			
				|  |  | +            self_create_cell(theShtData[JV.PROP_SIGNATURE_AUDIT_CELLS], rows, theYPos);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                rowIdx2 = theYPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_BOTTOM]);
 | 
	
		
			
				|  |  | -                colIdx2 = xPos.indexOf(theShtData.cells[cIdx][JV.PROP_AREA][JV.PROP_RIGHT]);
 | 
	
		
			
				|  |  | -                if ((rowIdx2 - rowIdx1 > 1) || (colIdx2 - colIdx1 > 1)) {
 | 
	
		
			
				|  |  | -                    for (let i = 0; i < rowIdx2 - rowIdx1; i++) {
 | 
	
		
			
				|  |  | -                        for (let j = 0; j < colIdx2 - colIdx1; j++) {
 | 
	
		
			
				|  |  | -                            if (i === 0 && j === 0) continue;
 | 
	
		
			
				|  |  | -                            cellObj = rows[rowIdx1 - 1 + i].items[colIdx1 - 1 + j];
 | 
	
		
			
				|  |  | -                            cellObj.s = styleIdx;
 | 
	
		
			
				|  |  | -                            cellObj.isBlank = true;
 | 
	
		
			
				|  |  | -                        }
 | 
	
		
			
				|  |  | -                    }
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  |              // 3. then fill up rst
 | 
	
		
			
				|  |  |              for (let i = 0; i < rows.length; i++) {
 | 
	
		
			
				|  |  |                  rst.push('<row r="' + (i + 1 + rowOffset) + '" spans="1:' + spanX + '" ht="' + rows[i].height + '" customHeight="1">');
 | 
	
	
		
			
				|  | @@ -919,6 +924,11 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
 | 
	
		
			
				|  |  |              // current sheet data
 | 
	
		
			
				|  |  |              currentPageMergePos = sheetData[JV.PAGE_SPECIAL_MERGE_POS];
 | 
	
		
			
				|  |  |              currentMergeBorder = sheetData[JV.PROP_PAGE_MERGE_BORDER];
 | 
	
		
			
				|  |  | +            if (hasSignature && sheetData[JV.PROP_SIGNATURE_CELLS] && sheetData[JV.PROP_SIGNATURE_CELLS].length > 0) {
 | 
	
		
			
				|  |  | +                // 有签名情况下,还是有必要创建一个dummy cell的(画框用)
 | 
	
		
			
				|  |  | +                _createDummyCell(sheetData[JV.PROP_SIGNATURE_CELLS], sheetData);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              self_setDataEx(sheetData, yPos, 0);
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |              // total data in one sheet
 | 
	
	
		
			
				|  | @@ -929,6 +939,10 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj, ap
 | 
	
		
			
				|  |  |                  currentMergeBorder = shtItemData[JV.PROP_PAGE_MERGE_BORDER];
 | 
	
		
			
				|  |  |                  const tmpPos = yMultiPos[i];
 | 
	
		
			
				|  |  |                  cellIdx = 0;
 | 
	
		
			
				|  |  | +                if (hasSignature && shtItemData[JV.PROP_SIGNATURE_CELLS] && shtItemData[JV.PROP_SIGNATURE_CELLS].length > 0) {
 | 
	
		
			
				|  |  | +                    // 有签名情况下,还是有必要创建一个dummy cell的(画框用)
 | 
	
		
			
				|  |  | +                    _createDummyCell(shtItemData[JV.PROP_SIGNATURE_CELLS], shtItemData);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |                  self_setDataEx(shtItemData, tmpPos, rowOffset);
 | 
	
		
			
				|  |  |                  rowOffset += tmpPos.length - 2;
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -1241,21 +1255,6 @@ function createDummySignatureCell(pageData) {
 | 
	
		
			
				|  |  |          const page = pageData.items[pageIdx];
 | 
	
		
			
				|  |  |          if (page[JV.PROP_SIGNATURE_CELLS] && page[JV.PROP_SIGNATURE_CELLS].length > 0) {
 | 
	
		
			
				|  |  |              _createDummyCell(page[JV.PROP_SIGNATURE_CELLS], page);
 | 
	
		
			
				|  |  | -            // for (const signature of page[JV.PROP_SIGNATURE_CELLS]) {
 | 
	
		
			
				|  |  | -            //     const dummyCell = {
 | 
	
		
			
				|  |  | -            //         font: 'Content',
 | 
	
		
			
				|  |  | -            //         control: 'Default',
 | 
	
		
			
				|  |  | -            //         style: 'Default_None',
 | 
	
		
			
				|  |  | -            //         Value: '',
 | 
	
		
			
				|  |  | -            //         area: { Left: 0, Right: 0, Top: 0, Bottom: 0 }
 | 
	
		
			
				|  |  | -            //     };
 | 
	
		
			
				|  |  | -            //     if (signature.style) dummyCell.style = signature.style;
 | 
	
		
			
				|  |  | -            //     dummyCell[JV.PROP_AREA][JV.PROP_LEFT] = signature[JV.PROP_AREA][JV.PROP_LEFT];
 | 
	
		
			
				|  |  | -            //     dummyCell[JV.PROP_AREA][JV.PROP_RIGHT] = signature[JV.PROP_AREA][JV.PROP_RIGHT];
 | 
	
		
			
				|  |  | -            //     dummyCell[JV.PROP_AREA][JV.PROP_TOP] = signature[JV.PROP_AREA][JV.PROP_TOP];
 | 
	
		
			
				|  |  | -            //     dummyCell[JV.PROP_AREA][JV.PROP_BOTTOM] = signature[JV.PROP_AREA][JV.PROP_BOTTOM];
 | 
	
		
			
				|  |  | -            //     page[JV.PROP_CELLS].push(dummyCell);
 | 
	
		
			
				|  |  | -            // }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          if (page[JV.PROP_SIGNATURE_DATE_CELLS] && page[JV.PROP_SIGNATURE_DATE_CELLS].length > 0) {
 | 
	
		
			
				|  |  |              _createDummyCell(page[JV.PROP_SIGNATURE_DATE_CELLS], page);
 | 
	
	
		
			
				|  | @@ -1375,8 +1374,8 @@ module.exports = {
 | 
	
		
			
				|  |  |          resetDummuySignature(pageData, thisRoleRel); // 把草图转换一下roleRel
 | 
	
		
			
				|  |  |          // console.log(thisRoleRel);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        const hasSignature = false; // 暂时不支持电子签名、草图导出excel
 | 
	
		
			
				|  |  | -        // const hasSignature = _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, thisRoleRel, signSheetIdxArr); // 因草图的关系,thisRoleRel是否为null就不是充要的条件
 | 
	
		
			
				|  |  | +        // const hasSignature = false; // 暂时不支持电子签名、草图导出excel
 | 
	
		
			
				|  |  | +        const hasSignature = _checkAndSetSignatureCache(pageData, signKeyArr, signPathArr, thisRoleRel, signSheetIdxArr); // 因草图的关系,thisRoleRel是否为null就不是充要的条件
 | 
	
		
			
				|  |  |          // console.log('signKeyArr');
 | 
	
		
			
				|  |  |          // console.log(signKeyArr);
 | 
	
		
			
				|  |  |          // console.log('signPathArr');
 | 
	
	
		
			
				|  | @@ -1604,8 +1603,8 @@ module.exports = {
 | 
	
		
			
				|  |  |                          mergeBand[JV.PROP_BOTTOM].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM] + offsetY);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      // 1.2.1 重新设置普通cells的Top Bottom坐标
 | 
	
		
			
				|  |  | -                    for (const cell of pageDataArray[i].items[j].cells) {
 | 
	
		
			
				|  |  | -                    // for (let k = 0; k < pageDataArray[i].items[j].cells.length; k++) {
 | 
	
		
			
				|  |  | +                    for (const cell of pageDataArray[i].items[j][JV.PROP_CELLS]) {
 | 
	
		
			
				|  |  | +                    // for (let k = 0; k < pageDataArray[i].items[j][JV.PROP_CELLS].length; k++) {
 | 
	
		
			
				|  |  |                          if (maxY < cell[JV.PROP_AREA][JV.PROP_BOTTOM]) {
 | 
	
		
			
				|  |  |                              maxY = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
 | 
	
		
			
				|  |  |                          }
 | 
	
	
		
			
				|  | @@ -1616,7 +1615,7 @@ module.exports = {
 | 
	
		
			
				|  |  |                          cell[JV.PROP_AREA][JV.PROP_TOP] += offsetY;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      // 1.2.2 重新设置电子签名cells的Top Bottom坐标
 | 
	
		
			
				|  |  | -                    for (const cell of pageDataArray[i].items[j].signature_cells) {
 | 
	
		
			
				|  |  | +                    for (const cell of pageDataArray[i].items[j][JV.PROP_SIGNATURE_CELLS]) {
 | 
	
		
			
				|  |  |                          if (maxY < cell[JV.PROP_AREA][JV.PROP_BOTTOM]) {
 | 
	
		
			
				|  |  |                              maxY = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
 | 
	
		
			
				|  |  |                          }
 | 
	
	
		
			
				|  | @@ -1631,7 +1630,7 @@ module.exports = {
 | 
	
		
			
				|  |  |                          // console.log(cell);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      // 1.2.3 重新设置电子签名日期cells的Top Bottom坐标
 | 
	
		
			
				|  |  | -                    for (const cell of pageDataArray[i].items[j].signature_date_cells) {
 | 
	
		
			
				|  |  | +                    for (const cell of pageDataArray[i].items[j][JV.PROP_SIGNATURE_DATE_CELLS]) {
 | 
	
		
			
				|  |  |                          if (maxY < cell[JV.PROP_AREA][JV.PROP_BOTTOM]) {
 | 
	
		
			
				|  |  |                              maxY = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
 | 
	
		
			
				|  |  |                          }
 |