最简洁的php操纵Excel的类 - PHP技术 - 三路友社论坛 娱乐交友社区论坛 - SNS
返回列表 回复 发帖

最简洁的php操纵Excel的类

本帖隐藏的内容需要回复才可以浏览


------------------------------------------
Excel 类 V1.1
    By Monkey
------------------------------------------
-----函数说明
读取Excel文件
function Read_Excel_File($ExcelFile,$Result)
$ExcelFile Excel文件名
$Result  返回的结果
函数返回值 正常返回0,否则返回错误信息
返回的值数组
$result[sheet名][行][列] 的值为相应Excel Cell的值

建立Excel文件
function Create_Excel_File($ExcelFile,$Data)
$ExcelFile Excel文件名
$Data  Excel表格数据
请把函数写在PHP脚本的开头
例1:
<?
require "excel_class.php";
Read_Excel_File("Book1.xls",$return);
for ($i=0;$i<count($return[Sheet1]);$i++)
{
for ($j=0;$j<count($return[Sheet1][$i]);$j++)
{
  echo $return[Sheet1][$i][$j]."|";
}
echo "<br>";
}
?>
例2:
<?
require "excel_class.php";
Read_Excel_File("Book1.xls",$return);
Create_Excel_File("ddd.xls",$return[Sheet1]);
?>
附件: 您所在的用户组无法下载或查看附件
本帖最后由 jarg 于 2009-10-18 12:43 编辑

中文如何处理?直接就是中文了。
修正中文乱码问题:修改函数uc2html 为下面的代码:
  1. function uc2html($str) {
  2.     return  mb_convert_encoding($str, 'UTF-8', 'UTF-16LE');
  3. }
