fix #8131 - chinese translations
[Pman.Core] / SimpleExcel.php
index 631ad96..0ca12fc 100644 (file)
@@ -4,13 +4,13 @@
  * class to generate excel file from rows of data, and a configuration.
  *
  * usage :
- *   $x = new Pman_Core_SimpleExcel(array())
+ *   $x = new Pman_Core_SimpleExcel($data_array, array())
  *   $x->send($fn);
  *
  * 
  *
  
-new Pman_Core_SimpleExcel(array(
+new Pman_Core_SimpleExcel($data_array, array(
     'formats' => array(
         'format_name' => array( 'Align' =>  'left' ), // etc...
     ),
@@ -33,20 +33,24 @@ new Pman_Core_SimpleExcel(array(
                 'dataFormat' => 'string' // to force a string..
                 'width'=>  75,
                 'renderer' => array($this, 'getThumb'),
-                'txtrenderer' => array($this, 'cleanValue'),   // for 
+                'txtrenderer' => function($value, $worksheet, $row, $col, $row_data) {
+                    return $value
+                },   // for text content...
                 'color' => 'yellow', // set color for the cell which is a header element
                 'fillBlank' => 'gray', // set the color for the cell which is a blank area
             ),
             //..... and ther rows...
-        
-        // if this is set then it will add a tab foreach one.
-        workbooks = array(
-            workbook ->
-            
-        'leave_open' => false  
-            
-            
-        // callbacks: renderer
+    ),
+    
+    // if this is set then it will add a tab foreach one.
+    'workbooks' = array(
+            workbook => '....' // ???
+    ),
+    'leave_open' => false,  // if you call addrows?? later..
+    'nonspacer' => false, // should add line between head and header row.     
+));
+
+    callbacks: renderer
         
         function($value, $worksheet, $row, $col, $row_data)
         
@@ -70,8 +74,10 @@ class Pman_Core_SimpleExcel extends Pman
     var $formats = array();
     var $workbook = false;
     var $worksheet= false;
-    
-    function Pman_Core_SimpleExcel($data,$cfg)
+    var $postRender = array();
+    var $outfile2;
+     
+    function __construct($data,$cfg)
     {
       // print_r($cfg);exit;
         require_once 'Spreadsheet/Excel/Writer.php';
@@ -88,11 +94,14 @@ class Pman_Core_SimpleExcel extends Pman
        
         $cfg['formats'] = isset($cfg['formats']) ? $cfg['formats'] : array();
         
+        $this->formats['_default_date_format_'] = $workbook->addFormat();;
+        $this->formats['_default_date_format_']->setNumFormat('YYYY-MM-DD');
+        
         foreach($cfg['formats'] as $f=>$fcfg) {
             
             $this->formats[$f] = & $workbook->addFormat();
             foreach((array)$fcfg as $k=>$v) {
-                 $this->formats[$f]->{'set' . $k}($v);
+                $this->formats[$f]->{'set' . $k}($v);
             }
             
         }
@@ -235,33 +244,59 @@ class Pman_Core_SimpleExcel extends Pman
         if (empty($data)) {
             return;
         }
+         
+        foreach($cfg['cols']  as $c => $col_cfg) {
+            if (isset($col_cfg['renderer'])) {
+                $hasRender = true;
+                break;
+            }
+        }
         
         
-        foreach($data as $r=>$clo) {
-            $hasRenderRow = $this->addLine($cfg['workbook'], $clo);
-            $hasRender = ($hasRender  || $hasRenderRow) ? true : false;
-             
-        }
-        /// call user render on any that are defined..
-        if ($hasRender) {
-            foreach($data as $r=>$cl) {
+        
+        if (is_object($data)) {
+            $data_ar = array();
+            $count = $data->count();
+            $data->find();
             
-                foreach($cfg['cols']   as $c=>$col_cfg) {
-                    $v = isset($cl[$col_cfg['dataIndex']]) ? $cl[$col_cfg['dataIndex']] : '';
-                    if (empty($cl[$col_cfg['dataIndex']])) {
-                        continue;
-                    }
-                    if (isset($col_cfg['renderer'])) {
-                        // not sure if row is correct here...!!!?
-                        call_user_func($col_cfg['renderer'], $cl[$col_cfg['dataIndex']], $worksheet, $r+1, $c, $cl);
-                        
+            while($data->fetch()) {
+                $hasRenderRow = $this->addLine($cfg['workbook'], $data);
+                $hasRender = ($hasRender  || $hasRenderRow) ? true : false;
+            }
+            $start_row += $count;
+        } else { 
+        
+            foreach($data as $r=>$clo) {
+                $hasRenderRow = $this->addLine($cfg['workbook'], $clo);
+                $hasRender = ($hasRender  || $hasRenderRow) ? true : false;
+                 
+            }
+        /// call user render on any that are defined..
+            if ($hasRender) {
+                foreach($data as $r=>$cl) {
+                
+                    foreach($cfg['cols']   as $c=>$col_cfg) {
+                        $v = isset($cl[$col_cfg['dataIndex']]) ? $cl[$col_cfg['dataIndex']] : '';
+                        if (empty($cl[$col_cfg['dataIndex']])) {
+                            continue;
+                        }
+                        if (!empty($col_cfg['renderer'])) {
+                             if (is_a($col_cfg['renderer'], 'Closure')) {
+                                $col_cfg['renderer']($cl[$col_cfg['dataIndex']], $worksheet, $r+1, $c, $cl);
+                            } else {
+                            // not sure if row is correct here...!!!?
+                                call_user_func($col_cfg['renderer'], $cl[$col_cfg['dataIndex']], $worksheet, $r+1, $c, $cl);
+                            }
+                            
+                        }
+                      //  echo "<PRE>WRITE: ". htmlspecialchars(print_r(array($r+1, $c, $cl[$col_cfg['dataIndex']]), true));
+                 
                     }
-                  //  echo "<PRE>WRITE: ". htmlspecialchars(print_r(array($r+1, $c, $cl[$col_cfg['dataIndex']]), true));
-             
                 }
             }
+            $start_row += count($data);
+
         }
-        $start_row += count($data);
         
         if (!empty($cfg['foot'])) {
             foreach($cfg['foot'] as $row) { 
@@ -321,8 +356,14 @@ class Pman_Core_SimpleExcel extends Pman
                 continue;
             }
             if (isset($col_cfg['txtrenderer'])) {
-                $v = call_user_func($col_cfg['txtrenderer'], 
-                        $cl[$col_cfg['dataIndex']], $worksheet, $r+1, $c, $clo);
+                
+                 if (is_a($col_cfg['txtrenderer'], 'Closure')) {
+                     
+                    $v =     $col_cfg['txtrenderer']($cl[$col_cfg['dataIndex']], $worksheet, $r+1, $c, $clo);
+                } else {
+                    $v = call_user_func($col_cfg['txtrenderer'], 
+                            $cl[$col_cfg['dataIndex']], $worksheet, $r+1, $c, $clo);
+                }
                 if ($v === false) {
                     continue;
                 }
@@ -330,6 +371,18 @@ class Pman_Core_SimpleExcel extends Pman
             }
             if (isset($col_cfg['renderer'])) {
                 $hasRender = true;
+                
+                $v = isset($cl[$col_cfg['dataIndex']]) ? $cl[$col_cfg['dataIndex']] : '';
+                if (empty($cl[$col_cfg['dataIndex']])) {
+                    continue;
+                }
+                $this->postRender[] = array(
+                    $col_cfg['renderer'], $cl[$col_cfg['dataIndex']], $worksheet, $start_row+$r+1, $c, $cl
+                );
+                  
+                
+                
+                
                 continue;
             }
             
@@ -341,12 +394,26 @@ class Pman_Core_SimpleExcel extends Pman
             $format = isset($col_cfg['format'])  && isset($formats[$col_cfg['format']] )   ? $formats[$col_cfg['format']] : false;
           //  print_R(array($start_row+$r, $c, $v, $format));exit;
           // handle 0 prefixes..
-            if ( (is_numeric($v) &&  strlen($v) > 1 && substr($v,0,1) == '0' && substr($v,1,1) != '.') 
+          
+            if ($dataFormat == 'date' || preg_match('/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/', $v)) {
+                $dataFormat = 'date';
+                $format = empty($format) ? $this->formats['_default_date_format_']: $format;
+                $ut_to_ed_diff = 86400 * 25569;
+                $gmt = strtotime('1970-01-01');
+
+                $v = (strtotime($v) + $ut_to_ed_diff - $gmt) / 86400;
+                // need to +8hrs to get real time..
+                
+                
+            }
+          
+            if ( (is_numeric($v) &&  strlen($v) > 1 && substr($v,0,1) == '0' && substr($v,1,1) != '.' )
                     || 
                     $dataFormat == 'string' ) {
+                //var_dump("Write ( {$r}, {$c} ) = " . $v);
                 $worksheet->writeString($start_row+$r, $c, $v, $format);
             } else {
-          
+                //var_dump("Write String ( {$r}, {$c} ) = " . $v);
                 $worksheet->write($start_row+$r, $c, $v, $format);
             }
             
@@ -364,6 +431,20 @@ class Pman_Core_SimpleExcel extends Pman
     
     function send($fname)
     {
+        
+        if (!empty($this->postRender)) {
+            foreach($this->postRender as $ar) {
+                 if (is_a($ar[0], 'Closure')) {
+                    $ar[0]($ar[1], $ar[2], $ar[3], $ar[4], $ar[5]);
+                } else {
+                // not sure if row is correct here...!!!?
+                    call_user_func($ar[0],$ar[1], $ar[2], $ar[3], $ar[4], $ar[5]);
+                }
+            }
+            
+        }
+        
+        
         if (!empty($this->workbook)) {
             $this->workbook->close();
             $this->workbook = false;