瀏覽代碼

excel export ok

TonyKang 8 年之前
父節點
當前提交
e5013a2b5a
共有 1 個文件被更改,包括 38 次插入53 次删除
  1. 38 53
      modules/reports/util/rpt_excel_util.js

+ 38 - 53
modules/reports/util/rpt_excel_util.js

@@ -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(){
@@ -474,61 +475,45 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
         rst[startIdx] = '<mergeCells count="' + cnt + '">';
         rst.push('</mergeCells>');
     };
-    private_getMergeBandBorderIdxs = function(leftColIdxStr, rightColIdxStr) {
-        var rst = [];
-        rst.push(leftColIdxStr);
-        rst.push(rightColIdxStr);
-        rst.push('' + yPos.indexOf(parseInt(pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_TOP])));
-        rst.push('' + yPos.indexOf(parseInt(pageData[JV.BAND_PROP_MERGE_BAND][JV.PROP_BOTTOM])));
+    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_chkBorderStyle = function(preStyleId, mergedBorder, yIdx, colIdxStr){
-        var rst = preStyleId, preStyle = stylesObj.cellXfs[preStyleId], hasStyle = false, chkBorders = [],
-            mergeBorder = pageData[JV.BAND_PROP_MERGE_BAND],
-            destStyle = pageData[JV.NODE_STYLE_COLLECTION][mergeBorder[JV.PROP_STYLE][JV.PROP_ID]];
-        if (yIdx == mergedBorder[2]) {
-            chkBorders.push(JV.PROP_TOP);
-        } else if (yIdx == mergedBorder[3]) {
-            chkBorders.push(JV.PROP_BOTTOM);
-        }
-        if (colIdxStr == mergedBorder[0]) {
-            chkBorders.push(JV.PROP_LEFT);
-        } else if (colIdxStr == mergedBorder[0]) {
-            chkBorders.push(JV.PROP_RIGHT);
-        }
-        if (chkBorders.length > 0) {
-            for (var i = 0; i < stylesObj.cellXfs.length; i++) {
-                var border = stylesObj.borders[stylesObj.cellXfs[i].borderId];
-                var isMatch = true;
-                for (var j = 0; j < chkBorders.length; j++) {
-                    if (border[chkBorders[j]][JV.PROP_LINE_WEIGHT] != destStyle[chkBorders[j]][JV.PROP_LINE_WEIGHT]) {
-                        isMatch = false;
-                        break;
+    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;
+                        }
                     }
                 }
-                if (isMatch) {
-                    hasStyle = true;
-                    rst = i;
-                    break;
-                }
-            }
-            if (!hasStyle) {
-                var sheetControl = {};
-                sheetControl.fontId = preStyle.fontId;
-                var border = private_getIniBorder();
-                for (var j = 0; j < chkBorders.length; j++) {
-                    border[chkBorders[j]][JV.PROP_LINE_WEIGHT] = destStyle[chkBorders[j]][JV.PROP_LINE_WEIGHT];
-                }
-                stylesObj.borders.push(border);
-                sheetControl.borderId = stylesObj.borders.length - 1;
-
-                for (var i = 0; i < JV.CONTROL_PROPS.length; i++) {
-                    sheetControl[JV.CONTROL_PROPS[i]] = preStyle[JV.CONTROL_PROPS[i]];
-                }
-                stylesObj.cellXfs.push(sheetControl);
-                rst = stylesObj.cellXfs.length - 1;
             }
         }
+    };
+    private_getMergedCellStyleId = function(preStyleId, colIdxStr) {
+        var rst = preStyleId;
+        if (cacheBorderCell[colIdxStr]) {
+            rst = private_getStyleId(cacheBorderCell[colIdxStr]);
+        }
         return rst;
     };
     private_setSheetData = function(){
@@ -536,9 +521,9 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
         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]),
-            mergedBorder = private_getMergeBandBorderIdxs('A', private_getCellIdxStr(spanX))
+            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;
@@ -591,11 +576,11 @@ function writeSheet(pageData, sheetData, sharedStrList, stylesObj){
                         hasMoreCols = false;
                     } else {
                         //rst.push('<c r="' + colIdxStr + i + '" s="' + preStyleIdx + '"/>');
-                        rst.push('<c r="' + colIdxStr + i + '" s="' + private_chkBorderStyle(preStyleIdx, mergedBorder, i, colIdxStr) + '"/>');
+                        rst.push('<c r="' + colIdxStr + i + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i) + '"/>');
                     }
                 } else {
                     //rst.push('<c r="' + colIdxStr + i + '" s="' + preStyleIdx + '"/>');
-                    rst.push('<c r="' + colIdxStr + i + '" s="' + private_chkBorderStyle(preStyleIdx, mergedBorder, i, colIdxStr) + '"/>');
+                    rst.push('<c r="' + colIdxStr + i + '" s="' + private_getMergedCellStyleId(preStyleIdx, colIdxStr + i) + '"/>');
                 }
             }
             rst.push('</row>');