复制代码
  1. <?
  2. define('ABC_CRITICAL',      0);
  3. define('ABC_ERROR',         1);
  4. define('ABC_ALERT',         2);
  5. define('ABC_WARNING',       3);
  6. define('ABC_NOTICE',        4);
  7. define('ABC_INFO',          5);
  8. define('ABC_DEBUG',         6);
  9. define('ABC_TRACE',         7);
  10. define('ABC_VAR_DUMP',      8);
  11. define('ABC_NO_LOG',      -1);
  12. $php_version = split( "\.", phpversion() );
  13. if( $php_version[0] == 4 && $php_version[1] <= 1 ) {
  14.     if( !function_exists('var_export') ) {
  15.         function var_export( $exp, $ret ) {
  16. ob_start();
  17. var_dump( $exp );
  18. $result = ob_get_contents();
  19. ob_end_clean();
  20. return $result;
  21. }}}function print_bt()
  22. {
  23. print "<code>\n";
  24. $cs = debug_backtrace();
  25. for( $i = 1; $i < count($cs) ; $i++ )
  26. {
  27. $item = $cs[ $i ];
  28. for( $j = 0; $j < count($item['args']); $j++ )
  29. if( is_string($item['args'][$j]) )
  30. $item['args'][$j] = "\"" . $item['args'][$j] . "\"";
  31. $args = join(",", $item['args'] );
  32. if( isset( $item['class'] ) )
  33. $str = sprintf("%s(%d): %s%s%s(%s)",
  34. $item['file'],
  35. $item['line'],
  36. $item['class'],
  37. $item['type'],
  38. $item['function'],
  39. $args );
  40. else
  41. $str = sprintf("%s(%d): %s(%s)",
  42. $item['file'],
  43. $item['line'],
  44. $item['function'],
  45. $args );
  46. echo $str . "<br>\n";
  47. }print "</code>\n";
  48. }function _die( $str )
  49. {
  50. print "Script died with reason: $str<br>\n";
  51. print_bt();
  52. exit();
  53. }class DebugOut
  54. {
  55. var $priorities = array(ABC_CRITICAL    => 'critical',
  56.                         ABC_ERROR       => 'error',
  57.                         ABC_ALERT       => 'alert',
  58.                         ABC_WARNING     => 'warning',
  59.                         ABC_NOTICE      => 'notice',
  60.                         ABC_INFO        => 'info',
  61.                         ABC_DEBUG       => 'debug',
  62.                         ABC_TRACE       => 'trace',
  63.                         ABC_VAR_DUMP        => 'dump'
  64.                         );
  65. var $_ready = false;
  66. var $_currentPriority = ABC_DEBUG;
  67. var $_consumers = array();
  68. var  $_filename;
  69. var  $_fp;
  70. var  $_logger_name;
  71. function DebugOut($name, $logger_name, $level ){
  72.      $this->_filename = $name;
  73.      $this->_currentPriority = $level;
  74.      $this->_logger_name = $logger_name;
  75.      if ($level > ABC_NO_LOG){
  76.         $this->_openfile();
  77.      }     /*Destructor Registering*/
  78.      register_shutdown_function(array($this,"close"));
  79. } function log($message, $priority = ABC_INFO) {
  80.         // Abort early if the priority is above the maximum logging level.
  81.         if ($priority > $this->_currentPriority) {
  82.             return false;
  83.         }        // Add to loglines array
  84.         return $this->_writeLine($message, $priority, strftime('%b %d %H:%M:%S'));
  85. } function dump($variable,$name) {
  86.        $priority = ABC_VAR_DUMP;
  87.        if ($priority > $this->_currentPriority ) {
  88.             return false;
  89.        }       $time = strftime('%b %d %H:%M:%S');
  90.        $message = var_export($variable,true);
  91.        return fwrite($this->_fp,
  92.                      sprintf("%s %s [%s] variable %s = %s \r\n",
  93.                              $time,
  94.                              $this->_logger_name,
  95.                              $this->priorities[$priority],
  96.                              $name,
  97.                              $message)
  98.                              );
  99. } function info($message) {
  100.         return $this->log($message, ABC_INFO);
  101. } function debug($message) {
  102.         return $this->log($message, ABC_DEBUG);
  103. } function notice($message) {
  104.         return $this->log($message, ABC_NOTICE);
  105. } function warning($message) {
  106.         return $this->log($message, ABC_WARNING);
  107. } function trace($message) {
  108.         return $this->log($message, ABC_TRACE);
  109. } function error($message) {
  110.         return $this->log($message, ABC_ERROR);
  111. } /**
  112.   * Writes a line to the logfile
  113.   *
  114.   * @param  string $line      The line to write
  115.   * @param  integer $priority The priority of this line/msg
  116.   * @return integer           Number of bytes written or -1 on error
  117.   * @access private
  118.   */
  119. function _writeLine($message, $priority, $time) {
  120.     if( fwrite($this->_fp, sprintf("%s %s [%s] %s\r\n", $time, $this->_logger_name, $this->priorities[$priority], $message)) ) {
  121.         return fflush($this->_fp);
  122.     } else {
  123.         return false;
  124.     } } function _openfile() {
  125.     if (($this->_fp = @fopen($this->_filename, 'a')) == false) {
  126.         return false;
  127.     }        return true;
  128. } function close(){
  129.     if($this->_currentPriority != ABC_NO_LOG){
  130.         $this->info("Logger stoped");
  131.         return fclose($this->_fp);
  132.     } } /*
  133.   * Managerial Functions.
  134.   *
  135.   */
  136. function Factory($name, $logger_name, $level) {
  137.     $instance = new DebugOut($name, $logger_name, $level);
  138.     return $instance;
  139. } function &getWriterSingleton($name, $logger_name, $level = ABC_DEBUG){
  140.       static $instances;
  141.       if (!isset($instances)){
  142.         $instances = array();
  143.       }      $signature = serialize(array($name, $level));
  144.       if (!isset($instances[$signature])) {
  145.             $instances[$signature] = DebugOut::Factory($name, $logger_name, $level);
  146.       }      
  147.       return $instances[$signature];
  148. } function attach(&$logObserver) {
  149.     if (!is_object($logObserver)) {
  150.         return false;
  151.     }    $logObserver->_listenerID = uniqid(rand());
  152.     $this->_listeners[$logObserver->_listenerID] = &$logObserver;
  153. }}define ('ABC_BAD_DATE', -1);
  154. class ExcelDateUtil{
  155. /*
  156. * return 1900 Date as integer TIMESTAMP.
  157. * for UNIX date must be
  158. *
  159. */
  160. function xls2tstamp($date) {
  161. $date=$date>25568?$date:25569;
  162. /*There was a bug if Converting date before 1-1-1970 (tstamp 0)*/
  163.    $ofs=(70 * 365 + 17+2) * 86400;
  164.    return ($date * 86400) - $ofs;
  165. }function getDateArray($xls_date){
  166.     $ret = array();
  167.     // leap year bug
  168.     if ($xls_date == 60) {
  169.         $ret['day']   = 29;
  170.         $ret['month'] = 2;
  171.         $ret['year']  = 1900;
  172.         return $ret;
  173.     } else if ($xls_date < 60) {
  174.         // 29-02-1900 bug
  175.         $xls_date++;
  176.     }    // Modified Julian to DMY calculation with an addition of 2415019
  177.     $l = $xls_date + 68569 + 2415019;
  178.     $n = (int)(( 4 * $l ) / 146097);
  179.     $l = $l - (int)(( 146097 * $n + 3 ) / 4);
  180.     $i = (int)(( 4000 * ( $l + 1 ) ) / 1461001);
  181.     $l = $l - (int)(( 1461 * $i ) / 4) + 31;
  182.     $j = (int)(( 80 * $l ) / 2447);
  183.     $ret['day'] = $l - (int)(( 2447 * $j ) / 80);
  184.     $l = (int)($j / 11);
  185.     $ret['month'] = $j + 2 - ( 12 * $l );
  186.     $ret['year'] = 100 * ( $n - 49 ) + $i + $l;
  187.     return $ret;
  188. }function isInternalDateFormat($format) {
  189.     $retval =false;
  190.     switch(format) {
  191.     // Internal Date Formats as described on page 427 in
  192.     // Microsoft Excel Dev's Kit...
  193.         case 0x0e:
  194.         case 0x0f:
  195.         case 0x10:
  196.         case 0x11:
  197.         case 0x12:
  198.         case 0x13:
  199.         case 0x14:
  200.         case 0x15:
  201.         case 0x16:
  202.         case 0x2d:
  203.         case 0x2e:
  204.         case 0x2f:
  205.         // Additional internal date formats found by inspection
  206.         // Using Excel v.X 10.1.0 (Mac)
  207.         case 0xa4:
  208.         case 0xa5:
  209.         case 0xa6:
  210.         case 0xa7:
  211.         case 0xa8:
  212.         case 0xa9:
  213.         case 0xaa:
  214.         case 0xab:
  215.         case 0xac:
  216.         case 0xad:
  217.         $retval = true; break;
  218.         default: $retval = false; break;
  219.     }         return $retval;
  220. }}define('EXCEL_FONT_RID',0x31);
  221. define('XF_SCRIPT_NONE',0);
  222. define('XF_SCRIPT_SUPERSCRIPT',1);
  223. define('XF_SCRIPT_SUBSCRIPT',2);
  224. define('XF_UNDERLINE_NONE',0x0);
  225. define('XF_UNDERLINE_SINGLE',0x1);
  226. define('XF_UNDERLINE_DOUBLE',0x2);
  227. define('XF_UNDERLINE_SINGLE_ACCOUNTING',0x3);
  228. define('XF_UNDERLINE_DOUBLE_ACCOUNTING',0x4);
  229. define('XF_STYLE_ITALIC', 0x2);
  230. define('XF_STYLE_STRIKEOUT', 0x8);
  231. define('XF_BOLDNESS_REGULAR',0x190);
  232. define('XF_BOLDNESS_BOLD',0x2BC);
  233. class ExcelFont {
  234. function basicFontRecord() {
  235.     return  array('size'     => 10,
  236.                     'script'   => XF_SCRIPT_NONE,
  237.                     'undeline' => XF_UNDERLINE_NONE,
  238.                     'italic'   => false,
  239.                     'strikeout'=> false,
  240.                     'bold'     => false,
  241.                     'boldness' => XF_BOLDNESS_REGULAR,
  242.                     'palete'   => 0,
  243.                     'name'     => 'Arial');
  244. } function getFontRecord(&$wb,$ptr) {
  245.     $retval = array('size'     => 0,
  246.                     'script'   => XF_SCRIPT_NONE,
  247.                     'undeline' => XF_UNDERLINE_NONE,
  248.                     'italic'   => false,
  249.                     'strikeout'=> false,
  250.                     'bold'     => false,
  251.                     'boldness' => XF_BOLDNESS_REGULAR,
  252.                     'palete'   => 0,
  253.                     'name'     => '');
  254.     $retval['size'] = (ord($wb[$ptr])+ 256*ord($wb[$ptr+1]))/20;
  255.     $style=ord($wb[$ptr+2]);
  256.     if (($style & XF_STYLE_ITALIC) != 0) {
  257.         $retval['italic'] = true;
  258.     }    if (($style & XF_STYLE_STRIKEOUT) != 0) {
  259.         $retval['strikeout'] = true;
  260.     }    $retval['palete'] = ord($wb[$ptr+4])+256*ord($wb[$ptr+5]);
  261.     $retval['boldness'] = ord($wb[$ptr+6])+256*ord($wb[$ptr+7]);
  262.     $retval['bold'] = $retval['boldness'] == XF_BOLDNESS_REGULAR ? false:true;
  263.     $retval['script'] =  ord($wb[$ptr+8])+256*ord($wb[$ptr+9]);
  264.     $retval['underline'] = ord($wb[$ptr+10]);
  265.     $length = ord($wb[$ptr+14]);
  266.     if($length >0) {
  267.         if(ord($wb[$ptr+15]) == 0) { // Compressed Unicode
  268.             $retval['name'] = substr($wb,$ptr+16,$length);
  269.         } else { // Uncompressed Unicode
  270.             $retval['name'] = ExcelFont::getUnicodeString($wb,$ptr+15,$length);
  271.         }    }    return $retval;
  272. } function toString(&$record,$index) {
  273.     $retval = sprintf("Font Index = %d \nFont Size =%d\nItalic = %s\nStrikeoout=%s\nPalete=%s\nBoldness = %s Bold=%s\n Script = %d\n Underline = %d\n FontName=%s<hr>",
  274.                 $index,
  275.                 $record['size'],
  276.                 $record['italic']    == true?"true":"false",
  277.                 $record['strikeout'] == true?"true":"false",
  278.                 $record['palete'],
  279.                 $record['boldness'],
  280.                 $record['bold'] == true?"true":"false",
  281.                 $record['script'],
  282.                 $record['underline'],
  283.                 $record['name']
  284.                 );
  285.     return $retval;
  286. } function getUnicodeString(&$string,$offset,$length) {
  287.         $bstring = "";
  288.         $index   = $offset + 1;   // start with low bits.
  289.         for ($k = 0; $k < $length; $k++)
  290.         {
  291.             $bstring = $bstring.$string[$index];
  292.             $index        += 2;
  293.         }        return substr($bstring,0,$length);
  294. } function ExcelToCSS($rec, $app_font=true, $app_size=true, $app_italic=true, $app_bold=true){
  295.     $ret = "";
  296.     if($app_font==true){
  297.         $ret = $ret."font-family:".$rec['name']."; ";
  298.     }    if($app_size==true){
  299.         $ret = $ret."font-size:".$rec['size']."pt; ";
  300.     }    if($app_bold==true){
  301.         if($rec['bold']==true){
  302.             $ret = $ret."font-weight:bold; ";
  303.         } else {
  304.             $ret = $ret."font-weight:normal; ";
  305.         }    }    if($app_italic==true){
  306.         if($rec['italic']==true){
  307.             $ret = $ret."font-style:italic; ";
  308.         } else {
  309.             $ret = $ret."font-style:normal; ";
  310.         }    }    return $ret;
  311. }}define ( DP_EMPTY, 0 );
  312. define ( DP_STRING_SOURCE, 1 );
  313. define ( DP_FILE_SOURCE, 2 );
  314. //------------------------------------------------------------------------
  315. class ExcelParserUtil
  316. {
  317. function str2long($str) {
  318. return ord($str[0]) + 256*(ord($str[1]) +
  319. 256*(ord($str[2]) + 256*(ord($str[3])) ));
  320. }}//------------------------------------------------------------------------
  321. class DataProvider
  322. {
  323. function DataProvider( $data, $dataType )
  324. {
  325. switch( $dataType )
  326. {
  327. case DP_FILE_SOURCE:
  328. if( !( $this->_data = @fopen( $data, "rb" )) )
  329. return;
  330. $this->_size = @filesize( $data );
  331. if( !$this->_size )
  332. _die("Failed to determine file size.");
  333. break;
  334. case DP_STRING_SOURCE:
  335. $this->_data = $data;
  336. $this->_size = strlen( $data );
  337. break;
  338. default:
  339. _die("Invalid data type provided.");
  340. }$this->_type = $dataType;
  341. register_shutdown_function( array( $this, "close") );
  342. }function get( $offset, $length )
  343. {
  344. if( !$this->isValid() )
  345. _die("Data provider is empty.");
  346. if( $this->_baseOfs + $offset + $length > $this->_size )
  347. _die("Invalid offset/length.");
  348. switch( $this->_type )
  349. {
  350. case DP_FILE_SOURCE:
  351. {
  352. if( @fseek( $this->_data, $this->_baseOfs + $offset, SEEK_SET ) == -1 )
  353. _die("Failed to seek file position specified by offest.");
  354. return @fread( $this->_data, $length );
  355. }case DP_STRING_SOURCE:
  356. {
  357. $rc = substr( $this->_data, $this->_baseOfs + $offset, $length );
  358. return $rc;
  359. }default:
  360. _die("Invalid data type or class was not initialized.");
  361. }}function getByte( $offset )
  362. {
  363. return $this->get( $offset, 1 );
  364. }function getOrd( $offset )
  365. {
  366. return ord( $this->getByte( $offset ) );
  367. }function getLong( $offset )
  368. {
  369. $str = $this->get( $offset, 4 );
  370. return ExcelParserUtil::str2long( $str );
  371. }function getSize()
  372. {
  373. if( !$this->isValid() )
  374. _die("Data provider is empty.");
  375. return $this->_size;
  376. }function getBlocks()
  377. {
  378. if( !$this->isValid() )
  379. _die("Data provider is empty.");
  380. return (int)(($this->_size - 1) / 0x200) - 1;
  381. }function ReadFromFat( $chain, $gran = 0x200 )
  382. {
  383. $rc = '';
  384. for( $i = 0; $i < count($chain); $i++ )
  385. $rc .= $this->get( $chain[$i] * $gran, $gran );
  386. return $rc;
  387. }function close()
  388. {
  389. switch($this->_type )
  390. {
  391. case DP_FILE_SOURCE:
  392. @fclose( $this->_data );
  393. case DP_STRING_SOURCE:
  394. $this->_data = null;
  395. default:
  396. $_type = DP_EMPTY;
  397. break;
  398. }}function isValid()
  399. {
  400. return $this->_type != DP_EMPTY;
  401. }var $_type = DP_EMPTY;
  402. var $_data = null;
  403. var $_size = -1;
  404. var $_baseOfs = 0;
  405. }class ExcelFileParser {
  406. var $dp = null;
  407. var $max_blocks;
  408. var $max_sblocks;
  409. // Internal variables
  410. var $fat;
  411. var $sfat;
  412. // Removed: var $sbd;
  413. // Removed: var $syear;
  414. var $formats;
  415. var $xf;
  416. var $fonts;
  417.     var $dbglog;
  418.     function ExcelFileParser($logfile="",$level=ABC_NO_LOG) {
  419. $this->dbglog = &DebugOut::getWriterSingleton($logfile,"",$level);
  420.         $this->dbglog->info("Logger started");
  421.     }function populateFormat() {
  422. $this->dbglog->trace(" populateFormat() function call");
  423. $ret = array (
  424.         0=> "General",
  425.         1=> "0",
  426.         2=> "0.00",
  427.         3=> "#,##0",
  428.         4=> "#,##0.00",
  429.         5=> "($#,##0_);($#,##0)",
  430.         6=> "($#,##0_);[Red]($#,##0)",
  431.         7=> "($#,##0.00);($#,##0.00)",
  432.         8=> "($#,##0.00_);[Red]($#,##0.00)",
  433.         9=> "0%",
  434.         0xa=> "0.00%",
  435.         0xb=> "0.00E+00",
  436.         0xc=> "# ?/?",
  437.         0xd=> "# ??/??",
  438.         0xe=> "m/d/yy",
  439.         0xf=> "d-mmm-yy",
  440.         0x10=> "d-mmm",
  441.         0x11=> "mmm-yy",
  442.         0x12=> "h:mm AM/PM",
  443.         0x13=> "h:mm:ss AM/PM",
  444.         0x14=> "h:mm",
  445.         0x15=> "h:mm:ss",
  446.         0x16=> "m/d/yy h:mm",
  447.         // 0x17 - 0x24 reserved for international and undocumented
  448.         0x17=> "0x17",
  449.         0x18=> "0x18",
  450.         0x19=> "0x19",
  451.         0x1a=> "0x1a",
  452.         0x1b=> "0x1b",
  453.         0x1c=> "0x1c",
  454.         0x1d=> "0x1d",
  455.         0x1e=> "0x1e",
  456.         0x1f=> "0x1f",
  457.         0x20=> "0x20",
  458.         0x21=> "0x21",
  459.         0x22=> "0x22",
  460.         0x23=> "0x23",
  461.         0x24=> "0x24",
  462.         // 0x17 - 0x24 reserved for international and undocumented
  463.         0x25=> "(#,##0_);(#,##0)",
  464.         0x26=> "(#,##0_);[Red](#,##0)",
  465.         0x27=> "(#,##0.00_);(#,##0.00)",
  466.         0x28=> "(#,##0.00_);[Red](#,##0.00)",
  467.         0x29=> "_(*#,##0_);_(*(#,##0);_(* \"-\"_);_(@_)",
  468.         0x2a=> "_($*#,##0_);_($*(#,##0);_($* \"-\"_);_(@_)",
  469.         0x2b=> "_(*#,##0.00_);_(*(#,##0.00);_(*\"-\"??_);_(@_)",
  470.         0x2c=> "_($*#,##0.00_);_($*(#,##0.00);_($*\"-\"??_);_(@_)",
  471.         0x2d=> "mm:ss",
  472.         0x2e=> "[h]:mm:ss",
  473.         0x2f=> "mm:ss.0",
  474.         0x30=> "##0.0E+0",
  475.         0x31=> "@");
  476.             $this->dbglog->dump($ret,"\$ret");
  477.             $this->dbglog->trace("populateFormat() function return");
  478.         return $ret;
  479. }function xls2tstamp($date) {
  480. $date=$date>25568?$date:25569;
  481. /*There was a bug if Converting date before 1-1-1970 (tstamp 0)*/
  482.    $ofs=(70 * 365 + 17+2) * 86400;
  483.    return ($date * 86400) - $ofs;
  484. }function getDateArray($date) {
  485.    return ExcelDateUtil::getDateArray($date);
  486. }function isDateFormat($val){
  487. $f_i=$this->xf['format'][$val];
  488. if(preg_match("/[m|d|y]/i",$this->format[$f_i])!=0){
  489.     if(strrpos($this->format[$f_i],'[')!=FALSE) {
  490.         $tmp = preg_replace("/(\[\/?)(\w+)([^\]]*\])/","'\\1'.''.'\\3'",$this->format[$f_i]);
  491.     if(preg_match("/[m|d|y]/i",$tmp)!=0)
  492.        return TRUE;
  493.      else
  494.        return FALSE;
  495.     } else {
  496.         return TRUE;
  497.     }} else
  498.   return FALSE;
  499. }function getUnicodeString($str,$ofs){
  500.    $size=0;
  501.    $i_ofs=0;
  502. /*   if (ord($str[$ofs])==255) {
  503.      $size=ord($str[$ofs])+ 256*(ord($str[$ofs+1]));
  504.      $i_ofs=2;
  505.    } else {*/
  506.      $size=ord($str[$ofs]);
  507.      $i_ofs=1;
  508. /*   }*/
  509.    return substr($str,$ofs+$i_ofs+1,$size);
  510. }function getByteString($str,$ofs){
  511.    $size=0;
  512.    $i_ofs=0;
  513. //   if (ord($str[$ofs])==255) {
  514. //     $size=ord($str[$ofs])+ 256*(ord($str[$ofs+1]));
  515. //     $i_ofs=2;
  516. //   } else {
  517.      $size=ord($str[$ofs]);
  518.      $i_ofs=1;
  519. //   }   return substr($str,$ofs+$i_ofs+1,$size);
  520. }/*
  521. * Get blocks chain
  522. */
  523. function get_blocks_chain($start,$small_fat=false) {
  524. $this->dbglog->trace("get_blocks_chain(".var_export($start,true).",".var_export($small_fat,true).") function call ");
  525. $chain = array();
  526. $next_block = $start;
  527. if( !$small_fat ) {
  528. while(  ($next_block!=0xfffffffe) &&
  529. ($next_block <= $this->max_blocks) &&
  530. ($next_block < count($this->fat)) )
  531. {
  532. $chain[] = $next_block;
  533. $next_block = $this->fat[$next_block];
  534. }} else {
  535. while(  ($next_block!=0xfffffffe) &&
  536. ($next_block <= $this->max_sblocks) &&
  537. ($next_block < count($this->sfat)) )
  538. {
  539. $chain[] = $next_block;
  540. $next_block = $this->sfat[$next_block];
  541. }}if( $next_block != 0xfffffffe )
  542. return false;
  543. $this->dbglog->dump($chain,"\$chain");
  544. $this->dbglog->trace("get_blocks_chain() function return");
  545. return $chain;
  546. }/* Find stream by name
  547. *
  548. */
  549. function find_stream( $dir, $item_name,$item_num=0) {
  550.         $this->dbglog->trace("find_stream(".var_export($dir,true).",".var_export($item_name,true).",".var_export($item_num,true).") function call ");
  551. $dt = $dir->getOrd( $item_num * 0x80 + 0x42 );
  552. $prev = $dir->getLong( $item_num * 0x80 + 0x44 );
  553. $next = $dir->getLong( $item_num * 0x80 + 0x48 );
  554. $dir_ = $dir->getLong( $item_num * 0x80 + 0x4c );
  555. $curr_name = '';
  556. if( ($dt==2) || ($dt==5) )
  557. for( $i=0;
  558. $i < ( $dir->getOrd( $item_num * 0x80 + 0x40 ) +
  559.   256 * $dir->getOrd( $item_num * 0x80 + 0x41 ) )/2-1;
  560. $i++ )
  561. $curr_name .= $dir->getByte( $item_num * 0x80 + $i * 2 );
  562. if( (($dt==2) || ($dt==5)) && (strcmp($curr_name,$item_name)==0) ){
  563.     $this->dbglog->trace("find_stream() function return with ".var_export($item_num,true));
  564. return $item_num;
  565. }if( $prev != 0xffffffff ) {
  566. $i = $this->find_stream( $dir, $item_name, $prev);
  567. if( $i>=0 ){
  568.     $this->dbglog->trace("find_stream() function return with ".var_export($i,true));
  569.     return $i;
  570.     }}if( $next != 0xffffffff ) {
  571. $i = $this->find_stream( $dir, $item_name, $next);
  572. if( $i>=0 ){
  573.     $this->dbglog->trace("find_stream() function return with ".var_export($i,true));
  574.     return $i;
  575. }}if( $dir_ != 0xffffffff ) {
  576. $i = $this->find_stream( $dir, $item_name, $dir_ );
  577. if( $i>=0 ) {
  578.     $this->dbglog->trace("find_stream() function return with ".var_export($i,true));
  579.     return $i;
  580. }}        $this->dbglog->trace("find_stream() function return with -1");
  581. return -1;
  582. }function rk_decode($rk) {
  583.     $this->dbglog->trace("rk_decode(".var_export($rk,true).") function call");
  584. $res = array();
  585. if( $rk & 2 ) {
  586. // integer
  587. $val = ($rk & 0xfffffffc) >> 2;
  588. if( $rk & 1 ) $val = $val / 100;
  589. if (((float)$val) == floor((float)$val)){
  590.    $res['val'] = (int)$val;
  591.    $res['type'] = 1;
  592. } else {
  593.    $res['val'] = (float)$val;
  594.    $res['type'] = 2;
  595. }} else {
  596. // float
  597. $res['type'] = 2;
  598. $frk = $rk;
  599. $fexp =  (($frk & 0x7ff00000) >> 20) - 1023;
  600. $val = 1+(($frk & 0x000fffff) >> 2)/262144;
  601. if( $fexp > 0 ) {
  602. for( $i=0; $i<$fexp; $i++ )
  603. $val *= 2;
  604. } else {
  605. if( $fexp==-1023 ) {
  606. $val=0;
  607. } else {
  608. for( $i=0; $i<abs($fexp); $i++ )
  609. $val /= 2;
  610. }}if( $rk & 1 ) $val = $val / 100;
  611. if( $rk & 0x80000000 ) $val = -$val;
  612. $res['val'] = (float)$val;
  613. }$this->dbglog->trace("rk_decode() function returns");
  614. return $res;
  615. }// Parse worksheet
  616. //-----------------
  617. function parse_worksheet($ws) {
  618.         $this->dbglog->debug("parse_worksheet(DATA) function");
  619. if( strlen($ws) <= 0 ){
  620.     $this->dbglog->trace("parse_worksheet() function returns 7 (Data not Found)");
  621.         return 7;
  622.     }if( strlen($ws) <  4 ){
  623.     $this->dbglog->trace("parse_worksheet() function returns 6 (File Corrupted)");
  624.     return 6;
  625. }// parse workbook header
  626. if( strlen($ws) < 256*ord($ws[3])+ord($ws[2]) ) return 6;
  627. if( ord($ws[0]) != 0x09 ) return 6;
  628. $vers = ord($ws[1]);
  629. if( ($vers!=0) && ($vers!=2) && ($vers!=4) && ($vers!=8) )
  630. return 8;
  631. if( $vers!=8 ) {
  632. $biff_ver = ($ver+4)/2;
  633. } else {
  634. if( strlen($ws) < 12 ) return 6;
  635. switch( ord($ws[4])+256*ord($ws[5]) ) {
  636. case 0x0500:
  637. if( ord($ws[0x0a])+256*ord($ws[0x0b]) < 1994 ) {
  638. $biff_ver = 5;
  639. } else {
  640. switch(ord( $ws[8])+256*ord($ws[9]) ) {
  641. case 2412:
  642. case 3218:
  643. case 3321:
  644. /*dbg*/             $this->dbglog->debug("Parsed BIFF version is 5");
  645. $biff_ver = 5;
  646. break;
  647. default:
  648.     $this->dbglog->debug("Parsed BIFF version is 7");
  649. $biff_ver = 7;
  650. break;
  651. }}break;
  652. case 0x0600:
  653. /*DBG*/    $this->dbglog->debug("Parsed BIFF version is 8");
  654. $biff_ver = 8;
  655. break;
  656. default:
  657. return 8;
  658. }}if( $biff_ver < 5 ) {
  659. /*DBG*/  $this->dbglog->debug("parse_worksheet() function found ($biff_ver < 5) return 8");
  660.   return 8;
  661. }$ptr = 0;
  662. $data = array('biff_version' => $biff_ver );
  663. while( (ord($ws[$ptr])!=0x0a) && ($ptr<strlen($ws)) ) {
  664. switch (ord($ws[$ptr])+256*ord($ws[$ptr+1])) {
  665.   // Number
  666.   case 0x0203:
  667. /*DBG*/     $this->dbglog->trace("found NUMBER");
  668. if( ($biff_ver < 3) ){
  669. /*DBG*/         $this->dbglog->trace("$biff_ver < 3 break;");
  670.     break;
  671. }if( (ord($ws[$ptr+2])+256*ord($ws[$ptr+3])) < 14 ){
  672. /*DBG*/         $this->dbglog->debug("parse_worksheet() return 6");
  673. return 6;
  674. }$row = ord($ws[$ptr+4])+256*ord($ws[$ptr+5]);
  675. $col = ord($ws[$ptr+6])+256*ord($ws[$ptr+7]);
  676. $num_lo = ExcelParserUtil::str2long(substr($ws,$ptr+10,4));
  677. $num_hi = ExcelParserUtil::str2long(substr($ws,$ptr+14,4));
  678. $xf_i = ord($ws[$ptr+8])+256*ord($ws[$ptr+9]);
  679. if($this->isDateFormat($xf_i)){
  680. $data['cell'][$row][$col]['type'] = 3;
  681. } else {
  682. $data['cell'][$row][$col]['type'] = 2;
  683. }$fonti = $this->xf['font'][$xf_i];
  684.     $data['cell'][$row][$fc+$i]['font'] = $fonti;
  685. $fexp = (($num_hi & 0x7ff00000) >> 20) - 1023;
  686. $val = 1+(($num_hi & 0x000fffff)+$num_lo/4294967296)/1048576;
  687. if( $fexp > 0 ) {
  688. for( $i=0; $i<$fexp; $i++ )
  689. $val *= 2;
  690. } else {
  691. for( $i=0; $i<abs($fexp); $i++ )
  692. $val /= 2;
  693. }if( $num_hi & 0x80000000 ) $val = -$val;
  694. $data['cell'][$row][$col]['data'] = (float)$val;
  695. if( !isset($data['max_row']) ||
  696.     ($data['max_row'] < $row) )
  697. $data['max_row'] = $row;
  698. if( !isset($data['max_col']) ||
  699.     ($data['max_col'] < $col) )
  700. $data['max_col'] = $col;
  701. break;
  702.   // RK
  703.   case 0x027e:
  704. /*DBG*/  $this->dbglog->trace("found RK");
  705. if( ($biff_ver < 3) ) break;
  706. if( (ord($ws[$ptr+2])+256*ord($ws[$ptr+3])) < 0x0a )
  707. return 6;
  708. $row  = ord($ws[$ptr+4])+256*ord($ws[$ptr+5]);
  709. $col  = ord($ws[$ptr+6])+256*ord($ws[$ptr+7]);
  710. $xf_i = ord($ws[$ptr+8])+256*ord($ws[$ptr+9]);
  711. $val  = $this->rk_decode(
  712. ExcelParserUtil::str2long(substr($ws,$ptr+10,4))
  713. );
  714. if($this->isDateFormat($xf_i)==TRUE){
  715. $data['cell'][$row][$col]['type'] = 3;
  716. } else {
  717. $data['cell'][$row][$col]['type'] = $val['type'];
  718. }$fonti = $this->xf['font'][$xf_i];
  719.     $data['cell'][$row][$col]['font'] = $fonti;
  720. $data['cell'][$row][$col]['data'] = $val['val'];
  721. if( !isset($data['max_row']) ||
  722.     ($data['max_row'] < $row) )
  723. $data['max_row'] = $row;
  724. if( !isset($data['max_col']) ||
  725.     ($data['max_col'] < $col) )
  726. $data['max_col'] = $col;
  727. break;
  728.   // MULRK
  729.   case 0x00bd:
  730. /*DBG*/  $this->dbglog->trace("found  MULL RK");
  731. if( ($biff_ver < 5) ) break;
  732. $sz = ord($ws[$ptr+2])+256*ord($ws[$ptr+3]);
  733. if( $sz < 6 ) return 6;
  734. $row = ord($ws[$ptr+4])+256*ord($ws[$ptr+5]);
  735. $fc = ord($ws[$ptr+6])+256*ord($ws[$ptr+7]);
  736. $lc = ord($ws[$ptr+$sz+2])+256*ord($ws[$ptr+$sz+3]);
  737. for( $i=0; $i<=$lc-$fc; $i++) {
  738. $val = $this->rk_decode(
  739. ExcelParserUtil::str2long(substr($ws,$ptr+10+$i*6,4))
  740. );
  741.    $xf_i=ord($ws[$ptr+8+$i*6])+256*ord($ws[($ptr+9+$i*6)]);
  742.    if($this->isDateFormat($xf_i)==TRUE) {
  743.    $data['cell'][$row][$fc+$i]['type'] = 3;
  744.    } else {
  745.    $data['cell'][$row][$fc+$i]['type'] = $val['type'];
  746.    }   $fonti = $this->xf['font'][$xf_i];
  747.        $data['cell'][$row][$fc+$i]['font'] = $fonti;
  748.    $data['cell'][$row][$fc+$i]['data'] = $val['val'];
  749. }if( !isset($data['max_row']) ||
  750.     ($data['max_row'] < $row) )
  751. $data['max_row'] = $row;
  752. if( !isset($data['max_col']) ||
  753.     ($data['max_col'] < $lc) )
  754. $data['max_col'] = $lc;
  755. break;
  756.   // LABEL
  757.   case 0x0204:
  758. /*DBG*/  $this->dbglog->trace("found LABEL");
  759. if( ($biff_ver < 3) ){
  760.     break;
  761. }if( (ord($ws[$ptr+2])+256*ord($ws[$ptr+3])) < 8 ){
  762. return 6;
  763. }$row = ord($ws[$ptr+4])+256*ord($ws[$ptr+5]);
  764. $col = ord($ws[$ptr+6])+256*ord($ws[$ptr+7]);
  765. $xf = ord($ws[$ptr+8])+256*ord($ws[$ptr+9]);
  766. $fonti = $this->xf['font'][$xf];
  767. $font =  $this->fonts[$fonti];
  768. $str_len = ord($ws[$ptr+10])+256*ord($ws[$ptr+11]);
  769. if( $ptr+12+$str_len > strlen($ws) )
  770. return 6;
  771. $this->sst['unicode'][] = false;
  772. $this->sst['data'][] = substr($ws,$ptr+12,$str_len);
  773. $data['cell'][$row][$col]['type'] = 0;
  774. $sst_ind = count($this->sst['data'])-1;
  775. $data['cell'][$row][$col]['data'] = $sst_ind;
  776. $data['cell'][$row][$col]['font'] = $fonti;
  777. /*echo str_replace("\n","<br>\n", ExcelFont::toString($font,$fonti));
  778.     echo "FontRecord for sting ".$this->sst['data'][$sst_ind]."<br>";*/
  779. if( !isset($data['max_row']) ||
  780.     ($data['max_row'] < $row) )
  781. $data['max_row'] = $row;
  782. if( !isset($data['max_col']) ||
  783.     ($data['max_col'] < $col) )
  784. $data['max_col'] = $col;
  785. break;
  786.   // LABELSST
  787.   case 0x00fd:
  788. if( $biff_ver < 8 ) break;
  789. if( (ord($ws[$ptr+2])+256*ord($ws[$ptr+3])) < 0x0a )
  790. return 6;
  791. $row = ord($ws[$ptr+4])+256*ord($ws[$ptr+5]);
  792. $col = ord($ws[$ptr+6])+256*ord($ws[$ptr+7]);
  793. $xf = ord($ws[$ptr+8])+256*ord($ws[$ptr+9]);
  794. $fonti = $this->xf['font'][$xf];
  795. $font = &$this->fonts[$fonti];
  796. $data['cell'][$row][$col]['type'] = 0;
  797. $sst_ind = ExcelParserUtil::str2long(substr($ws,$ptr+10,4));
  798. $data['cell'][$row][$col]['data'] = $sst_ind;
  799. $data['cell'][$row][$col]['font'] = $fonti;
  800. /*            echo "FontRecord for sting at $row,$col<br>";
  801. echo str_replace("\n","<br>\n", ExcelFont::toString($font,$fonti));*/
  802. if( !isset($data['max_row']) ||
  803.     ($data['max_row'] < $row) )
  804. $data['max_row'] = $row;
  805. if( !isset($data['max_col']) ||
  806.     ($data['max_col'] < $col) )
  807. $data['max_col'] = $col;
  808. break;
  809.   // unknown, unsupported or unused opcode
  810.   default:
  811. break;
  812. } $ptr += 4+256*ord($ws[$ptr+3])+ord($ws[$ptr+2]);
  813. }/*DEBUG*/ $this->dbglog->debug("parse_worksheet() function returns ".var_export($data,true)); /*DEBUG*/
  814. return $data;
  815. }// Parse workbook
  816. //----------------
  817. function parse_workbook( $f_header, $dp ) {
  818. /*DBG*/ $this->dbglog->debug("parse_workbook() function");
  819. $root_entry_block = $f_header->getLong(0x30);
  820. $num_fat_blocks = $f_header->getLong(0x2c);
  821. /*TRC*/ $this->dbglog->trace("Header parsed");
  822. $this->fat = array();
  823. for( $i = 0; $i < $num_fat_blocks; $i++ ){
  824. /*TRC*/$this->dbglog->trace("FOR LOOP iteration i =".$i);
  825. $fat_block = $f_header->getLong( 0x4c + 4 * $i );
  826. $fatbuf = $dp->get( $fat_block * 0x200, 0x200 );
  827. $fat = new DataProvider( $fatbuf, DP_STRING_SOURCE );
  828. if( $fat->getSize() < 0x200 ){
  829. /*DBG*/    $this->dbglog->debug("parse_workbook() function found (strlen($fat) < 0x200) returns 6");
  830. return 6;
  831. }for( $j=0; $j<0x80; $j++ )
  832. $this->fat[] = $fat->getLong( $j * 4 );
  833. $fat->close();
  834. unset( $fat_block, $fatbuf, $fat );
  835. }/*DBG*/ $this->dbglog->dump( $this->fat, "\$fat" );
  836. if( count($this->fat) < $num_fat_blocks ) {
  837. /*DBG*/    $this->dbglog->debug("parse_workbook() function found (count($this->fat) < $num_fat_blocks) returns 6");
  838. return 6;
  839. }$chain = $this->get_blocks_chain($root_entry_block);
  840. $dir = new DataProvider( $dp->ReadFromFat( $chain ), DP_STRING_SOURCE );
  841. unset( $chain );
  842. $this->sfat = array();
  843. $small_block = $f_header->getLong( 0x3c );
  844. if( $small_block != 0xfeffffff ) {
  845. $root_entry_index = $this->find_stream( $dir, 'Root Entry');
  846. if( $root_entry_index < 0 ) {
  847. /*DBG*/    $this->dbglog->debug("parse_workbook() function dont found Root Entry returns 6");
  848.     return 6;
  849. }
  850. $sdc_start_block = $dir->getLong( $root_entry_index * 0x80 + 0x74 );
  851. $small_data_chain = $this->get_blocks_chain($sdc_start_block);
  852. $this->max_sblocks = count($small_data_chain) * 8;

  853. $schain = $this->get_blocks_chain($small_block);
  854. for( $i = 0; $i < count( $schain ); $i++ ) {

  855. $sfatbuf = $dp->get( $schain[$i] * 0x200, 0x200 );
  856. $sfat = new DataProvider( $sfatbuf, DP_STRING_SOURCE );
  857. //$this->dbglog->dump( strlen($sfatbuf), "strlen(\$sftabuf)");
  858. //$this->dbglog->dump( $sfat, "\$sfat");
  859.   if( $sfat->getSize() < 0x200 ) {
  860. /*DBG*/     $this->dbglog->debug("parse_workbook() function found (strlen($sfat) < 0x200)  returns 6");
  861.      return 6;
  862.        }      
  863.   for( $j=0; $j<0x80; $j++ )
  864.    $this->sfat[] = $sfat->getLong( $j * 4 );
  865.    
  866.    $sfat->close();
  867.    unset( $sfatbuf, $sfat );
  868. } unset( $schain );
  869. $sfcbuf = $dp->ReadFromFat( $small_data_chain );
  870.   $sdp = new DataProvider( $sfcbuf, DP_STRING_SOURCE );
  871.   unset( $sfcbuf, $small_data_chain );
  872. }$workbook_index = $this->find_stream( $dir, 'Workbook' );
  873. if( $workbook_index<0 ) {
  874. $workbook_index = $this->find_stream( $dir, 'Book' );
  875. if( $workbook_index<0 ){
  876. /*DBG*/        $this->dbglog->debug("parse_workbook() function workbook index not found returns 7");
  877. return 7;
  878. }}$workbook_start_block = $dir->getLong( $workbook_index * 0x80 + 0x74 );
  879. $workbook_length = $dir->getLong( $workbook_index * 0x80 + 0x78 );
  880. $wb = '';
  881. if( $workbook_length > 0 ) {
  882. if( $workbook_length >= 0x1000 ) {
  883. $chain = $this->get_blocks_chain($workbook_start_block);
  884. $wb = $dp->ReadFromFat( $chain );
  885. } else {
  886. $chain = $this->get_blocks_chain($workbook_start_block,true);
  887. $wb = $sdp->ReadFromFat( $chain, 0x40 );
  888. unset( $sdp );
  889. }$wb = substr($wb,0,$workbook_length);
  890. if( strlen($wb) != $workbook_length )
  891. return 6;
  892. unset( $chain );
  893. }// Unset fat arrays
  894. unset( $this->fat, $this->sfat );
  895. if( strlen($wb) <= 0 ) {
  896. /*DBG*/    $this->dbglog->debug("parse_workbook() function workbook found (strlen($wb) <= 0) returns 7");
  897.    return 7;
  898. }if( strlen($wb) <  4 ) {
  899. /*DBG*/    $this->dbglog->debug("parse_workbook() function workbook found (strlen($wb) < 4) returns 6");
  900.     return 6;
  901. }// parse workbook header
  902. if( strlen($wb) < 256*ord($wb[3])+ord($wb[2]) ){
  903. /*DBG*/ $this->dbglog->debug("parse_workbook() function workbook found (strlen($wb) < 256*ord($wb[3])+ord($wb[2])) < 4) returns 6");
  904. return 6;
  905. }if( ord($wb[0]) != 0x09 ){
  906. /*DBG*/ $this->dbglog->debug("parse_workbook() function workbook found (ord($wb[0]) != 0x09) returns 6");
  907. return 6;
  908. }$vers = ord($wb[1]);
  909. if( ($vers!=0) && ($vers!=2) && ($vers!=4) && ($vers!=8) ){
  910. return 8;
  911.         }if( $vers!=8 )
  912. $biff_ver = ($ver+4)/2;
  913. else {
  914. if( strlen($wb) < 12 ) return 6;
  915. switch( ord($wb[4])+256*ord($wb[5]) )
  916. {
  917. case 0x0500:
  918. if( ord($wb[0x0a])+256*ord($wb[0x0b]) < 1994 )
  919. $biff_ver = 5;
  920. else {
  921. switch(ord( $wb[8])+256*ord($wb[9]) ) {
  922. case 2412:
  923. case 3218:
  924. case 3321:
  925. $biff_ver = 5;
  926. break;
  927. default:
  928. $biff_ver = 7;
  929. break;
  930. }}break;
  931. case 0x0600:
  932. $biff_ver = 8;
  933. break;
  934. default:
  935. return 8;
  936. }}if( $biff_ver < 5 ) return 8;
  937. $ptr = 0;
  938. $this->worksheet['offset'] = array();
  939. $this->worksheet['options'] = array();
  940. $this->worksheet['unicode'] = array();
  941. $this->worksheet['name'] = array();
  942. $this->worksheet['data'] = array();
  943. $this->format = $this->populateFormat();
  944. $this->fonts = array();
  945. $this->fonts[0] = ExcelFont::basicFontRecord();
  946. $this->xf = array();
  947. $this->xf['format'] = array();
  948. $this->xf['font'] = array();
  949. $this->xf['type_prot'] = array();
  950. $this->xf['alignment'] = array();
  951. $this->xf['decoration'] = array();
  952. $xf_cnt=0;
  953. $this->sst['unicode'] = array();
  954. $this->sst['data'] = array();
  955. $opcode = 0;
  956. $sst_defined = false;
  957. $wblen = strlen($wb);
  958. while( (ord($wb[$ptr])!=0x0a) && ($ptr<$wblen) )
  959. {
  960. $oc = ord($wb[$ptr])+256*ord($wb[$ptr+1]);
  961. if( $oc != 0x3c )
  962. $opcode = $oc;
  963. switch ($opcode)
  964. {
  965.   case 0x0085:
  966. $ofs = ExcelParserUtil::str2long(substr($wb,$ptr+4,4));
  967. $this->worksheet['offset'][] = $ofs;
  968. $this->worksheet['options'][] = ord($wb[$ptr+8])+256*ord($wb[$ptr+9]);
  969. if( $biff_ver==8 ) {
  970. $len = ord($wb[$ptr+10]);
  971. if( (ord($wb[$ptr+11]) & 1) > 0 ) {
  972. $this->worksheet['unicode'][] = true;
  973. $len = $len*2;
  974. } else {
  975. $this->worksheet['unicode'][] = false;
  976. } $this->worksheet['name'][] = substr($wb,$ptr+12,$len);
  977. } else {
  978. $this->worksheet['unicode'][] = false;
  979. $len = ord($wb[$ptr+10]);
  980. $this->worksheet['name'][] = substr($wb,$ptr+11,$len);
  981. }$pws = $this->parse_worksheet(substr($wb,$ofs));
  982. if( is_array($pws) )
  983. $this->worksheet['data'][] = $pws;
  984. else
  985. return $pws;
  986. break;
  987. // Format
  988.   case 0x041e:
  989.    $fidx = ord($wb[$ptr+4])+256*ord($wb[$ptr+5]);
  990.   if($fidx<0x31 ||$fidx==0x31 )
  991.   break;
  992.   elseif($biff_ver>7)
  993.     $this->format[$fidx] = $this->getUnicodeString($wb,$ptr+6);
  994.         break;
  995. // FONT 0x31
  996.    case EXCEL_FONT_RID:
  997.                 $rec = ExcelFont::getFontRecord($wb,$ptr+4);
  998.                 $this->fonts[count($this->fonts)] = $rec;
  999. /*echo str_replace("\n","<br>\n",ExcelFont::toString($rec,count($this->fonts)-1));
  1000. echo "FontRecord<br>" */;
  1001.         break;
  1002. // XF
  1003.   case 0x00e0:
  1004.   $this->xf['font'][$xf_cnt] = ord($wb[$ptr+4])+256*ord($wb[$ptr+5]);
  1005.   $this->xf['format'][$xf_cnt] = ord($wb[$ptr+6])+256*ord($wb[$ptr+7]);
  1006.   $this->xf['type'][$xf_cnt]  = "1";
  1007.   $this->xf['bitmask'][$xf_cnt] = "1";
  1008.   $xf_cnt++;
  1009.         break;
  1010.   // SST
  1011.   case 0x00fc:
  1012. if( $biff_ver < 8 ) break;
  1013. $sbuflen = ord($wb[$ptr+2]) + 256*ord($wb[$ptr+3]);
  1014. if( $oc != 0x3c ) {
  1015. if( $sst_defined ) return 6;
  1016. $snum = ExcelParserUtil::str2long(substr($wb,$ptr+8,4));
  1017. $sptr = $ptr+12;
  1018. $sst_defined = true;
  1019. } else {
  1020. if( $rslen > $slen ) {
  1021. $sptr = $ptr+4;
  1022. $rslen -= $slen;
  1023. $slen = $rslen;
  1024. if( (ord($wb[$sptr]) & 1) > 0 ) {
  1025. if( $char_bytes == 1 ) {
  1026.   $sstr = '';
  1027. for( $i=0; $i<strlen($str); $i++ )
  1028. $sstr .= $str[$i].chr(0);
  1029. $str = $sstr;
  1030. $char_bytes=2;
  1031. } $schar_bytes = 2;
  1032. } else {
  1033. $schar_bytes = 1;
  1034. }if( $sptr+$slen*$schar_bytes > $ptr+4+$sbuflen )
  1035. $slen = ($ptr+$sbuflen-$sptr+3)/$schar_bytes;
  1036. $sstr = substr($wb,$sptr+1,$slen*$schar_bytes);
  1037. if( ($char_bytes == 2) && ($schar_bytes == 1) )
  1038. {
  1039. $sstr2 = '';
  1040. for( $i=0; $i<strlen($sstr); $i++ )
  1041. $sstr2 .= $sstr[$i].chr(0);
  1042. $sstr = $sstr2;
  1043. }$str .= $sstr;
  1044. $sptr += $slen*$schar_bytes+1+4*$rt+$fesz;
  1045. if( $slen < $rslen ) {
  1046. if( ($sptr >= strlen($wb)) ||
  1047.     ($sptr < $ptr+4+$sbuflen) ||
  1048.     (ord($wb[$sptr]) != 0x3c) )
  1049. {
  1050.     return 6;
  1051. }break;
  1052. } else {
  1053. if( $char_bytes == 2 ) {
  1054. $this->sst['unicode'][] = true;
  1055. } else {
  1056. $this->sst['unicode'][] = false;
  1057. }$this->sst['data'][] = $str;
  1058. $snum--;
  1059. } } else {
  1060. $sptr = $ptr+4;
  1061. if( $sptr > $ptr ) $sptr += 4*$rt+$fesz;
  1062. }}while(  ($sptr < $ptr+4+$sbuflen) &&
  1063. ($sptr < strlen($wb)) &&
  1064. ($snum > 0) )
  1065. {
  1066. $rslen = ord($wb[$sptr])+256*ord($wb[$sptr+1]);
  1067. $slen = $rslen;
  1068. if( (ord($wb[$sptr+2]) & 1) > 0 ) {
  1069. $char_bytes = 2;
  1070. } else {
  1071. $char_bytes = 1;
  1072. } $rt = 0;
  1073. $fesz = 0;
  1074. switch (ord($wb[$sptr+2]) & 0x0c) {
  1075.   // Rich-Text with Far-East
  1076.   case 0x0c:
  1077. $rt = ord($wb[$sptr+3])+256*(ord($wb[$sptr+4]));
  1078. $fesz = ExcelParserUtil::str2long(substr($wb,$sptr+5,4));
  1079. if( $sptr+9+$slen*$char_bytes > $ptr+4+$sbuflen )
  1080. $slen = ($ptr+$sbuflen-$sptr-5)/$char_bytes;
  1081. $str = substr($wb,$sptr+9,$slen*$char_bytes);
  1082. $sptr += $slen*$char_bytes+9;
  1083. break;
  1084.   // Rich-Text
  1085.   case 8:
  1086. $rt = ord($wb[$sptr+3])+256*(ord($wb[$sptr+4]));
  1087. if( $sptr+5+$slen*$char_bytes > $ptr+4+$sbuflen )
  1088. $slen = ($ptr+$sbuflen-$sptr-1)/$char_bytes;
  1089. $str = substr($wb,$sptr+5,$slen*$char_bytes);
  1090. $sptr += $slen*$char_bytes+5;
  1091. break;
  1092.   // Far-East
  1093.   case 4:
  1094. $fesz = ExcelParserUtil::str2long(substr($wb,$sptr+3,4));
  1095. if( $sptr+7+$slen*$char_bytes > $ptr+4+$sbuflen )
  1096. $slen = ($ptr+$sbuflen-$sptr-3)/$char_bytes;
  1097. $str = substr($wb,$sptr+7,$slen*$char_bytes);
  1098. $sptr += $slen*$char_bytes+7;
  1099. break;
  1100.   // Compressed or uncompressed unicode
  1101.   case 0:
  1102. if( $sptr+3+$slen*$char_bytes > $ptr+4+$sbuflen )
  1103. $slen = ($ptr+$sbuflen-$sptr+1)/$char_bytes;
  1104. $str = substr($wb,$sptr+3,$slen*$char_bytes);
  1105. $sptr += $slen*$char_bytes+3;
  1106. break;
  1107. } if( $slen < $rslen ) {
  1108. if( ($sptr >= strlen($wb)) ||
  1109.     ($sptr < $ptr+4+$sbuflen) ||
  1110.     (ord($wb[$sptr]) != 0x3c) ) return 6;
  1111. } else {
  1112. if( $char_bytes == 2 ) {
  1113. $this->sst['unicode'][] = true;
  1114. } else {
  1115. $this->sst['unicode'][] = false;
  1116. }$sptr += 4*$rt+$fesz;
  1117. $this->sst['data'][] = $str;
  1118. $snum--;
  1119. }} // switch
  1120. break;
  1121. } // switch
  1122. // !!! Optimization:
  1123. //  $this->wsb[] = substr($wb,$ptr,4+256*ord($wb[$ptr+3])+ord($wb[$ptr+2]));
  1124. $ptr += 4+256*ord($wb[$ptr+3])+ord($wb[$ptr+2]);
  1125. } // while
  1126. // !!! Optimization:
  1127. //  $this->workbook = $wb;
  1128. $this->biff_version = $biff_ver;
  1129. /*DBG*/ $this->dbglog->debug("parse_workbook() function returns 0");
  1130. return 0;
  1131. }// ParseFromString & ParseFromFile
  1132. //---------------------------------
  1133. //
  1134. // IN:
  1135. //string contents - File contents
  1136. //string filename - File name of an existing Excel file.
  1137. //
  1138. // OUT:
  1139. //0 - success
  1140. //1 - can't open file
  1141. //2 - file too small to be an Excel file
  1142. //3 - error reading header
  1143. //4 - error reading file
  1144. //5 - This is not an Excel file or file stored in < Excel 5.0
  1145. //6 - file corrupted
  1146. //7 - data not found
  1147. //8 - Unsupported file version
  1148. function ParseFromString( $contents )
  1149. {
  1150. $this->dbglog->info("ParseFromString() enter.");
  1151. $this->dp = new DataProvider( $contents, DP_STRING_SOURCE );
  1152. return $this->InitParser();
  1153. }function ParseFromFile( $filename )
  1154. {
  1155. $this->dbglog->info("ParseFromFile() enter.");
  1156. $this->dp = new DataProvider( $filename, DP_FILE_SOURCE );
  1157. return $this->InitParser();
  1158. }function InitParser()
  1159. {
  1160. $this->dbglog->info("InitParser() enter.");
  1161. if( !$this->dp->isValid() )
  1162. {
  1163. $this->dbglog->error("InitParser() Failed to open file.");
  1164. $this->dbglog->error("InitParser() function returns 1");
  1165. return 1;
  1166. }if( $this->dp->getSize() <= 0x200 )
  1167. {
  1168. $this->dbglog->error("InitParser() File too small to be an Excel file.");
  1169. $this->dbglog->error("InitParser() function returns 2");
  1170. return 2;
  1171. }$this->max_blocks = $this->dp->getBlocks();
  1172. // read file header
  1173. $hdrbuf = $this->dp->get( 0, 0x200 );
  1174. if( strlen( $hdrbuf ) < 0x200 )
  1175. {
  1176. $this->dbglog->error("InitParser() Error reading header.");
  1177. $this->dbglog->error("InitParser() function returns 3");
  1178. return 3;
  1179. }// check file header
  1180. $header_sig = array(0xd0,0xcf,0x11,0xe0,0xa1,0xb1,0x1a,0xe1);
  1181. for( $i = 0; $i < count($header_sig); $i++ )
  1182. if( $header_sig[$i] != ord( $hdrbuf[$i] ) ){
  1183. /*DBG*/        $this->dbglog->error("InitParser() function founds invalid header");
  1184. /*DBG*/        $this->dbglog->error("InitParser() function returns 5");
  1185. return 5;
  1186.             }$f_header = new DataProvider( $hdrbuf, DP_STRING_SOURCE );
  1187. unset( $hdrbuf, $header_sig, $i );
  1188. $this->dp->_baseOfs = 0x200;
  1189. $rc = $this->parse_workbook( $f_header, $this->dp );
  1190. unset( $f_header );
  1191. unset( $this->dp, $this->max_blocks, $this->max_sblocks );
  1192. return $rc;
  1193. }}
  1194. function uc2html($str) {
  1195. return  mb_convert_encoding($str, 'UTF-8', 'UTF-16LE');
  1196. // return $str;
  1197. //$ret = '';
  1198. //for( $i=0; $i<strlen($str)/2; $i++ ) {
  1199. //$charcode = ord($str[$i*2])+256*ord($str[$i*2+1]);
  1200. //$ret .= '&#'.$charcode;
  1201. //}return $ret;
  1202. }
  1203. //------------------------��ȡExcel�ļ�
  1204. function Read_Excel_File($ExcelFile,&$result) {
  1205. $exc = new ExcelFileParser("", ABC_NO_LOG );
  1206. $res=$exc->ParseFromFile($ExcelFile);$result=null;
  1207. switch ($res) {
  1208. case 0: break;
  1209. case 1: $err="�޷����ļ�"; break;
  1210. case 2: $err="�ļ�̫С�����ܲ���Excel�ļ�"; break;
  1211. case 3: $err="�ļ�ͷ��ȡ����"; break;
  1212. case 4: $err="��ȡ�ļ�ʱ���"; break;
  1213. case 5: $err="�ⲻ��һ��Excel�ļ�������Excel5.0��ǰ�汾�ļ�"; break;
  1214. case 6: $err="���"; break;
  1215. case 7: $err="���ļ���û�з���Excel���"; break;
  1216. case 8: $err="��֧�ֵ��ļ��汾"; break;
  1217. default:
  1218.   $err="δ֪����"; break;
  1219. }
  1220. for( $ws_num=0; $ws_num<count($exc->worksheet['name']); $ws_num++ )
  1221. {
  1222. $Sheetname=$exc->worksheet['name'][$ws_num];
  1223. $ws = $exc->worksheet['data'][$ws_num];
  1224. for( $j=0; $j<=$ws['max_row']; $j++ ) {
  1225.   for( $i=0; $i<=$ws['max_col']; $i++ ) {
  1226.    
  1227.      $data = $ws['cell'][$j][$i];
  1228.    
  1229.      switch ($data['type']) {
  1230.    // string
  1231.    case 0:
  1232.     $ind = $data['data'];
  1233.     if( $exc->sst['unicode'][$ind] ) {
  1234.      $s = uc2html($exc->sst['data'][$ind]);
  1235.     } else
  1236.      $s = $exc->sst['data'][$ind];
  1237.     if( strlen(trim($s))==0 )
  1238.      $V="";
  1239.     else
  1240.      $V=$s;
  1241.     break;
  1242.    // integer number
  1243.    case 1:
  1244.     $V=(int)($data['data']);
  1245.     break;
  1246.    // float number
  1247.    case 2:
  1248.     $V=(float)($data['data']);
  1249.     break;
  1250.    // date
  1251.    case 3:
  1252.     $ret = $exc->getDateArray($data['data']);
  1253.     $V=$ret['year']."-".$ret['month']."-".$ret['day']." ".$ret['hour'];
  1254.     break;
  1255.    default:
  1256.     break;
  1257.      }           
  1258.    $result[$Sheetname][$j][$i]=$V;
  1259.   }  
  1260. }
  1261. }
  1262. if ($err=='') {return 0;} else {return $err;}
  1263. }
  1264. //------------------------��bExcel�ļ�
  1265. function Create_Excel_File($ExcelFile,$Data) {

  1266. header ('Content-type: application/x-msexcel');
  1267. header ("Content-Disposition: attachment; filename=$ExcelFile" );  
  1268. function xlsBOF() {
  1269.     echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);  
  1270.     return;
  1271. }
  1272. function xlsEOF() {
  1273.     echo pack("ss", 0x0A, 0x00);
  1274.     return;
  1275. }
  1276. function xlsWriteNumber($Row, $Col, $Value) {
  1277.     echo pack("sssss", 0x203, 14, $Row, $Col, 0x0);
  1278.     echo pack("d", $Value);
  1279.     return;
  1280. }
  1281. function xlsWriteLabel($Row, $Col, $Value ) {
  1282.     $L = strlen($Value);
  1283.     echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
  1284.     echo $Value;
  1285. return;
  1286. }
  1287. xlsBOF();
  1288. for ($i=0;$i<count($Data[0]);$i++)
  1289. {
  1290. for ($j=0;$j<count($Data);$j++)
  1291. {
  1292.   $v=$Data[$j][$i];  
  1293.   
  1294.   xlsWriteLabel($j,$i,$v);
  1295. }
  1296. }
  1297. xlsEOF();
  1298. }
  1299. ?>
