|
@@ -154,7 +154,7 @@ function writeStyles(stylesObj){
|
|
|
rst.push('<' + borderDirection.toLowerCase() + '/>');
|
|
|
} else {
|
|
|
var bW = 'thin';
|
|
|
- if (border[borderDirection][JV.PROP_LINE_WEIGHT] = 2) bW = 'medium';
|
|
|
+ if (border[borderDirection][JV.PROP_LINE_WEIGHT] == 2) bW = 'medium';
|
|
|
if (border[borderDirection][JV.PROP_LINE_WEIGHT] > 2) bW = 'thick';
|
|
|
rst.push('<' + borderDirection.toLowerCase() + ' style="' + bW + '">' + '<color indexed="64"/>' + '</' + borderDirection.toLowerCase() + '>');
|
|
|
}
|
|
@@ -229,6 +229,7 @@ function writeSheets(pageData, sharedStrList, stylesObj){
|
|
|
}
|
|
|
function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
|
|
|
var rst = [], xPos = [], yPos = [], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
|
+ var cacheBorderCell = {};
|
|
|
xPos.push(0);
|
|
|
yPos.push(0);
|
|
|
private_pre_analyze_pos = function(){
|
|
@@ -320,29 +321,29 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
|
|
|
}
|
|
|
return rst;
|
|
|
};
|
|
|
- private_checkBorder = function(border, sheetBorder) {
|
|
|
+ private_checkBorder = function(cell, border, sheetBorder) {
|
|
|
var rst = true, borderLineWidths = [], sheetBorderLineWidths = [];
|
|
|
borderLineWidths.push(border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]);
|
|
|
borderLineWidths.push(border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]);
|
|
|
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(parseInt(sheetBorder[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]));
|
|
|
+ sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_LEFT));
|
|
|
} else {
|
|
|
sheetBorderLineWidths.push(0);
|
|
|
}
|
|
|
if (sheetBorder[JV.PROP_RIGHT] && sheetBorder[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]) {
|
|
|
- sheetBorderLineWidths.push(parseInt(sheetBorder[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]));
|
|
|
+ sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_RIGHT));
|
|
|
} else {
|
|
|
sheetBorderLineWidths.push(0);
|
|
|
}
|
|
|
if (sheetBorder[JV.PROP_TOP] && sheetBorder[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]) {
|
|
|
- sheetBorderLineWidths.push(parseInt(sheetBorder[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]));
|
|
|
+ sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_TOP));
|
|
|
} else {
|
|
|
sheetBorderLineWidths.push(0);
|
|
|
}
|
|
|
if (sheetBorder[JV.PROP_BOTTOM] && sheetBorder[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]) {
|
|
|
- sheetBorderLineWidths.push(parseInt(sheetBorder[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]));
|
|
|
+ sheetBorderLineWidths.push(private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_BOTTOM));
|
|
|
} else {
|
|
|
sheetBorderLineWidths.push(0);
|
|
|
}
|
|
@@ -354,41 +355,53 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
|
|
|
}
|
|
|
return rst;
|
|
|
};
|
|
|
+ private_chkAndGetMergeLine = function(cell, sheetBorder, borderStr) {
|
|
|
+ var rst = sheetBorder[borderStr][JV.PROP_LINE_WEIGHT], mergeBorder = pageData[JV.BAND_PROP_MERGE_BAND];
|
|
|
+ if (cell[JV.PROP_AREA][borderStr] == mergeBorder[borderStr]) {
|
|
|
+ var destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
|
|
|
+ rst = destStyle[borderStr][JV.PROP_LINE_WEIGHT];
|
|
|
+ }
|
|
|
+ return parseInt(rst);
|
|
|
+ };
|
|
|
+ private_getIniBorder = function() {
|
|
|
+ var rst = {};
|
|
|
+ rst[JV.PROP_LEFT] = {};
|
|
|
+ rst[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = 0;
|
|
|
+ rst[JV.PROP_RIGHT] = {};
|
|
|
+ rst[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = 0;
|
|
|
+ rst[JV.PROP_TOP] = {};
|
|
|
+ rst[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = 0;
|
|
|
+ rst[JV.PROP_BOTTOM] = {};
|
|
|
+ rst[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = 0;
|
|
|
+ return rst;
|
|
|
+ };
|
|
|
private_getBorderId = function(cell) {
|
|
|
var rst = 0, hasBorder = false;
|
|
|
if (!(stylesObj.borders)) {
|
|
|
stylesObj.borders = [];
|
|
|
}
|
|
|
- var sheetBorder = pageData.style_collection[cell.style];
|
|
|
+ var sheetBorder = pageData[JV.NODE_STYLE_COLLECTION][cell.style];
|
|
|
for (var i = 0; i < stylesObj.borders.length; i++) {
|
|
|
var border = stylesObj.borders[i];
|
|
|
- if (private_checkBorder(border, sheetBorder)) {
|
|
|
+ if (private_checkBorder(cell, border, sheetBorder)) {
|
|
|
hasBorder = true;
|
|
|
rst = i;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (!hasBorder) {
|
|
|
- var border = {};
|
|
|
- border[JV.PROP_LEFT] = {};
|
|
|
- border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = 0;
|
|
|
- border[JV.PROP_RIGHT] = {};
|
|
|
- border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = 0;
|
|
|
- border[JV.PROP_TOP] = {};
|
|
|
- border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = 0;
|
|
|
- border[JV.PROP_BOTTOM] = {};
|
|
|
- border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = 0;
|
|
|
+ var border = private_getIniBorder();
|
|
|
if (sheetBorder && sheetBorder[JV.PROP_LEFT]) {
|
|
|
- border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = parseInt(sheetBorder[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT]);
|
|
|
+ border[JV.PROP_LEFT][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_LEFT);
|
|
|
}
|
|
|
if (sheetBorder && sheetBorder[JV.PROP_RIGHT]) {
|
|
|
- border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = parseInt(sheetBorder[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT]);
|
|
|
+ border[JV.PROP_RIGHT][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_RIGHT);
|
|
|
}
|
|
|
if (sheetBorder && sheetBorder[JV.PROP_TOP]) {
|
|
|
- border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = parseInt(sheetBorder[JV.PROP_TOP][JV.PROP_LINE_WEIGHT]);
|
|
|
+ border[JV.PROP_TOP][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_TOP);
|
|
|
}
|
|
|
if (sheetBorder && sheetBorder[JV.PROP_BOTTOM]) {
|
|
|
- border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = parseInt(sheetBorder[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT]);
|
|
|
+ border[JV.PROP_BOTTOM][JV.PROP_LINE_WEIGHT] = private_chkAndGetMergeLine(cell, sheetBorder, JV.PROP_BOTTOM);
|
|
|
}
|
|
|
stylesObj.borders.push(border);
|
|
|
rst = stylesObj.borders.length - 1;
|
|
@@ -462,12 +475,55 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
|
|
|
rst[startIdx] = '<mergeCells count="' + cnt + '">';
|
|
|
rst.push('</mergeCells>');
|
|
|
};
|
|
|
+ private_chkIfNeedCacheCell = function(cell){
|
|
|
+ var 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;
|
|
|
+ };
|
|
|
+ private_cacheMergeBandBorderIdxs = function() {
|
|
|
+ var cell, idxR, idxL, idxT, idxB;
|
|
|
+ for (var i = 0; i < sheetData.cells.length; i++) {
|
|
|
+ cell = sheetData.cells[i];
|
|
|
+ idxR = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_RIGHT]);
|
|
|
+ idxL = xPos.indexOf(cell[JV.PROP_AREA][JV.PROP_LEFT]);
|
|
|
+ idxB = yPos.indexOf(cell[JV.PROP_AREA][JV.PROP_BOTTOM]);
|
|
|
+ idxT = yPos.indexOf(cell[JV.PROP_AREA][JV.PROP_TOP]);
|
|
|
+ if (idxR - idxL > 1 || idxB - idxT > 1) {
|
|
|
+ if (private_chkIfNeedCacheCell(cell)) {
|
|
|
+ for (var xi = idxL; xi < idxR; xi++) {
|
|
|
+ for (var yj = idxT; yj < idxB; yj++) {
|
|
|
+ cacheBorderCell[private_getCellIdxStr(xi - 1) + yj] = cell;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ private_getMergedCellStyleId = function(preStyleId, colIdxStr) {
|
|
|
+ var rst = preStyleId;
|
|
|
+ if (cacheBorderCell[colIdxStr]) {
|
|
|
+ rst = private_getStyleId(cacheBorderCell[colIdxStr]);
|
|
|
+ }
|
|
|
+ return rst;
|
|
|
+ };
|
|
|
private_setSheetData = function(){
|
|
|
//remark: 1 excel height = 0.3612 mm
|
|
|
rst.push('<sheetData>');
|
|
|
var spanX = xPos.length - 2, cellIdx = 0, h = 0,
|
|
|
hasMoreCols = true, nextColIdx = -1,
|
|
|
- nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP]);
|
|
|
+ nextRowIdx = yPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_TOP])
|
|
|
+ ;
|
|
|
+ private_cacheMergeBandBorderIdxs();
|
|
|
for (var i = 1; i < yPos.length - 1; i++) {
|
|
|
h = 1.0 * (yPos[i+1] - yPos[i]) / DPI * 25.4 / 0.3612;
|
|
|
h = Math.round(h * 1000) / 1000;
|
|
@@ -487,11 +543,13 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
|
|
|
hasMoreCols = false;
|
|
|
}
|
|
|
nextColIdx = xPos.indexOf(sheetData.cells[cellIdx][JV.PROP_AREA][JV.PROP_LEFT]);
|
|
|
- for (var j = 1; j < xPos.length; j++) {
|
|
|
+ var preStyleIdx = 1;
|
|
|
+ for (var j = 1; j < xPos.length - 1; j++) {
|
|
|
colIdxStr = private_getCellIdxStr(j - 1);
|
|
|
if (hasMoreCols) {
|
|
|
if (nextColIdx == j) {
|
|
|
var styleIdx = private_getStyleId(sheetData.cells[cellIdx]);
|
|
|
+ preStyleIdx = styleIdx;
|
|
|
if (strUtil.isEmptyString(sheetData.cells[cellIdx][JV.PROP_VALUE])) {
|
|
|
rst.push('<c r="' + colIdxStr + i + '" s="' + styleIdx + '"/>');
|
|
|
//should setup the right style instead!
|
|
@@ -517,10 +575,12 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
|
|
|
console.log('has abnormal case!');
|
|
|
hasMoreCols = false;
|
|
|
} else {
|
|
|
- rst.push('<c r="' + colIdxStr + i + '" s="1"/>');
|
|
|
+ //rst.push('<c r="' + colIdxStr + i + '" s="' + preStyleIdx + '"/>');
|
|
|
+ rst.push('<c r="' + colIdxStr + i + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i) + '"/>');
|
|
|
}
|
|
|
} else {
|
|
|
- rst.push('<c r="' + colIdxStr + i + '" s="1"/>');
|
|
|
+ //rst.push('<c r="' + colIdxStr + i + '" s="' + preStyleIdx + '"/>');
|
|
|
+ rst.push('<c r="' + colIdxStr + i + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i) + '"/>');
|
|
|
}
|
|
|
}
|
|
|
rst.push('</row>');
|
|
@@ -550,7 +610,7 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
|
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
|
- exportExcel: function (pageData, options) {
|
|
|
+ exportExcel: function (pageData, fName, options) {
|
|
|
var rptOptions = (options || {singlePage: false, fileName: 'report'});
|
|
|
var sheets = [];
|
|
|
for (var i = 0; i < pageData.items.length; i++) {
|
|
@@ -605,7 +665,7 @@ module.exports = {
|
|
|
|
|
|
zip.generateNodeStream({type:'nodebuffer',streamFiles:true})
|
|
|
//.pipe(fs.createWriteStream('../../../tmp/outExcel.xlsx'))
|
|
|
- .pipe(fs.createWriteStream('../../../tmp/outExcel.zip'))
|
|
|
+ .pipe(fs.createWriteStream('../../../tmp/' + fName + '.zip'))
|
|
|
.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.
|
|
@@ -613,34 +673,4 @@ module.exports = {
|
|
|
}
|
|
|
);
|
|
|
}
|
|
|
- ,testWriteContentTypes: function(sheets) {
|
|
|
- return writeContentTypes(sheets);
|
|
|
- }
|
|
|
- ,testWriteRootRels: function() {
|
|
|
- return writeRootRels();
|
|
|
- }
|
|
|
- ,testWriteApp: function(sheets) {
|
|
|
- return writeApp(sheets);
|
|
|
- }
|
|
|
- ,testWriteCore: function() {
|
|
|
- return writeCore();
|
|
|
- }
|
|
|
- ,testWriteXlWorkBook: function(sheets) {
|
|
|
- return writeXlWorkBook(sheets);
|
|
|
- }
|
|
|
- ,testWriteXlRels: function(sheets) {
|
|
|
- return writeXlRels(sheets);
|
|
|
- }
|
|
|
- ,testWriteSheets: function(pageData, sharedStrList, stylesObj){
|
|
|
- return writeSheets(pageData, sharedStrList, stylesObj);
|
|
|
- }
|
|
|
- ,testWriteSharedString: function(sharedStrList){
|
|
|
- return writeSharedString(sharedStrList);
|
|
|
- }
|
|
|
- ,testWriteTheme: function() {
|
|
|
- return writeTheme();
|
|
|
- }
|
|
|
- ,testWriteStyles: function(stylesObj) {
|
|
|
- return writeStyles(stylesObj);
|
|
|
- }
|
|
|
}
|