|
@@ -339,7 +339,6 @@ 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; //在 JV.PAGING_OPTION_INFINITY 场合应用
|
|
|
let private_pre_analyze_pos = function(){
|
|
|
let cell, pos;
|
|
@@ -380,11 +379,16 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
|
|
|
yPos.sort(private_array_sort);
|
|
|
} else {
|
|
|
//total data in one sheet
|
|
|
+ let marginBottomPos = Math.round( (pageData[JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1] - parseFloat(pageData[JV.NODE_PAGE_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]) / 2.54 ) * DPI);
|
|
|
for (let shtItemData of pageData.items) {
|
|
|
let tmpPos = [];
|
|
|
tmpPos.push(0);
|
|
|
self_analyze_sheet_pos(shtItemData, xPos, tmpPos);
|
|
|
tmpPos.sort(private_array_sort);
|
|
|
+ if (marginBottomPos - tmpPos[tmpPos.length - 1] > 10) {
|
|
|
+ //此逻辑是为了防止打印跨页(假设有些报表模板高度设置离底部margin还好远,导出excel后预览时会发现跨页现象(即下一页的某几行数据会挪到前一页来预览))
|
|
|
+ tmpPos.push(marginBottomPos - 10);
|
|
|
+ }
|
|
|
yMultiPos.push(tmpPos);
|
|
|
}
|
|
|
xPos.sort(private_array_sort);
|
|
@@ -627,20 +631,12 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
|
|
|
//remark: 1 excel unit width = 2.117 mm
|
|
|
rst.push('<cols>');
|
|
|
let w = 0;
|
|
|
- /*
|
|
|
- for (let i = 1; i < xPos.length - 1; i++) {
|
|
|
- w = 1.0 * (xPos[i + 1] - xPos[i]) / DPI * 25.4 / 2.117;
|
|
|
- w = Math.round(w * 1000) / 1000;
|
|
|
- rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
|
|
|
- }
|
|
|
- /*/
|
|
|
for (let i = 1; i < xPos.length - 1; i++) {
|
|
|
w = 1.0 * (xPos[i + 1] - xPos[i]) / DPI * 25.4 / 2.117;
|
|
|
w = Math.round(w * 1000) / 1000;
|
|
|
rst.push('<col min="' + i +'" max="' + i +'" width="' + w + '" customWidth="1"/>');
|
|
|
}
|
|
|
rst.push('<col min="' + (xPos.length - 1) +'" max="' + (xPos.length - 1) +'" width="' + 10 + '" customWidth="1"/>');
|
|
|
- //*/
|
|
|
rst.push('</cols>');
|
|
|
};
|
|
|
let private_setMergedCells = function() {
|
|
@@ -674,58 +670,11 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
|
|
|
rst[startIdx] = '<mergeCells count="' + cnt + '">';
|
|
|
rst.push('</mergeCells>');
|
|
|
};
|
|
|
- let private_chkIfNeedCacheCell = function(cell){
|
|
|
- let rst = false;
|
|
|
- if (cell[JV.PROP_AREA][JV.PROP_LEFT] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_LEFT] ||
|
|
|
- cell[JV.PROP_AREA][JV.PROP_RIGHT] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT] ||
|
|
|
- cell[JV.PROP_AREA][JV.PROP_TOP] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] ||
|
|
|
- cell[JV.PROP_AREA][JV.PROP_BOTTOM] === pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM]){
|
|
|
- if (cell[JV.PROP_AREA][JV.PROP_LEFT] >= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_LEFT] &&
|
|
|
- cell[JV.PROP_AREA][JV.PROP_RIGHT] <= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_RIGHT] &&
|
|
|
- cell[JV.PROP_AREA][JV.PROP_TOP] >= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP] &&
|
|
|
- cell[JV.PROP_AREA][JV.PROP_BOTTOM] <= pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM]) {
|
|
|
- rst = true;
|
|
|
- }
|
|
|
- }
|
|
|
- return rst;
|
|
|
- };
|
|
|
- let private_cacheMergeBandBorderIdxs = function() {
|
|
|
- let cell, idxR, idxL, idxT, idxB;
|
|
|
- let self_cachMergeIdxs = function (theData, theYPos, offsetY) {
|
|
|
- for (let i = 0; i < theData.cells.length; i++) {
|
|
|
- cell = theData.cells[i];
|
|
|
- idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
|
|
|
- idxL = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_LEFT]);
|
|
|
- idxB = theYPos.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
|
|
|
- idxT = theYPos.indexOf(cell[JV.PROP_AREA][JV.PROP_TOP]);
|
|
|
- if (idxR - idxL > 1 || idxB - idxT > 1) {
|
|
|
- if (private_chkIfNeedCacheCell(cell)) {
|
|
|
- for (let xi = idxL; xi < idxR; xi++) {
|
|
|
- for (let yj = idxT; yj < idxB; yj++) {
|
|
|
- cacheBorderCell[private_getCellIdxStr(xi - 1) + (yj + offsetY)] = cell;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (sheetData) {
|
|
|
- self_cachMergeIdxs(sheetData, yPos, 0);
|
|
|
- } else {
|
|
|
- let osY = 0;
|
|
|
- for (let i = 0; i < pageData.items.length; i++) {
|
|
|
- let shtItemData = pageData.items[i];
|
|
|
- let tmpPos = yMultiPos[i];
|
|
|
- self_cachMergeIdxs(shtItemData, tmpPos, osY);
|
|
|
- osY += tmpPos.length - 2;
|
|
|
- }
|
|
|
- }
|
|
|
- };
|
|
|
let private_setSheetData = function(){
|
|
|
//remark: 1 excel unit height = 0.3612 mm
|
|
|
rst.push('<sheetData>');
|
|
|
let spanX = xPos.length - 2, cellIdx = 0, h = 0
|
|
|
- ;
|
|
|
+ ;
|
|
|
let self_setDataEx = function (theShtData, theYPos, offsetY) {
|
|
|
let rows = [];
|
|
|
//1. build full set of blank rows/cells
|
|
@@ -791,7 +740,6 @@ function writeSheet(pageData, sheetData, paperSize, sharedStrList, stylesObj){
|
|
|
//4. maybe need to dispose the memory
|
|
|
//...
|
|
|
};
|
|
|
- //private_cacheMergeBandBorderIdxs();
|
|
|
if (sheetData) {
|
|
|
//current sheet data
|
|
|
currentPageMergePos = sheetData[JV.PAGE_SPECIAL_MERGE_POS];
|
|
@@ -938,12 +886,12 @@ module.exports = {
|
|
|
zip.generateNodeStream({type:'nodebuffer',streamFiles:true})
|
|
|
.pipe(fs.createWriteStream(__dirname.slice(0, __dirname.length - 21) + '/tmp/' + newName + '.xlsx'))
|
|
|
.on('finish', function () {
|
|
|
- // JSZip generates a readable stream with a "end" event,
|
|
|
- // but is piped here in a writable stream which emits a "finish" event.
|
|
|
- console.log(newName + ".xlsx was written.");
|
|
|
- if (callback) callback(newName);
|
|
|
- }
|
|
|
- );
|
|
|
+ // JSZip generates a readable stream with a "end" event,
|
|
|
+ // but is piped here in a writable stream which emits a "finish" event.
|
|
|
+ console.log(newName + ".xlsx was written.");
|
|
|
+ if (callback) callback(newName);
|
|
|
+ }
|
|
|
+ );
|
|
|
} else {
|
|
|
//return zip.generateNodeStream({type:'nodebuffer',streamFiles:true});
|
|
|
return zip;
|
|
@@ -1003,7 +951,11 @@ module.exports = {
|
|
|
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;
|
|
|
}
|
|
|
+ let bottomGap = Math.round( (pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_PAGE_SIZE][1] - parseFloat(pageDataArray[i][JV.NODE_PAGE_INFO][JV.NODE_MARGINS][JV.PROP_BOTTOM]) / 2.54 ) * DPI) - maxY;
|
|
|
offsetY += (maxY - minY);
|
|
|
+ if (bottomGap > 10) {
|
|
|
+ offsetY += (bottomGap - 10);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
//2. newPageData的items属性
|