复制代码
好贴~~!正在找这玩意
太阳城娱乐网 了解
苍井空于1983年11月11日出生于日本东京,她是著名的日本成人模特,AV女优,女优。   苍井空,日本的AV女优兼电视演员,入行前是泳装写真女星出身,2002年进入. (查看图片请点击www.3loo.com/link.php?url=www.3loo.com/link.php?url=http://www.lad8888.com)AliceJapan公司开始AV生涯。因为其“童颜巨乳”的特色,获得极大的回响与超高人气,并连续在2003年及2004年蝉联日本《VideoBoy》杂志年度AV女优第一名,在东亚甚至欧美都有知名度。因为其可跟一般明星媲美的知名度,她从2003年起开始参加一般电视戏剧及综艺节目中演出,2004年11月移籍到S1,现在进行AV女优工作的同时也在进行一般演员工作。   因为在AV界的高人气,苍井空在2003年7月参加了朝日电视台“特命组长只野仁”的拍摄,并且在2005年十月拍摄了东视大戏“嬢王”。在嬢王的拍摄中,苍井空的演出十分出色,使她的知名度进一步提升。不但获得了男性的喜爱,还增加了许多女性粉丝。在2005年,苍井空是日本网络上被搜索的第二多的女性。 2006年开始,苍井空继续开始拍摄AV电影,也曾经传出她要隐退的传言。 作者:太阳城记者
想想面试过程,有时真像一场斗智斗勇的战争,我们战战兢兢,如履薄冰,受尽惊吓,坚持自我,力挽狂澜,重挫群雄,最后柳岸花明,想来也颇有成就感。兵来将挡,水来土掩,不是学“诈”,而是学会“smart”, 学会在劣势中巧妙扭转局面。

    面试,一场斗智斗勇的争战

    场景1:面试官对我失望

    面试进行中,面试人员对我不时的皱眉或者轻轻摇头,似乎很不满意我的表现,不难令人联想到自己的表现令人失望,赢得工作的机会不大,心情顿时黯然神伤。滨海人才网

    支招:不要受人影响一般而言,面试官都是有相当工作经验的,更清楚自己作为公司的代表,应该保持友善来维护公司形象,如果是因为个人心情不佳或者应征者表现不合心意而显露出不太友善的样子,应该是十分罕见的。有一个可能性是:面试人员假装不满意应征者表现,观察应征者会有什么样的反应。

    在这种情况下,应征者还是应该尽量回答面试人员的提问,因为我们不能控制别人的反应,只要保持自己表现良好就可以。你所认为的对方是否友善或满意,只是主观的感觉,而且人在紧张的时候很容易选择性地接收负面信息,会不自觉地将对方一个小动作放大,认为对自己不利。在这种情况下,更应该放松自己,不被面试官的情绪所左右,重新拾起信心,只集中精力表现自己,不要受人影响。盐城信息网

    场景2:你为什么要说谎?

    应聘咨询方面职位,面试官问到我一个问题:问:你平时做过分析报告吗?

    答:做过几次问:你一般做一个分析报告需要多长时间?

    答:可能2周左右问:现在我让你用1天时间来做出一份分析报告,你觉得可以吗?

    答: ……恩……,我觉得可以。

    问:你平时做一个分析报告需要2周,现在用1天来做,你不觉得你说的很假吗?你为什么要说谎呢?

    答:……我……(脸开始发烧,手心开始出汗)

    支招:快速自圆其说对于一个正常人来说,冷不丁有人说你"说的话很假""为什么要说谎"?,南京人才网真让人心里发毛,在这个强调诚信的社会里,自己表现受到了别人质疑,"是呀,我为什么要说谎呢"?但这里存在一个前提的错误,并不是对你为什么说谎感兴趣,事实上是面试官在考验应聘者的反应,这时候只要能够自圆其说,甚至可以反败为胜。

    比如,以下的回答:"我认为一点也不假,我也并没有说谎,因为我做事情是以完成任务和达成结果为目的的,如果必须在1天之内完成,我可以组织一个小组,大家共同来完成,或者寻求其它帮助,促成目标的达成".因为面试官只说要完成,并没有说通过怎样的方式完成,这样的回答,正反应了应聘者的自信、机敏与聪明,不失为非常巧妙,对不同的职业类似情景都可以这样应对。射阳人才网

    场景3:小组讨论遇“恶人”

    在小组讨论中,有些人精于辩论,一谈起话来便滔滔不绝,也许废话连篇,罗里罗嗦,一点没说到点子上,但牛气哄哄,态度强硬,不给别人说话的机会。这种“欠拍”的人多次抢白他人,我被多次反驳却无法应对,只觉得胸口发闷,堵着一口气出不来,心里自然也不是滋味。

    支招:主动缓和气氛但一个简单的道理是,抢白者不等于表现好,被反驳者也不一定处于劣势,在小组讨论中说话最多的人未必获最高分数,当面挑战别人论点的人甚至会给人负面形象,所以不要一口咬定经常抢白你的应征者正处于上风,可能他正在劣势当中,而你绝对可以趁势突出自己。

    比如一些选美节目中,主持人往往不认同一些美女的答案,甚至让她们成为笑柄,但评判结果看重的是她们能否保持淡定,面试情况一样,面对别人的不认同,能否处之泰然,甚至主动缓和气氛,都是致胜的关键。
英雄合击私服
英雄合击私服
英雄合击私服
英雄合击私服
新开传奇私服
新开传奇私服
新开传奇私服
新开传奇私服

    面对别人的挑战言论,应聘者完全可以保持微笑,这样除了显示礼貌外,也让自己有一段缓冲时间,思考如何应对。回应时可以先多谢对方的意见,并欢迎有不同声音丰富讨论,然后重申自己的立场,最重要是保持轻松的讨论气氛,骂战并没有意义。

    面试中,每个人都希望能将自己最完美的一面示人,但好的工作有时是百里挑一甚至千里挑一,想要胜出并不容易。一个小小的错误,或别人一个眼神,随时会让应征者的自信心遭受打击,顿时方寸大乱,这时,学会沉着冷静,想出聪明的应对办法才是关键。
返回列表