Quellcode durchsuchen

sync excel output

TonyKang vor 8 Jahren
Ursprung
Commit
d058393f80
1 geänderte Dateien mit 113 neuen und 31 gelöschten Zeilen
  1. 113 31
      modules/reports/util/rpt_excel_util.js

+ 113 - 31
modules/reports/util/rpt_excel_util.js

@@ -3,6 +3,8 @@
  */
 var JV = require('../rpt_component/Jpc_ValueDefine');
 var fs = require('fs');
+var jpcCmnHelper = require('../rpt_component/helper/Jpc_Helper_Common');
+var DPI = jpcCmnHelper.getScreenDPI()[0];
 const dftHeadXml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
 
 function writeContentTypes(sheets) {
@@ -134,55 +136,135 @@ function writeSheets(pageData){
         //
     }
 }
-function writeSheet(sheetData, sharedStrList){
-    var rst = [], x = [0], y = [0], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+function writeSheet(sheetData, sharedStrList, styleList){
+    var rst = [], xPos = [0], yPos = [0], headerStr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
     private_pre_analyze_pos = function(){
         var cell, pos;
+        sheetData.cells.sort(function(cell1, cell2) {
+            var rst = 0;
+            if (cell1[JV.PROP_AREA][JV.PROP_TOP] > cell2[JV.PROP_AREA][JV.PROP_TOP]) {
+                rst = 1;
+            } else if (cell1[JV.PROP_AREA][JV.PROP_TOP] < cell2[JV.PROP_AREA][JV.PROP_TOP]) {
+                rst = -1;
+            } else {
+                if (cell1[JV.PROP_AREA][JV.PROP_LEFT] > cell2[JV.PROP_AREA][JV.PROP_LEFT]) {
+                    rst = 1;
+                } else if (cell1[JV.PROP_AREA][JV.PROP_LEFT] < cell2[JV.PROP_AREA][JV.PROP_LEFT]) {
+                    rst = -1;
+                }
+            }
+        });
         for (var i = 0; i < sheetData.cells.length; i++) {
             cell = sheetData.cells[i];
             pos = cell[JV.PROP_AREA][JV.PROP_LEFT];
-            if (x.indexOf(pos) < 0) x.push(pos);
+            if (xPos.indexOf(pos) < 0) xPos.push(pos);
             pos = cell[JV.PROP_AREA][JV.PROP_RIGHT];
-            if (x.indexOf(pos) < 0) x.push(pos);
+            if (xPos.indexOf(pos) < 0) xPos.push(pos);
             pos = cell[JV.PROP_AREA][JV.PROP_TOP];
-            if (y.indexOf(pos) < 0) y.push(pos);
+            if (yPos.indexOf(pos) < 0) yPos.push(pos);
             pos = cell[JV.PROP_AREA][JV.PROP_BOTTOM];
-            if (y.indexOf(pos) < 0) y.push(pos);
+            if (yPos.indexOf(pos) < 0) yPos.push(pos);
         }
-        x.sort();
-        y.sort();
+        xPos.sort();
+        yPos.sort();
     };
     private_getCellIdxStr = function(idx){
-        var rst = 'A', prefix = '', tmpIdx = idx;
-        if (tmpIdx > 26) {
-            var ti = Math.floor(tmpIdx / 26), tj = tmpIdx % 26;
-            if (ti < 26) {
-                //
-            } else {
-                prefix = ''
-            }
-        } else {
-            //
+        var rst = 'A';
+        if (idx < 26) {
+            rst = headerStr[idx];
+        } else if (idx < 26*26+26) {
+            var ti = Math.floor(idx / 26), tj = idx % 26;
+            rst = headerStr[ti - 1] + headerStr[tj];
+        } else if (idx < 26*26*26+26) {
+            var ti = Math.floor(idx / (26*26)), tj = Math.floor((idx - ti * 26*26) / 26), tk = idx % 26;
+            rst = headerStr[ti - 1] + headerStr[tj-1] + headerStr[tk];
         }
-        //if (idx < )
+        return rst;
     };
-    private_getStrIdx = function(val) {
+    private_getSharedStrIdx = function(val) {
+        var rst = sharedStrList.indexOf(val);
+        if (rst < 0) {
+            sharedStrList.push(val);
+            rst = sharedStrList.length - 1;
+        }
+        return rst;
+    };
+    private_getStyleIdx = function(cell) {
+        var rst = 1;
         //
+        return rst;
+    };
+    private_setCols = function(){
+        rst.push('<cols>');
+        var w = 0;
+        for (var i = 1; i < xPos.length; i++) {
+            w = 1.0 * (xPos[i] - xPos[i - 1]) / DPI;
+            w = Math.round(w * 1000) / 1000;
+            rst.push('<col min="1" max="1" width="' + w + '" customWidth="1"/>');
+        }
+        rst.push('</cols>');
+    };
+    private_setMergedCells = function() {
+        var cell, idxR, idxL, idxT, idxB, cnt = 0;
+        rst.push('<mergeCells count="?">');
+        var startIdx = rst.length - 1;
+        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) {
+                rst.push('<mergeCell ref="' + private_getCellIdxStr(idxL - 1) + idxT + ':' + private_getCellIdxStr(idxR - 2) + (idxB - 1) + '"/>');
+                cnt++;
+            }
+        }
+        rst[startIdx] = '<mergeCells count="' + cnt + '">';
+        rst.push('</mergeCells>');
+    };
+    private_setSheetData = function(){
+        rst.push('<sheetData>');
+        var spanX = xPos.length - 1, cellIdx = 0, h = 0, hasMoreCols = true;
+        for (var i = 0; i < yPos.length - 1; i++) {
+            if (i === 0) {
+                h = 1.0 * (yPos[i]) / DPI;
+            } else {
+                h = 1.0 * (yPos[i] - yPos[i - 1]) / DPI;
+            }
+            h = Math.round(h * 1000) / 1000;
+            rst.push('<row r="' + (i+1) + '" spans="1:' + spanX + '" ht="' + h + '" customHeight="1">');
+            //then put the cells of this row
+            var colIdxStr = '';
+            for (var j = 0; j < xPos.length; j++) {
+                colIdxStr = private_getCellIdxStr(j);
+                if (hasMoreCols) {
+                    //
+                } else {
+                    rst.push('<c r="' + colIdxStr + (i+1) + '" s="1"/>');
+                }
+            }
+            rst.push('</row');
+        }
+        //sheetData.cells.length
+        rst.push('</sheetData>');
     };
     private_pre_analyze_pos();
     rst.push(dftHeadXml + '\r\n');
     rst.push('<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">');
-    rst.push('<dimension ref="A1:U4332"/>');
-    rst.push('');
-    rst.push('');
-    rst.push('');
-    rst.push('');
-    rst.push('');
-    rst.push('');
-    rst.push('');
-    rst.push('');
-    rst.push('');
-    rst.push('');
+    var colStr = private_getCellIdxStr(xPos.length - 2);
+    rst.push('<dimension ref="A1:' + colStr + '' + yPos.length + '"/>');
+    rst.push('<sheetViews><sheetView tabSelected="1" workbookViewId="0">');
+    rst.push('<selection sqref="A1:' + colStr + '1"/>');
+    rst.push('</sheetView></sheetViews>');
+    rst.push('<sheetFormatPr defaultRowHeight="13.5"/>');
+    private_setCols
+    private_setSheetData();
+    private_setMergedCells();
+    rst.push('<phoneticPr fontId="1" type="noConversion"/>');
+    rst.push('<pageMargins left="0.315" right="0.215" top="0.315" bottom="0.315" header="0" footer="0"/>');
+    //rst.push('<pageSetup paperSize="9" fitToWidth="0" fitToHeight="0" orientation="landscape" horizontalDpi="300" verticalDpi="300"/>');
+    rst.push('<headerFooter alignWithMargins="0"/>');
+    rst.push('</worksheet>');
     //rst.push('');
     return rst;
 }