|
@@ -7,6 +7,7 @@ let JSZip = require("jszip");
|
|
|
let strUtil = require('../../../public/stringUtil');
|
|
|
let jpcCmnHelper = require('../rpt_component/helper/jpc_helper_common');
|
|
|
let DPI = jpcCmnHelper.getScreenDPI()[0];
|
|
|
+let fsUtil = require('../../../public/fsUtil');
|
|
|
const dftHeadXml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
|
|
|
|
|
|
function writeContentTypes(sheets, isSinglePage) {
|
|
@@ -331,6 +332,7 @@ function writeSheets(pageData, paperSize, sharedStrList, stylesObj, isSinglePage
|
|
|
function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
|
|
|
let rst = [], xPos = [], yPos = [], yMultiPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
|
let cacheBorderCell = {};
|
|
|
+ let currentPageMergePos = null;
|
|
|
let private_pre_analyze_pos = function(){
|
|
|
let cell, pos;
|
|
|
let self_analyze_sheet_pos = function (theShtData, theXPos, theYPos) {
|
|
@@ -446,22 +448,22 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
|
|
|
borderLineWidths.push(border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]);
|
|
|
borderLineWidths.push(border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]);
|
|
|
if (sheetBorder[JV.PROP_LEFT] && sheetBorder[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]) {
|
|
|
- sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_LEFT));
|
|
|
+ sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_LEFT, true));
|
|
|
} else {
|
|
|
sheetBorderLineWidths.push(0);
|
|
|
}
|
|
|
if (sheetBorder[JV.PROP_RIGHT] && sheetBorder[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]) {
|
|
|
- sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_RIGHT));
|
|
|
+ sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_RIGHT, true));
|
|
|
} else {
|
|
|
sheetBorderLineWidths.push(0);
|
|
|
}
|
|
|
if (sheetBorder[JV.PROP_TOP] && sheetBorder[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]) {
|
|
|
- sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_TOP));
|
|
|
+ sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_TOP, false));
|
|
|
} else {
|
|
|
sheetBorderLineWidths.push(0);
|
|
|
}
|
|
|
if (sheetBorder[JV.PROP_BOTTOM] && sheetBorder[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]) {
|
|
|
- sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_BOTTOM));
|
|
|
+ sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_BOTTOM, false));
|
|
|
} else {
|
|
|
sheetBorderLineWidths.push(0);
|
|
|
}
|
|
@@ -473,14 +475,45 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
|
|
|
}
|
|
|
return rst;
|
|
|
};
|
|
|
- let private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr) {
|
|
|
+ let private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr, needFurtherChk) {
|
|
|
let rst = 0, mergeBorder = pageData[JV.BAND_PROP_MERGE_BAND];
|
|
|
- if (sheetBorder[borderStr] && sheetBorder[borderStr][JV.PROP_LINE_WEIGHT] != undefined) {
|
|
|
+ if (sheetBorder[borderStr] && sheetBorder[borderStr][JV.PROP_LINE_WEIGHT] !== undefined) {
|
|
|
rst = sheetBorder[borderStr][JV.PROP_LINE_WEIGHT];
|
|
|
}
|
|
|
- if (cell[JV.PROP_AREA][borderStr] == mergeBorder[borderStr]) {
|
|
|
- let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
|
|
|
- rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
|
|
|
+ if (currentPageMergePos) {
|
|
|
+ let side = currentPageMergePos[borderStr];
|
|
|
+ if (side.indexOf(cell[JV.PROP_AREA][borderStr]) >= 0) {
|
|
|
+ if (needFurtherChk) {
|
|
|
+ let topSide = currentPageMergePos[JV.PROP_TOP];
|
|
|
+ let bottomSide = currentPageMergePos[JV.PROP_BOTTOM];
|
|
|
+ for (let i = 0; i < topSide.length; i++) {
|
|
|
+ if (cell[JV.PROP_AREA][JV.PROP_TOP] >= topSide[i]) {
|
|
|
+ if (cell[JV.PROP_AREA][JV.PROP_BOTTOM] <= bottomSide[i]) {
|
|
|
+ let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
|
|
|
+ rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
|
|
|
+ rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (cell[JV.PROP_AREA][borderStr] === mergeBorder[borderStr]) {
|
|
|
+ let destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
|
|
|
+ if (needFurtherChk) {
|
|
|
+ if (cell[JV.PROP_AREA][JV.PROP_TOP] >= mergeBorder[JV.PROP_TOP] &&
|
|
|
+ cell[JV.PROP_AREA][JV.PROP_BOTTOM] <= mergeBorder[JV.PROP_BOTTOM]) {
|
|
|
+ rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
return parseInt(rst);
|
|
|
};
|
|
@@ -503,10 +536,10 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
|
|
|
}
|
|
|
let sheetBorder = pageData[JV.NODE_STYLE_COLLECTION][cell.style];
|
|
|
let mergedBorder = private_getIniBorder();
|
|
|
- mergedBorder[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_LEFT);
|
|
|
- mergedBorder[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_RIGHT);
|
|
|
- mergedBorder[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_TOP);
|
|
|
- mergedBorder[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_BOTTOM);
|
|
|
+ mergedBorder[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_LEFT, true);
|
|
|
+ mergedBorder[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_RIGHT, true);
|
|
|
+ mergedBorder[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_TOP, false);
|
|
|
+ mergedBorder[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_BOTTOM, false);
|
|
|
for (let i = 0; i < stylesObj.borders.length; i++) {
|
|
|
let border = stylesObj.borders[i];
|
|
|
if (private_checkBorder(cell, border, mergedBorder)) {
|
|
@@ -723,12 +756,14 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
|
|
|
private_cacheMergeBandBorderIdxs();
|
|
|
if (sheetData) {
|
|
|
//current sheet data
|
|
|
+ currentPageMergePos = sheetData[JV.PAGE_SPECIAL_MERGE_POS];
|
|
|
self_setDataEx(sheetData, yPos, 0);
|
|
|
} else {
|
|
|
//total data in one sheet
|
|
|
let cnt = 0;
|
|
|
for (let i = 0; i < pageData.items.length; i++) {
|
|
|
let shtItemData = pageData.items[i];
|
|
|
+ currentPageMergePos = shtItemData[JV.PAGE_SPECIAL_MERGE_POS];
|
|
|
let tmpPos = yMultiPos[i];
|
|
|
cellIdx = 0;
|
|
|
self_setDataEx(shtItemData, tmpPos, cnt);
|
|
@@ -758,15 +793,30 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
|
|
|
if (paperSizeIdx >= 0) {
|
|
|
pStr = 'paperSize="' + JV.PAGES_SIZE_IDX[paperSizeIdx] + '"';
|
|
|
}
|
|
|
- let orientationStr = (pageData[JV.NODE_PAGE_INFO][0] > pageData[JV.NODE_PAGE_INFO][1])?'landscape':'portrait';
|
|
|
+ let orientationStr = (pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][0] > pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1])?'landscape':'portrait';
|
|
|
rst.push('<pageSetup ' + pStr + ' fitToWidth="0" fitToHeight="0" orientation="' + orientationStr + '" />');
|
|
|
rst.push('<headerFooter alignWithMargins="0"/>');
|
|
|
rst.push('</worksheet>');
|
|
|
return rst;
|
|
|
}
|
|
|
|
|
|
+function mergeProperties(orgObj, newObj) {
|
|
|
+ let orgPropArr = [], newPropArr = [];
|
|
|
+ for (let p in orgObj) {
|
|
|
+ orgPropArr.push(p);
|
|
|
+ }
|
|
|
+ for (let p in newObj) {
|
|
|
+ newPropArr.push(p);
|
|
|
+ }
|
|
|
+ for (let i = 0; i < newPropArr.length; i++) {
|
|
|
+ if (orgPropArr.indexOf(newPropArr[i]) < 0) {
|
|
|
+ orgObj[newPropArr[i]] = newObj[newPropArr[i]];
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
module.exports = {
|
|
|
- exportExcel: function (pageData, paperSize, fName, options, callback) {
|
|
|
+ exportExcel: function (pageData, paperSize, fName, options, custSheetNames, callback) {
|
|
|
let rptOptions = ({singlePage: false, fileName: 'report'});
|
|
|
if (options === 'true') {
|
|
|
rptOptions.singlePage = true;
|
|
@@ -776,8 +826,14 @@ module.exports = {
|
|
|
if (isSinglePage) {
|
|
|
sheets.push({sheetName: '全部页'});
|
|
|
} else {
|
|
|
- for (let i = 0; i < pageData.items.length; i++) {
|
|
|
- sheets.push({sheetName: '第' + (i + 1) + '页'});
|
|
|
+ if (custSheetNames && custSheetNames.length === pageData.items.length) {
|
|
|
+ for (let i = 0; i < pageData.items.length; i++) {
|
|
|
+ sheets.push({sheetName: custSheetNames[i]});
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ for (let i = 0; i < pageData.items.length; i++) {
|
|
|
+ sheets.push({sheetName: '第' + (i + 1) + '页'});
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
//1.
|
|
@@ -849,5 +905,76 @@ module.exports = {
|
|
|
//return zip.generateNodeStream({type:'nodebuffer',streamFiles:true});
|
|
|
return zip;
|
|
|
}
|
|
|
+ },
|
|
|
+
|
|
|
+ exportExcelInOneBook: function (pageDataArray, paperSize, fName, callback) {
|
|
|
+ let me = this, newPageData = {};
|
|
|
+ //1. 重新编排一下数据,把一份报表的pageData合并到一起作为一个Sheet输出(需要重新调整数据纵向坐标),多份报表数据就形成多个Sheet
|
|
|
+ // -- 简单来说,就是重新包装数据
|
|
|
+ try {
|
|
|
+ // 1.1 newPageData外围属性
|
|
|
+ let newContrl = {}, newFont = {}, newStyle = {};
|
|
|
+ for (let i = 0; i < pageDataArray.length; i++) {
|
|
|
+ mergeProperties(newContrl, pageDataArray[i][JV.NODE_CONTROL_COLLECTION]);
|
|
|
+ mergeProperties(newFont, pageDataArray[i][JV.NODE_FONT_COLLECTION]);
|
|
|
+ mergeProperties(newStyle, pageDataArray[i][JV.NODE_STYLE_COLLECTION]);
|
|
|
+ }
|
|
|
+ newPageData[JV.NODE_CONTROL_COLLECTION] = newContrl;
|
|
|
+ newPageData[JV.NODE_FONT_COLLECTION] = newFont;
|
|
|
+ newPageData[JV.NODE_STYLE_COLLECTION] = newStyle;
|
|
|
+ newPageData[JV.NODE_PAGE_INFO] = pageDataArray[0][JV.NODE_PAGE_INFO];
|
|
|
+ newPageData[JV.BAND_PROP_MERGE_BAND] = pageDataArray[0][JV.BAND_PROP_MERGE_BAND];
|
|
|
+
|
|
|
+ // 1.2 重新设置pageDataArray的各个cell的Top/Bottom坐标
|
|
|
+ let sheetNames = [], newPagePos = [];
|
|
|
+ for (let i = 0; i < pageDataArray.length; i++) {
|
|
|
+ let offsetY = 0;
|
|
|
+ let mergeBand = {};
|
|
|
+ mergeBand[JV.PROP_LEFT] = [];
|
|
|
+ mergeBand[JV.PROP_RIGHT] = [];
|
|
|
+ mergeBand[JV.PROP_TOP] = [];
|
|
|
+ mergeBand[JV.PROP_BOTTOM] = [];
|
|
|
+ newPagePos.push(mergeBand);
|
|
|
+ mergeBand[JV.PROP_LEFT].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_LEFT]);
|
|
|
+ mergeBand[JV.PROP_RIGHT].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT]);
|
|
|
+ sheetNames.push(pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_MAIN_INFO_RPT_NAME]);
|
|
|
+
|
|
|
+ for (let j = 0; j < pageDataArray[i].items.length; j++) {
|
|
|
+ let maxY = 0, minY = 100000;
|
|
|
+ mergeBand[JV.PROP_TOP].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] + offsetY);
|
|
|
+ mergeBand[JV.PROP_BOTTOM].push(pageDataArray[i][JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM] + offsetY);
|
|
|
+ for (let k = 0; k < pageDataArray[i].items[j].cells.length; k++) {
|
|
|
+ if (maxY < pageDataArray[i].items[j].cells[k][JV.PROP_AREA][JV.PROP_BOTTOM]) {
|
|
|
+ maxY = pageDataArray[i].items[j].cells[k][JV.PROP_AREA][JV.PROP_BOTTOM];
|
|
|
+ }
|
|
|
+ if (minY > pageDataArray[i].items[j].cells[k][JV.PROP_AREA][JV.PROP_TOP]) {
|
|
|
+ minY = pageDataArray[i].items[j].cells[k][JV.PROP_AREA][JV.PROP_TOP];
|
|
|
+ }
|
|
|
+ pageDataArray[i].items[j].cells[k][JV.PROP_AREA][JV.PROP_BOTTOM] += offsetY;
|
|
|
+ pageDataArray[i].items[j].cells[k][JV.PROP_AREA][JV.PROP_TOP] += offsetY;
|
|
|
+ }
|
|
|
+ offsetY += (maxY - minY);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //2. newPageData的items属性
|
|
|
+ newPageData.items = [];
|
|
|
+ for (let i = 0; i < pageDataArray.length; i++) {
|
|
|
+ let pageItem = {};
|
|
|
+ pageItem[JV.PROP_PAGE_SEQ] = i + 1;
|
|
|
+ pageItem[JV.PROP_CELLS] = [];
|
|
|
+ for (let j = 0; j < pageDataArray[i].items.length; j++) {
|
|
|
+ for (let k = 0; k < pageDataArray[i].items[j].cells.length; k++) {
|
|
|
+ pageItem[JV.PROP_CELLS].push(pageDataArray[i].items[j].cells[k]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pageItem[JV.PAGE_SPECIAL_MERGE_POS] = newPagePos[i];
|
|
|
+ newPageData.items.push(pageItem);
|
|
|
+ }
|
|
|
+ //3. everything is ok, then call me
|
|
|
+ me.exportExcel(newPageData, paperSize, fName, 'false', sheetNames, callback);
|
|
|
+ fsUtil.wirteObjToFile(newPageData, 'D:/GitHome/ConstructionOperation/tmp/combinedHeader.js');
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e);
|
|
|
+ }
|
|
|
}
|
|
|
}
|