首頁 後端開發 php教程 php程式設計 php程式實作取得excel文件內容的程式碼實例

php程式設計 php程式實作取得excel文件內容的程式碼實例

Jul 29, 2016 am 08:45 AM
php程式設計

1、readexcel.system.php

複製程式碼 程式碼如下:


/* vim: set Expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* 用於閱讀 Microsoft Excel 電子表格的課程。
*
* 最初由 Vadim Tkachenko 開發,名稱為 PHPExcelReader。
* (http://sourceforge.net/projects/phpexcelreader)
* 基於 Andy Khan 的 Java 版本 (http://www.3ppt.com)。現在
* 由 David Sanders 維護。只讀取 Biff 7 和 Biff 8 格式。
*
* PHP 版本4 與5
*
* 授權:此原始檔受PHP 授權
3.0 版本的約束,可透過萬維網取得下列URI:
* http://www.php.net/license/3_0.txt。如果您沒有收到
* PHP 許可證的副本,並且無法透過網路取得它,請
* 發送一條訊息至license@php.net,以便我們立即向您郵寄一份副本。
*
* @category Spreadsheet
* @package Spreadsheet_Excel_Reader
* @author Vadim Tkachenko
* @phplicense http://www.www. /3_0.txt PHP License 3.0
* @version CVS: $Id: reader.php 19 2007-03-13 12:42:41Z shangxiao $
* @link http://pear.php.net/ package/Spreadsheet_Excel_Reader
* @see OLE, Spreadsheet_Excel_Writer
*/
//require_once 'PEAR . php';
//require_once 'oleread.php';
//oleread.php的內容開始======================================= == === =============================================== ==== ==== ==============
define('NUM_BIG_BLOCK_DEPOT_BLOCKS_POS', 0x2c);
define('SMALL_BLOCK_DEPOT_BLOCK_POS', 0x3c);
定義('ROOT_START_BLOCK_POS', 0x30);
define('BIG_BLOCK_SIZE', 0x200);
define('SMALL_BLOCK_SIZE', 0x40);
define('EXTENSION_BLOCK_POS', 0x44);
define('NUM_EXTENSION_BLOCK_POS', 0x48);
定義('PROPERTY_STORAGE_BLOCK_SIZE', 0x80);
define('BIG_BLOCK_DEPOT_BLOCKS_POS', 0x4c);
define('SMALL_BLOCK_THRESHOLD', 0x1000);
// 屬性儲存偏移量
define('SIZE_OF_NAME_POS', 0x40);
定義('TYPE_POS', 0x42);
定義('START_BLOCK_POS', 0x74);
define('SIZE_POS', 0x78);
define('IDENTIFIER_OLE', pack("CCCCCCCC",0xd0,0xcf,0x11,0xe0,0xa1,0xb1,0x1a,0xe1));
//echo 'ROOT_START_BLOCK_POS = '.ROOT_START_BLOCK_POS."n";
//echo bin2hex($data[ROOT_START_BLOCK_POS])."n";
//回顯“a=”;
//echo $data[ROOT_START_BLOCK_POS];
//函數日誌
function GetInt4d($data, $pos)
{
$value = ord($data[$pos]) | (ord($data[$pos+1]) if ($value>=4294967294)
{
$value=-2;
}
回傳$值;
}
class OLERead {
var $data = '';
function OLERead(){
}
function read($sFileName){
//檢查檔案是否存在且必須 (Darko Miljanovic)
if(!is_read($sFileName)) {
$this->錯誤= 1;
回傳錯誤;
}
$this->data = @file_get_contents($sFileName);
if (!$this->data) {
$this->error = 1;
回傳錯誤;
}
//回顯IDENTIFIER_OLE;
//回顯'開始';
if (substr($this->data, 0, 8) != IDENTIFIER_OLE) {
$this->error = 1;
回傳錯誤;
}
$this->numBigBlockDepotBlocks = GetInt4d($this->data, NUM_BIG_BLOCK_DEPOT_BLOCKS_POS);
$this->sbdStartBlock = GetInt4d($this->data, SMALL_BLOCK_DEPOT_BLOCK_POS);
$this->rootStartBlock = GetInt4d($this->data, ROOT_START_BLOCK_POS);
$this->extensionBlock = GetInt4d($this->data, EXTENSION_BLOCK_POS);
$this->numExtensionBlocks = GetInt4d($this->data, NUM_EXTENSION_BLOCK_POS);
/*
echo $this->numBigBlockDepotBlocks." ";
echo $this->sbdStartBlock." ";
echo $this->rootStartBlock." ";
echo $this->extensionBlock." ";
echo $this->numExtensionBlocks." ";
*/
//echo "sbdStartBlock = $this->sbdStartBlockn";
$bigBlockDepotBlocks = array();
$pos = BIG_BLOCK_DEPOT_BLOCKS_POS;
// echo "pos = $pos";
$bbdBlocks = $this->numBigBlockDepotBlocks;
if ($this->numExtensionBlocks != 0) {
$bbdBlocks = (BIG_BLOCK_SIZE - BIG_BLOCK_DEPOT_BLOCKS_POS)/4;
}
for ($i = 0; $i $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos);
$pos += 4;
}
for ($j = 0; $j numExtensionBlocks; $j++) {
$pos = ($this->extensionBlock + 1) * BIG_BLOCK_SIZE;
$blocksToRead = min($this->numBigBlockDepotBlocks - $bbdBlocks, BIG_BLOCK_SIZE / 4 - 1);
for ($i = $bbdBlocks; $i $bigBlockDepotBlocks[$i] = GetInt4d($this->data, $pos);
$pos += 4;
}
$bbdBlocks += $blocksToRead;
if ($bbdBlocks numBigBlockDepotBlocks) {
$this->extensionBlock = GetInt4d($this->data, $pos);
}
}
// var_dump($bigBlockDepotBlocks);
//讀取BigBlockDepot
$pos = 0;
$ 索引 = 0;
$this->bigBlockChain = array();
for ($i = 0; $i numBigBlockDepotBlocks; $i++) {
$pos = ($bigBlockDepotBlocks[$i] + 1) * BIG_BLOCK_SIZE;
//echo "pos = $pos";
for ($j = 0 ; $j $this->bigBlockChain[$index] = GetInt4d($this->data, $pos);
$pos += 4 ;
$index++;
}
}
//var_dump($this->bigBlockChain);
//echo '====2';
// readSmallBlockDepot();
$pos = 0;
$ 索引 = 0;
$sbdBlock = $this->sbdStartBlock;
$this->smallBlockChain = array();
while ($sbdBlock != -2) {
$pos = ($sbdBlock + 1) * BIG_BLOCK_SIZE;
for ($j = 0; $j $this->smallBlockChain[$index] = GetInt4d($this->data, $pos);
$pos += 4;
$index++;
}
$sbdBlock = $this->bigBlockChain[$sbdBlock];
}
// readData(rootStartBlock)
$block = $this->rootStartBlock;
$pos = 0;
$this->entry = $this->__readData($block);
/*
while ($block != -2) {
$pos = ($block + 1) * BIG_BLOCK_SIZE;
$this->entry = $this->entry.substr($this->data, $pos, BIG_BLOCK_SIZE);
$block = $this->bigBlockChain[$block];
}
*/
//echo '==='.$this->entry."===";
$this->__readPropertySets();
}
函數 __readData($bl) {
$block = $bl;
$pos = 0;
$data = '';
while ($block != -2) {
$pos = ($block + 1) * BIG_BLOCK_SIZE;
$data = $data.substr($this->data, $pos, BIG_BLOCK_SIZE);
//echo "pos = $pos data=$datan";
$block = $this->bigBlockChain[$block];
}
回傳$資料;
}
函數 __readPropertySets(){
$offset = 0;
//var_dump($this->entry);
while ($offset entry)) {
$d = substr($this->entry, $offset, PROPERTY_STORAGE_BLOCK_SIZE);
$nameSize = ord($d[SIZE_OF_NAME_POS]) | (ord($d[SIZE_OF_NAME_POS+1]) $type = ord($d[TYPE_POS]);
//$maxBlock = strlen($d) / BIG_BLOCK_SIZE - 1;
$startBlock = GetInt4d($d, START_BLOCK_POS);
$size = GetInt4d($d, SIZE_POS);
$name = '';
for ($i = 0; $i $name .= $d[$i];
}
$name = str_replace("x00", "", $name);
$this->props[] = array (
'name' => $name,
'type' => $type,
'startBlock' => $startBlock,
'大小' => $大小);
if (($name == "Workbook") || ($name == "Book")) {
$this->wrkbook = count($this->props) - 1;
}
if ($name == "根境") {
$this->rootentry = count($this->props) - 1;
}
//echo "name ==$name=n";
$offset += PROPERTY_STORAGE_BLOCK_SIZE;
}
}
function getWorkBook(){
if ($this->props[$this->wrkbook]['size'] // getSmallBlockStream(PropertyStorage ps)
$rootdata = $this->__readData($this->props[$this->rootentry]['startBlock']);
$streamData = '';
$block = $this->props[$this->wrkbook]['startBlock'];
//$count = 0;
$pos = 0;
while ($block != -2) {
$pos = $block * SMALL_BLOCK_SIZE;
$streamData .= substr($rootdata, $pos, SMALL_BLOCK_SIZE);
$block = $this->smallBlockChain[$block];
}
回傳 $streamData;
}else{
$numBlocks = $this->props[$this->wrkbook]['size'] / BIG_BLOCK_SIZE;
if ($this->props[$this->wrkbook]['size'] % BIG_BLOCK_SIZE != 0) {
$numBlocks++;
}
if ($numBlocks == 0) return '';
//echo "numBlocks = $numBlocksn";
//byte[] streamData = new byte[numBlocks * BIG_BLOCK_SIZE];
//print_r($this->wrkbook);
$streamData = '';
$block = $this->props[$this->wrkbook]['startBlock'];
//$count = 0;
$pos = 0;
//echo "block = $block";
while ($block != -2) {
$pos = ($block + 1) * BIG_BLOCK_SIZE;
$streamData .= substr($this->data, $pos, BIG_BLOCK_SIZE);
$block = $this->bigBlockChain[$block];
}
//echo 'stream'.$streamData;
回傳$streamData;
}
}
}
//oleread.php的内容end=======================================================================================================
//require_once 'OLE.php';
define('SPREADSHEET_EXCEL_READER_BIFF8', 0x600);
define('SPREADSHEET_EXCEL_READER_BIFF7', 0x500);
define('SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS', 0x5);
define('SPREADSHEET_EXCEL_READER_WORKSHEET', 0x10);
define('SPREADSHEET_EXCEL_READER_TYPE_BOF', 0x809);
define('SPREADSHEET_EXCEL_READER_TYPE_EOF', 0x0a);
define('SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET', 0x85);
define('SPREADSHEET_EXCEL_READER_TYPE_DIMENSION', 0x200);
define('SPREADSHEET_EXCEL_READER_TYPE_ROW', 0x208);
define('SPREADSHEET_EXCEL_READER_TYPE_DBCELL', 0xd7);
define('SPREADSHEET_EXCEL_READER_TYPE_FILEPASS', 0x2f);
define('SPREADSHEET_EXCEL_READER_TYPE_NOTE', 0x1c);
define('SPREADSHEET_EXCEL_READER_TYPE_TXO', 0x1b6);
define('SPREADSHEET_EXCEL_READER_TYPE_RK', 0x7e);
define('SPREADSHEET_EXCEL_READER_TYPE_RK2', 0x27e);
define('SPREADSHEET_EXCEL_READER_TYPE_MULRK', 0xbd);
define('SPREADSHEET_EXCEL_READER_TYPE_MULBLANK', 0xbe);
define('SPREADSHEET_EXCEL_READER_TYPE_INDEX', 0x20b);
define('SPREADSHEET_EXCEL_READER_TYPE_SST', 0xfc);
define('SPREADSHEET_EXCEL_READER_TYPE_EXTSST', 0xff);
define('SPREADSHEET_EXCEL_READER_TYPE_CONTINUE', 0x3c);
define('SPREADSHEET_EXCEL_READER_TYPE_LABEL', 0x204);
define('SPREADSHEET_EXCEL_READER_TYPE_LABELSST', 0xfd);
define('SPREADSHEET_EXCEL_READER_TYPE_NUMBER', 0x203);
define('SPREADSHEET_EXCEL_READER_TYPE_NAME', 0x18);
define('SPREADSHEET_EXCEL_READER_TYPE_ARRAY', 0x221);
define('SPREADSHEET_EXCEL_READER_TYPE_STRING', 0x207);
define('SPREADSHEET_EXCEL_READER_TYPE_FORMULA', 0x406);
define('SPREADSHEET_EXCEL_READER_TYPE_FORMULA2', 0x6);
define('SPREADSHEET_EXCEL_READER_TYPE_FORMAT', 0x41e);
define('SPREADSHEET_EXCEL_READER_TYPE_XF', 0xe0);
define('SPREADSHEET_EXCEL_READER_TYPE_BOOLERR', 0x205);
define('SPREADSHEET_EXCEL_READER_TYPE_UNKNOWN', 0xffff);
define('SPREADSHEET_EXCEL_READER_TYPE_NINETEENFOUR', 0x22);
define('SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS', 0xE5);
define('SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS' , 25569);
define('SPREADSHEET_EXCEL_READER_UTCOFFSETDAYS1904', 24107);
define('SPREADSHEET_EXCEL_READER_MSINADAY', 86400);
//define('SPREADSHEET_EXCEL_READER_MSINADAY', 24 * 60 * 60);
//define('SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT', "%.2f");
define('SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT', "%s");
/*
* Place includes, constant defines and $_GLOBAL settings here.
* Make sure they have appropriate docblocks to avoid phpDocumentor
* construing they are documented by the page-level docblock.
*/
/**
* A class for reading Microsoft Excel Spreadsheets.
*
* Originally developed by Vadim Tkachenko under the name PHPExcelReader.
* (http://sourceforge.net/projects/phpexcelreader)
* Based on the Java version by Andy Khan (http://www.3ppt.com). Now
* maintained by David Sanders. Reads only Biff 7 and Biff 8 formats.
*
* @category Spreadsheet
* @package Spreadsheet_Excel_Reader
* @author Vadim Tkachenko
* @copyright 2010-2011 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version Release: @package_version@
* @link http://pear.php.net/package/PackageName
* @see OLE, Spreadsheet_Excel_Writer
*/
class ReadexcelSystem{
/**
* Array of worksheets found
*
* @var array
* @access public
*/
var $boundsheets = array();
/**
* Array of format records found
*
* @var array
* @access public
*/
var $formatRecords = array();
/**
* todo
*
* @var array
* @access public
*/
var $sst = array();
/**
* Array of worksheets
*
* The data is stored in 'cells' and the meta-data is stored in an array
* called 'cellsInfo'
*
* Example:
*
* $sheets --> 'cells' --> row --> column --> Interpreted value
* --> 'cellsInfo' --> row --> column --> 'type' - Can be 'date', 'number', or 'unknown'
* --> 'raw' - The raw data that Excel stores for that data cell
*
* @var array
* @access public
*/
var $sheets = array();
/**
* The data returned by OLE
*
* @var string
* @access public
*/
var $data;
/**
* OLE object for reading the file
*
* @var OLE object
* @access private
*/
var $_ole;
/**
* Default encoding
*
* @var string
* @access private
*/
var $_defaultEncoding;
/**
* Default number format
*
* @var integer
* @access private
*/
var $_defaultFormat = SPREADSHEET_EXCEL_READER_DEF_NUM_FORMAT;
/**
* todo
* List of formats to use for each column
*
* @var array
* @access private
*/
var $_columnsFormat = array();
/**
* 待辦事項
*
* @var 整數
* @access 私人
*/
var $_rowoffset = 1;
/**
* 待辦事項
*
* @var 整數
* @access 私人
*/
var $_coloffset = 1;
/**
* Excel 使用的預設日期格式清單
*
* @var array
* @access public
*/
var $dateFormats = array (
0xe => "d/m/Y",
0xf => "d-M-Y",
0x10 => “d-M”,
0x11 =>“M-Y”,
0x12 =>“h:i a”,
0x13 =>“h:i:s a”,
0x14 => “H:i ",
0x15 => "H:i:s",
0x16 => "d/m/Y H:i",
0x2d => " :s",
0x2e => " H:i:s",
0x2f => "i:s.S");
/**
* Excel 使用的預設數字格式
*
* @var array
* @access public
*/
var $numberFormats = array(
0x1 => "%1.0f", // "0"
0x2 => "%1.2f" ,/ / "0.00",
0x3 => "%1.0f", //"#,##0",
0x4 => "%1.2f", //"#,## 0.00",
0x5 => "%1.0f", /*"$#,##0;($#,##0)",*/
0x6 => '$%1.0f ', /*"$ #,##0;($#,##0)",*/
0x7 => '$%1.2f', //"$#,##0.00;($ #,##0.00)" ,
0x8 => '$%1.2f', //"$#,##0.00;($#,##0.00)",
0x9 => '%1.0f%%', // "0%"
0xa => '%1.2f%%', // "0.00%"
0xb => '%1.2f', // 0.00 E00",
0x25 => '% 1.0f', // "#,##0;(#,##0)",
0x26 => '%1.0f', //" #,##0;(#,##0) ",
0x27 => '%1.2f', //"#,##0.00;(#,##0.00)",
0x28 => '%1.2f', //"#,# #0.00;(#,##0.00)",
0x29 => '%1.0f', //"#,##0;(#,##0)",
0x2a => '$ %1.0f', //"$#,##0;($#,##0)",
0x2b => ' %1.2f', //"#,##0.00;(#,# #0.00)",
0x2c => '$%1.2f', //"$#,##0.00;($# ,##0.00)",
0x30 => '%1.0f') ; //"##0.0E0";
// }}}
// {{{ Spreadsheet_Excel_Reader()
/**
* 建構子
*
* 一些基本的初始化
*/
函數__construct()
{
$this->_ole =& new OLERead()
$this->setUTFEncoder('iconv') );
}
// }}}
// {{ { setOutputEncoding()
/**
* 設定編碼方式
*
* @param string 使用的編碼
* @access public
*/
函數 setOutputEncoding($encoding)
{
$this->_defaultEncoding = $encoding;
}
// }}}
// {{{ setUTFEncoder()
/**
* $encoder = 'iconv' 或'mb'
* 如果您想使用'iconv' 將UTF-16LE 編碼為您的編碼,請設定iconv
* 如果您想使用'mb_convert_encoding',請設定mb用於將UTF-16LE 編碼為您的編碼
*
* @access public
* @param string 要使用的編碼類型。 “iconv”或“mb”
*/
function setUTFEncoder($encoder = 'iconv')
function setUTFEncoder($encoder = 'iconv')
{
$this->_encoderFunction = '';
if ($encoder == 'iconv') {
$this->_encoderFunction = function_exists('iconv') ? '圖示':'';
} elseif ($encoder == 'mb') {
$this->_encoderFunction = function_exists('mb_convert_encoding') ?
'mb_convert_encoding' :
'';
}
}
// }}}
// {{{ setRowColOffset()
/**
* 待辦事項
*
* @access public
* @param offset
*/
函數 setRowColOffset($iOffffset)
{
$this->_rowoffset = $iOffset;
$this->_coloffset = $iOffset;
}
// }}}
// {{{ setDefaultFormat()
/**
* 設定預設數字格式
*
* @access public
* @param 預設格式
*/
函數 setDefaultFormat($sFormat)
{
函數 setDefaultFormat($sFormat)
{
$this->_defaultFormat = $sFormat;
}
// }}}
// {{{ setColumnFormat()
/**
* 強制列使用某種格式
*
* @access public
* @param 整數列號
* @param string 格式
*/
function setColumnFormat($column, $sFormat)
function setColumnFormat($column, $sFormat)
{
$this->_columnsFormat[$column] = $sFormat;
}
// }}}
// {{{ read()
/**
* 使用 OLE 讀取電子表格文件,然後解析
*
* @access public
* @param filename
* @todo 傳回有效值
*/
函數 read($sFileName)
{
/*
require_once 'OLE.php';
$ole = new OLE();
$ole->read($sFileName);
foreach ($ole->_list as $i => $pps) {
if (($pps->姓名 == '工作簿' || $pps->姓名 == '書籍') &&
$pps->大小>= SMALL_BLOCK_THRESHOLD) {
$this->data = $ole->getData($i, 0, $ole->getDataLength($i) );
} elseif ( $pps->Name == '根邊境') { $this->data = $ole->getData($i, 0, $ole->getDataLength($我)); } //var_dump(strlen($ole->getData($i, 0, $ole->getDataLength($i))), $pps->姓名, md5($this->data), $ole->getDataLength ($i)); }
//退出;
$this->_parse();
返回sizeof($this->sheets) > 0;
*/
$res = $this->_ole- >read($sFileName);
// 哎呀,出問題了(Darko Miljanovic)
if($res === false) {
// 檢查錯誤碼
if($this- >_ole->error == 1) {
// 錯誤檔案
die('檔案名稱' . $sFileName . ' 不可讀');
}
//在這裡檢查其他錯誤程式碼(例如錯誤的檔案格式等...)
}
$this->data = $this->_ole->getWorkBook() ;
/*
$res = $this- >_ole->read($sFileName);
if ($this->isError($res)) {
// var_dump($res);
回傳$this->raiseError($res) ;
}
$total = $this->_ole->ppsTotal();
for ($i = 0; $i if ($this- >_ole->isFile($i)) {
$type = unpack( "v", $this->_ole->getData($i, 0, 2));
if ($type[' '] == 0x0809) { // 檢查是否為BIFF 流
$this->_index = $i;
$this->data = $this->_ole->getData($i, 0, $ this->_ole->getDataLength($i));
休息;
}
}
}
if ($this->_index === null) {
return $this->raiseError("$file 似乎不是一個Excel 檔案」);
}
*/
//echo "data =".$this->data;
//$this ->readRecords();
$this->_parse();
}
// }}}
// {{{ _parse()
/**
* 解析工作簿
*
* @access private
* @return bool
* /
function _parse()
{
$pos = 0;
$code = ord($this->data[$pos]) | ord($this->data[$pos+ 1])$length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])$ version = ord($this->data[$pos + 4]) | ord($this->data[$pos + 5])$substreamType = ord($this->data[$ pos + 6]) | ord($this->data[$pos + 7])//echo "開始解析code=".base_convert($code,10,16)." version= ".base_convert($version,10,16)." substreamType=".base_convert($substreamType,10, 16).""."n";
if (($version != SPREADSHEET_EXCEL_READER_BIFF8) &&
($version != SPREADSHEET_EXCEL_READER_BIFF7)) {
返回false;
}
if ($substreamType != SPREADSHEET_EXCEL_READER_WORKBOOKGLOBALS){ $pos += $length + 4;
$code = ord($this->data[$pos]) | ord($this->data[$pos+1])$length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])while ($code != SPREADSHEET_EXCEL_READER_TYPE_EOF ) {
switch ($code) {
case SPREADSHEET_EXCEL_READER_TYPE_SST:
//echo "Type_SSTn";
$spos = $pos + 4;
$limitpos = $spos +$le
$uniqueStrings = $this->_GetInt4d($this->data, $spos+4);
$spos += 8;
for ($i = 0; $i //讀入字元數
if ($spos == $limitpos) {
$opcode = ord($this->data[$spos]) | ord($this-> data[$spos+1])$conlength = ord($this->data[$spos+2]) | ord($this->data[$spos+3])if ($opcode != 0x3c) {
回傳-1;
}
$spos += 4;
$limitpos = $spos + $conlength;
}
$numChars = ord($this->data[$spos]) | (ord($this->data[$spos+1]) //echo "i = $i pos = $pos numChars = $numChars ";
$spos += 2;
$optionFlags = ord($this->data[$spos]);
$spos++;
$asciiEncoding = ( ($optionFlags & 0x01) == 0) ;
$extendedString = (($optionFlags & 0x04) != 0);
// 查看字串是否包含格式資訊
$richString = ( ($ optionFlags & 0x08) != 0);
if ($richString) {
// 讀入crun
$formattingRuns = ord($this->data[$spos]) | (ord($this ->data[$spos+1]) $spos += 2;
}
if ($extendedString) {
// 讀入cchExtRst
$extendedRunLengength = $this->_GetInt4d($this->data, $spos);
$spos += 4;
}
$len = ($asciiEncoding)? $numChars : $numChars*2;
if ($spos + $len $retstr = substr($this->data, $spos, $len);
$spos += $len;
}else {
// 找到計數
$retstr = substr($this->data, $spos, $limitpos - $spos);
$bytesRead = $limitpos - $spos;
$charsLeft = $numChars - (($asciiEncoding) ? $bytesRead : ($bytesRead / 2));
$spos = $limitpos;
while ($charsLeft > 0){
$opcode = ord($thiscode = ord($thiscode = ord($thiscode = ord($thiscode = ord($thiscode = ord($this ->data[$spos]) | ord($this->data[$spos+1])$conlength = ord($this->data[$spos+2]) | ord( $this->data[$spos+3])if ($opcode != 0x3c) {
回傳-1;
}
$spos += 4;
$limitpos = $spos + $conlength;
$option = ord($this->data[$spos]);
$spos += 1;
if ($asciiEncoding && ($option == 0)) {
$len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength);
$retstrstrstrstrstr .= substr($this->data, $spos, $len);
$charsLeft -= $len;
$asciiEncoding = true;
}elseif (!$asciiEncoding && ($option != 0)){
$len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength);
$retstr .= substr($this->data, $spos, $len);
$charsLeft -= $len/2;
$asciiEncoding = false;
}elseif (!$asciiEncoding && ($option == 0)) {
/ / 糟糕- 字串以Unicode 開頭,但在
// 延續之後,它採用簡單的ASCII 編碼
$len = min($charsLeft, $limitpos - $spos); // min($charsLeft, $conlength);
for ($j = 0; $j $retstr .= $this->data[$spos + $j].chr(0);
}
$charsLeft -= $len;
$asciiEncoding = false;
}其他{
$newstr = '';
for ($j = 0; $j $newstr = $retstr[$j].chr(0);
}
$retstr = $newstr;
$len = min($charsLeft * 2, $limitpos - $spos); // min($charsLeft, $conlength);
$retstr .= substr($this->data, $spos, $len);
$charsLeft -= $len/2;
$asciiEncoding = false;
//回顯「Izavratn」;
}
$spos += $len;
}
}
$ retstr = ($asciiEncoding) ? $retstr : $this->_encodeUTF16($retstr);
// echo "Str $i = $retstrn";
if ($richString){
$spos + = 4 * $formattingRuns;
}
// 對於擴充字串,跳過擴充字串資料
if ($extendedString) {
$spos += $extendedRunLength;
}
//if ($retstr == '德比'){
// echo "bbn";
//}
$this->sst[]=$retstr;
}
/*$continueRecords = array();
while ($this->getNextCode() == Type_CONTINUE) {
$continueRecords[] = &$this->nextRecord();
}
//echo " 1 Type_SSTn";
$this->shareStrings = new SSTRecord($r, $continueRecords);
//print_r($this->shareStrings->strings);
* /
// echo 'SST read: '.($time_end-$time_start)."n";
休息;
case SPREADSHEET_EXCEL_READER_TYPE_FILEPASS:
返回false>; case SPREADSHEET_EXCEL_READER_TYPE_NAME:
//echo "Type_NAMEs";
休息;
case SPREADSHEET_EXCEL_READER_TYPE_FORMAT: $ >data[$pos+5]) if ($version == SPREADSHEET_EXCEL_READER_BIFF8) {
$numchars = ord($this->data[$pos+6]) | ord($this ->data[$pos+7]) if (ord($this->data[$pos+8]) == 0){
$formatString = substr($this-> data, $pos+9, $numchars);
} else {
$formatString = substr($this->data, $pos+9, $numchars*2);
}
} else {
$numchars = ord($this->data[$pos+6]);
$formatString = substr($this->data, $pos+7, $numchars*2);
}
$this->formatRecords[$indexCode] = $formatString;
// echo "Type.FORMATn";
休息;
case SPREADSHEET_EXCEL_READER_TYPE_XFs
case SPREADSHEET_EXCEL_READER_TYPE_XFXFed:Fpate,Fed:0,0,4,5,4): $indexCode = ord($this->data[$pos+6]) | ord($this->data[$pos+7]) //echo "nType .XF ".count($this->formatRecords['xfrecords'])." $indexCode ";
if (array_key_exists($indexCode, $this->dateFormats)) {
//echo "isdate " .$dateFormats[$indexCode];
$this->formatRecords['xfrecords'][] = array(
'type' => 'date',
'format' => $this-> dateFormats[$indexCode ]
);
}elseif (array_key_exists($indexCode, $this->numberFormats)) {
//echo "isnumber".$this->numberFormats[$indexCode]; 🎜>$this->formatRecords['xfrecords'][] = array(
'type' => 'number',
'format' => $this->numberFormats[$indexCode ]
) ;
}其他{
$isdate = FALSE;
if ($indexCode > 0){
if (isset($this->formatRecords[$indexCode]))
$formatstr = $this->formatRecords[$indexCode];
//回顯'.other.';
//echo "ndate-time=$formatstr=n";
if ($formatstr)
if (preg_match("/[^hmsday/-:s]/i", $formatstr) == 0) { // 找出日期和時間格式
$isdate =真的;
$formatstr = str_replace ('mm', 'i', $formatstr);
$formatstr = str_replace('h', 'H', $formatstr);
//echo "ndate-time $formatstr n";
}
}
if ($isdate){
$this->formatRecords['xfrecords'][] = array(
'type' => 'date',
'format ' => $formatstr,
);
}else{
$this->formatRecords['xfrecords'][] = array(
'type' => '其他',
'format' => '',
'code' => $indexCode
);
}
}
//回顯「n」;
休息;
case SPREADSHEET_EXCEL_READER_TYPE_NINETEEFOUR:
//echo "Type.NINETEENFOURn";
$this->nineteenFour = (ord($this->data[$pos+4]) == 1);
休息;
case SPREADSHEET_EXCEL_READER_TYPE_BOUNDSHEET:
//echo "Type.BOUNDSHEETn";
$rec_offset = $this->_GetInt4d($this->data, $pos+4);
$rec_typeFlag = ord($this->data[$pos+8]);
$rec_visibilityFlag = ord($this->data[$pos+9]);
$rec_length = ord($this->data[$pos+10]);
if ($version == SPREADSHEET_EXCEL_READER_BIFF8){
$chartype = ord($this->data[$pos+11]);
if ($chartype == 0){
$rec_name = substr($this->data, $pos+12, $rec_length);
} else {
$rec_name = $this->_encodeUTF16(substr($this->data, $pos+12, $rec_length*2));
}
}elseif ($version == SPREADSHEET_EXCEL_READER_BIFF7){
$rec_name = substr($this->data, $pos+11, $rec_length);
}
$this->boundsheets[] = array('name'=>$rec_name,
'offset'=>$rec_offset);
休息;
}
//echo "Code = ".base_convert($r['code'],10,16)."n";
$pos += $length + 4;
$code = ord($this->data[$pos]) | ord($this->data[$pos+1])$length = ord($this->data[$pos+2]) | ord($this->data[$pos+3])//$r = &$this->nextRecord();
//echo "1 Code = ".base_convert($r['code'],10,16)."n";
}
foreach ($this->boundsheets as $key=>$val){
$this->sn = $key;
$this->_parsesheet($val['offset']);
}
回傳 true;
}
/**
* 解析工作表
*
* @access private
* @param todo
* @todo 修正回傳代碼
*/
function _parsesheet($spos)
{
$cont = true;
// 讀取 BOF
$code = ord($this->data[$spos]) | ord($this->data[$spos+1])$length = ord($this->data[$spos+2]) | ord($this->data[$spos+3])$version = ord($this->data[$spos + 4]) | ord($this->data[$spos + 5])$substreamType = ord($this->data[$spos + 6]) | ord($this->data[$spos + 7])if (($version != SPREADSHEET_EXCEL_READER_BIFF8) && ($version != SPREADSHEET_EXCEL_READER_BIFF7)) {
return -1;
}
if ($substreamType != SPREADSHEET_EXCEL_READER_WORKSHEET){
return -2;
}
//echo "開始解析 code=".base_convert($code,10,16)." version=".base_convert($version,10,16)." substreamType=".base_convert($子流類型,10,16).""."n";
$spos += $length + 4;
//var_dump($this->formatRecords);
//echo "code $code $length";
while($cont) {
//echo "mem= ".memory_get_usage()."n";
// $r = &$this->file->nextRecord();
$lowcode = ord($this->data[$spos]);
if ($lowcode == SPREADSHEET_EXCEL_READER_TYPE_EOF) 中斷;
$code = $lowcode | ord($this->data[$spos+1])$length = ord($this->data[$spos+2]) | ord($this->data[$spos+3])$spos += 4;
$this->sheets[$this->sn]['maxrow'] = $this->_rowoffset - 1;
$this->sheets[$this->sn]['maxcol'] = $this->_coloffset - 1;
//echo "Code=".base_convert($code,10,16)." $coden";
unset($this->rectype);
$this->乘數 = 1; // 需要使用 %
switch ($code) {
case SPREADSHEET_EXCEL_READER_TYPE_DIMENSION:
//echo 'Type_DIMENSION ';
if (!isset($this->numRows)) {
if (($length == 10) || ($version == SPREADSHEET_EXCEL_READER_BIFF7)){
$this->sheets[ $this ->sn]['numRows'] = ord($this->data[$spos+2]) | $this->sn]['numRows'] = ord($this->data[$spos+2]) | $this->sn]['numRows'] = ord($this->data[$spos+ 2]) | ord($this->data[$spos+3]) $this->sheets[$this->sn]['numCols'] = ord($this->data[$spos+ 6 ])| ord($this->data[$spos+7]) } else {
$this->sheets[$this->sn]['numRows'] = ord($this- >數據[$spos+4]) | ord($this->data[$spos+5]) $this->sheets[$this->sn]['numCols'] = ord($this->data[$spos+ 10 ])| ord($this->data[$spos+11]) }
}
//echo 'numRows'.$this->numRows.' '.$this->numCols."n";
休息;
case SPREADSHEET_EXCEL_READER_TYPE_MERGEDCELLS:
$cellRanges = ord($this->data[$spos]) | ord($this->data[$spos+1])for ($i = 0; $i $fr = ord($this->data[$spos + 8*$i + 2]) | ord($this->data[$spos + 8*$i + 3])$lr = ord($this->data[$spos + 8*$i + 4]) | ord($this->data[$spos + 8*$i + 5])$fc = ord($this->data[$spos + 8*$i + 6]) | ord($this->data[$spos + 8*$i + 7])$lc = ord($this->data[$spos + 8*$i + 8]) | ord($this->data[$spos + 8*$i + 9])//$this->sheets[$this->sn]['mergedCells'][] = array($fr + 1, $fc + 1, $lr + 1, $lc + 1);
if ($lr - $fr > 0) {
$this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc+1][ 'rowspan' ] = $lr - $fr + 1;
}
if ($lc - $fc > 0) {
$this->sheets[$this->sn]['cellsInfo'][$fr+1][$fc +1] ['colspan'] = $lc - $fc + 1;
}
}
//echo "合併儲存格 $cellRanges $lr $fr $lc $fcn";
休息;
case SPREADSHEET_EXCEL_READER_TYPE_RK:
case SPREADSHEET_EXCEL_READER_TYPE_RK2:
//echo 'SPREADSHEET_EXCEL_REPE_TYPE_RK";
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])$rknum = $this->_GetInt4d($this->data, $spos + 6);
$numValue = $this->_GetIEEE754($rknum);
//echo $numValue." ";
if ($this->isDate($spos)) {
list($string, $raw) = $this->createDate($numValue);
}其他{
$raw = $numValue;
if (isset($this->_columnsFormat[$column + 1])){
$this->curformat = $this->_columnsFormat[$column + 1];
}
$string = sprintf($this->curformat, $numValue * $this->multiplier);
//$this->addcell(RKRecord($r));
}
$this->addcell($row, $column, $string, $raw);
//echo "Type_RK $row $column $string $raw {$this->curformat}n";
休息;
case SPREADSHEET_EXCEL_READER_TYPE_LABELSST:
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])$xfindex = ord($this->data[$spos+4]) | ord($this->data[$spos+5])$index = $this->_GetInt4d($this->data, $spos + 6);
//var_dump($this->sst);
$this->addcell($row, $column, $this->sst[$index]);
//echo "LabelSST $row $column $stringn";
休息;
case SPREADSHEET_EXCEL_READER_TYPE_MULRK:
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])$colFirst = ord($this->data[$spos+2]) | ord($this->data[$spos+3])$colLast = ord($this->data[$spos + $length - 2]) | ord($this->data[$spos + $length - 1])$columns = $colLast - $colFirst + 1;
$tmppos = $spos+4;
for ($i = 0; $i $numValue = $this->_GetIEEE754($this->_GetInt4d($this->data, $tmppos) + 2) );
if ($this->isDate($tmppos-4)) {
list($string, $raw) = $this->createDate($numValue);
}其他{
$raw = $numValue;
if (isset($this->_columnsFormat[$colFirst + $i + 1])){
$this->curformat = $this->_columnsFormat[$colFirst + $i + 1] ;
}
$string = sprintf($this->curformat, $numValue * $this->multiplier);
}
//$rec['rknumbers'][$i]['xfindex'] = ord($rec['data'][$pos]) | ord($rec['data'][$pos+1]) $tmppos += 6;
$this->addcell($row, $colFirst + $i, $string, $raw);
//echo "MULRK $row ".($colFirst + $i)." $stringn";
}
//MulRKRecord($r);
//從多筆記錄中取得單一儲存格記錄
//$num = ;
休息;
案例 SPREADSHEET_EXCEL_READER_TYPE_NUMBER:
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])$tmp = unpack("ddou​​ble", substr($this->data, $spos + 6, 8)); // 它依賴機器
if ($this->isDate($spos)) {
list($string, $raw) = $this->createDate($tmp['double']) ;
// $this->addcell(DateRecord($r, 1));
}else{
//$raw = $tmp[''];
if (isset($this->_columnsFormat[$column + 1])){
$this->curformat = $this->_columnsFormat[$column + 1];
}
$raw = $this->createNumber($spos);
$string = sprintf($this->curformat, $raw * $this->multiplier);
// $this->addcell(NumberRecord($r));
}
$this->addcell($row, $column, $string, $raw);
//echo "數字$行$列$stringn";
休息;
案例SPREADSHEET_EXCEL_READER_TYPE_FORMULA:
案例SPREADSHEET_EXCEL_READER_TYPE_FORMULA2:
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])$column = ord( $this->data[$spos+2]) | ord($this->data[$spos+3])if ((ord($this->data[$spos+6] )==0) && (ord($this->data[$spos+12])==255) && (ord( $this->data[$spos+13])==255)) {
//字串公式。結果遵循STRING 記錄
//echo "FORMULA $row $column Formula with a string
n";
} elseif ((ord($this->data[$spos+6])==1 ) && (ord($this->data[$spos+12])==255) && (ord ($this->data[$spos+13])==255)) {
//布林公式。結果為+2;0=假,1=真
} elseif ((ord($this->data[$spos+6])==2) && (ord($this->data[$spos+ 12]) ==255) && (ord($this->data[$spos+13])==255)) {
//錯誤公式。錯誤碼為+2;
} elseif ((ord($this->data[$spos+6])==3) && (ord($this->data[$spos+12])==255 ) && (ord ($this->data[$spos+13])==255)) {
//公式結果為空字串。
} else {
// 結果是一個數字,所以前14 個位元組就像_NUMBER 記錄
$tmp = unpack("ddou​​ble", substr($this->data, $spos + 6, 8)); // 它依賴機器
if ($this->isDate($spos)) {
list($string, $raw) = $this->createDate($ tmp['double']) ;
// $this->addcell(DateRecord($r, 1));
}else{
//$raw = $tmp[''];
if (isset($this->_columnsFormat[$column + 1])){
$this->curformat = $this->_columnsFormat[$column + 1];
}
$raw = $this->createNumber($spos);
$string = sprintf($this->curformat, $raw * $this->multiplier);
// $this->addcell(NumberRecord($r ));
}
$this->addcell($row, $column, $string, $raw);
//echo "數字$行$列$stringn";
}
休息;
case SPREADSHEET_EXCEL_READER_TYPE_BOOLERR:
$row = ord($this->data[$spos]) | ord($this->data[$spos+1])
$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])$string = ord($this->data[ $spos+6]);
$this->addcell($row, $column, $string);
//echo 'Type_BOOLERR '."n";
休息;
案例SPREADSHEET_EXCEL_READER_TY :
案例SPREADSHEET_EXCEL_READER_TYPE_DBCELL:
案例SPREADSHEET_EXCEL_READER_TYPE_MULBLANK:
中斷;
案例SPREADSHEET_EXCEL_REA4>(FEL_RE3($L)($L); this->data [$spos+1])$column = ord($this->data[$spos+2]) | ord($this->data[$spos+3])$this->addcell($row, $column, substr($this->data, $spos + 8, ord($this->data[$spos + 6]) | ord($this ->data [$spos + 7])// $this->addcell(LabelRecord($r));
休息;
案例SPREADSHEET_EXCEL_READER_TYPE_EOF:
$conADSHEET_EXCEL_READER_TYPE_EOF:
$cont = false;
休息;
default:
//echo 'unknown :'.base_convert($r['code'],10,16)."n";
休息;
}
$spos += $length;
}
if (!isset($this->sheets[$this->sn]['numRows']))
$this->sheets[$ this->sn] ['numRows'] = $this->sheets[$this->sn]['maxrow'];
if (!isset($this->sheets[$this->sn][ 'numCols']))
$this->sheets[$this->sn]['numCols' ] = $this->sheets[$this->sn]['maxcol'];
}
/**
* 檢查目前讀取的記錄是否為日期
*
* @param todo
* @return boolean 如果是日期則為 True,否則為 false
*/
function isDate($spos)
{
//$xfindex = GetInt2d(, 4);
$xfindex = ord($this->data [$spos+4]) | ord($this->data[$spos+5]) //echo '檢查是日期'.$xfindex.' '.$this->formatRecords[ 'xfrecords'][$xfindex]['type']."n";
//var_dump($this->formatRecords['xfrecords'][$xfindex]);
if ($this-> formatRecords['xfrecords'][$xfindex]['type'] == 'date') {
$this->curformat = $this->formatRecords[' xfrecords'][$xfindex]['格式'] ;
$this->rectype = '日期';
回傳真;
} else {
if ($this->formatRecords['xfrecords'][$xfindex]['type'] == 'number') {
$this->curformat = $this ->formatRecords['xfrecords'][$xfindex]['format'];
$this->rectype = 'number';
if (($xfindex == 0x9) || ($xfindex == 0xa)){
$this->乘數= 100;
}
}else{
$this- >curformat = $this->_defaultFormat;
$this->rectype = '未知';
}
回傳false;
}
} //}}}}}}}}
//{{{ createDate()
/**
* 將原始 Excel 日期轉換為人類可讀的格式
*
* Excel 中的日期儲存為從紀元開始的秒數。在
* Windows 上,紀元為30/12/1899,在Mac 上為01/01/1904
*
* @access private
* @param integer 要轉換的原始Excel 值
* @return array 第一個元素是轉換後的日期,第二個元素是unix時間戳
*/
function createDate($numValue)
{
if ($numValue > 1) {
$ 。 date ($this->curformat, $ utcValue);
$raw = $utcValue;
} else {
$raw = $numValue;
$小時= 樓層($numValue * 24);
$分鐘= 下限($ numValue * 24 * 60) - $小時* 60;
$秒= 下限($numValue * SPREADSHEET_EXCEL_READER_MSINADAY) - $小時* 60 * 60 - $分鐘* 60;
$string = date ($-this> curformat, mktime($hours, $mins, $secs));
}
傳回陣列($string, $raw);
}
function createNumber($spos)
{
$rknumhigh = $this->_GetInt4d($this->data, $spos + 10);
$rknumlow = $this->_GetInt4d($this->data, $spos + 6);
//for ($i=0; $idata[$i+$spos+6]) . “”; } 回顯“
”;
$sign = ($rknumhigh & 0x80000000) >>> 31;
$exp = ($rknumhigh & 0x7ff00000) >>> 20;
$尾數= (0x100000 | ($rknumhigh & 0x0000ff 🎜>$mantissalow1 = ($rknumlow & 0x80000000) >>> 31;
$mantissalow2 = ($rknumlow & 0x7fffffff);
$value = $尾數/ pow( 2 exp - 20-$3 )));
if ($mantissalow1 != 0) $value += 1 / pow (2 , (21 - ($exp - 1023)));
$value += $mantissalow2 / pow (2 , (52 - ($exp - 1023)));
//echo "Sign = $sign, Exp = $exp, mantissahighx = $mantissa, mantissalow1 = $mantissalow1, mantissalow2 = $mantissalow2
n";
if ($sign) {$value = -1 * $value;}
回傳$value;
}
function addcell($row, $col, $string, $raw = '' )
{
//echo "ADD cel $row-$col $stringn";
$this->sheets[$this->sn]['maxrow'] = max($this-> sheets[$this->sn]['maxrow'], $row + $this ->_rowoffset);
$this->sheets[$this->sn]['maxcol'] = max($this- >sheets[$this->sn]['maxcol'], $col + $this ->_coloffset);
$this->sheets[$this->sn]['cells'][$row + $ this->_rowoffset][$col + $this->_coloffset] = $string;
if ($raw)
$this->sheets[$this->sn]['cellsInfo'][$row + $this->_rowoffset][$col + $this->; _coloffset]['raw'] = $raw;
if (isset($this->rectype))
$this->sheets[ $this->sn]['cellsInfo'][$row + $this->_rowoffset][$ col + $this->_coloffset]['type'] = $this->rectype;
}
函數_GetIEEE754($rknum)
{
if (($rknum & 0x02) != 0) {
$value = $rknum >>> 2;
} else {
/ /mmp
//這裡先註解掉之前存在的7行程式碼
// $tmp = unpack("d", pack("VV", 0, ($rknum & 0xfffffffc)));
// //$value = $tmp[''];
// if (array_key_exists(1, $tmp)) {
// $value = $tmp[1];
// } else {
// $value = $tmp[''];
// }
// 我從
// http://research.microsoft.com/~hollasch/cgindex /coding/ieeefloat.html
// 取得有關IEEE754 編碼的資訊RK 格式要求僅使用
// 64 位元浮點數值的最高有效30 位元。其他34 位假設為0
// 因此,我們使用$rknum 的高30 位,如下...
$sign = ($rknum & 0x80000000) >>> 31;
$exp = ( $rknum & 0x7ff00000) >>> 20;
$尾數= (0x100000 | ($rknum & 0x000ffffc));
$value = $尾數/ pow( 2 , (20- ($exp - 1023) );
if ($sign) {$value = -1 * $value;}
//mmp 更改結束
}
if (($rknum & 0x01) != 0) {
$值/= 100;
}
回傳$值;
}
函數_encodeUTF16($string)
{
$結果= $string;
if ($this->_defaultEncoding){
switch ($this->_encoderFunction){
case 'iconv' : $result = iconv('UTF-16LE', $this->; _defaultEncoding,$字串) ;
休息;
case 'mb_convert_encoding' : $result = mb_convert_encoding($string, $this->_defaultEncoding, 'UTF-16LE' );
休息;
}
}
回傳$結果;
}
函數_GetInt4d($data, $pos)
{
$value = ord($data[$pos]) | (ord($data[$pos +1]) if ($value >=4294967294)
{
$value=-2;
}
返回$值;
}
}
/*
* 局部變量:
* tab-width: 4
* c-basic-offset: 4
* c-hanging-comment- ender-p: nil
* 結束:
*/
?>


2、呼叫方法

複製程式碼 程式碼如下:


$data = new ReadSystem ();
$data->setOutputEncoding('utf-8');
$data->read($location);
print_r($data->sheets[0]['cells'] );
?>
$data->sheets[0]['cells']


就是我們要取得的excle檔案裡的數據

以上就介紹了php程式設計 php程式實作取得excel文件內容的程式碼實例,包含了php程式設計的內容,希望對PHP教學有興趣的朋友有幫助。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PHP將行格式化為 CSV 並寫入檔案指針 PHP將行格式化為 CSV 並寫入檔案指針 Mar 22, 2024 am 09:00 AM

這篇文章將為大家詳細講解有關PHP將行格式化為CSV並寫入文件指針,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。將行格式化為CSV並寫入檔案指標步驟1:開啟檔案指標$file=fopen("path/to/file.csv","w");步驟2:將行轉換為CSV字串使用fputcsv( )函數將行轉換為CSV字串。此函數接受以下參數:$file:檔案指標$fields:作為陣列的CSV欄位$delimiter:欄位分隔符號(可選)$enclosure:欄位引號(

PHP改變當前的 umask PHP改變當前的 umask Mar 22, 2024 am 08:41 AM

這篇文章將為大家詳細講解有關PHP改變當前的umask,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP更改目前的umask概述umask是一個用於設定新建立的檔案和目錄的預設檔案權限的php函數。它接受一個參數,這是一個八進制數字,表示要阻止的權限。例如,要阻止對新建立的檔案進行寫入權限,可以使用002。更改umask的方法有兩種方法可以更改PHP中的目前umask:使用umask()函數:umask()函數直接變更目前umask。其語法為:intumas

PHP建立一個具有唯一檔案名稱的文件 PHP建立一個具有唯一檔案名稱的文件 Mar 21, 2024 am 11:22 AM

這篇文章將為大家詳細講解有關PHP建立一個具有唯一文件名的文件,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。在PHP中建立唯一檔案名稱的檔案簡介在php中建立具有唯一檔案名稱的檔案對於組織和管理檔案系統至關重要。唯一文件名稱可確保不會覆蓋現有文件,並便於尋找和檢索特定文件。本指南將介紹在PHP中產生唯一檔案名稱的幾種方法。方法1:使用uniqid()函數uniqid()函數產生一個基於當前時間和微秒的唯一字串。此字串可以作為檔案名稱的基礎。

PHP計算檔案的 MD5 雜湊 PHP計算檔案的 MD5 雜湊 Mar 21, 2024 pm 01:42 PM

這篇文章將為大家詳細講解有關PHP計算文件的MD5散列,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP計算檔案的MD5雜湊MD5(MessageDigest5)是一種單向加密演算法,可將任意長度的訊息轉換為固定長度的128位元雜湊值。它廣泛用於確保文件完整性、驗證資料真實性和建立數位簽章。在PHP中計算檔案的MD5雜湊php提供了多種方法來計算檔案的MD5雜湊:使用md5_file()函數md5_file()函數直接計算檔案的MD5雜湊值,傳回一個32個字元的

PHP將檔案截斷到給定的長度 PHP將檔案截斷到給定的長度 Mar 21, 2024 am 11:42 AM

這篇文章將為大家詳細講解有關PHP將文件截斷到給定的長度,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP檔案截斷簡介php中的file_put_contents()函數可用來將檔案截斷到指定長度。截斷是指刪除檔案末端的部分內容,從而縮短檔案長度。語法file_put_contents($filename,$data,SEEK_SET,$offset);$filename:要截斷的檔案路徑。 $data:要寫入檔案的空字串。 SEEK_SET:指定為檔案開始處

PHP傳回一個鍵值翻轉後的陣列 PHP傳回一個鍵值翻轉後的陣列 Mar 21, 2024 pm 02:10 PM

這篇文章將為大家詳細講解有關PHP返回一個鍵值翻轉後的數組,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP鍵值翻轉數組鍵值翻轉是一種對數組進行的操作,它將數組中的鍵和值進行交換,產生一個新的數組,其中原始鍵作為值,原始值作為鍵。實作方法在php中,可以透過以下方法對陣列進行鍵值翻轉:array_flip()函數:array_flip()函數專門用於鍵值翻轉操作。它接收一個數組作為參數,並傳回一個新的數組,其中鍵和值已交換。 $original_array=[

PHP判斷某個數組中是否存在指定的key PHP判斷某個數組中是否存在指定的key Mar 21, 2024 pm 09:21 PM

這篇文章將為大家詳細講解有關PHP判斷某個數組中是否存在指定的key,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。 PHP判斷某個陣列中是否存在指定的key:在php中,判斷某個陣列中是否存在指定的key的方法有多種:1.使用isset()函數:isset($array["key"])此函數傳回布林值,如果指定的key存在,則傳回true,否則傳回false。 2.使用array_key_exists()函數:array_key_exists("key",$arr

PHP會傳回上一個 MySQL 操作中的錯誤訊息的數位編碼 PHP會傳回上一個 MySQL 操作中的錯誤訊息的數位編碼 Mar 22, 2024 pm 12:31 PM

這篇文章將為大家詳細講解有關PHP返回上一個Mysql操作中的錯誤訊息的數字編碼,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。利用PHP回傳MySQL錯誤訊息數字編碼引言在處理mysql查詢時,可能會遇到錯誤。為了有效處理這些錯誤,了解錯誤訊息數字編碼至關重要。本文將指導您使用php取得Mysql錯誤訊息數字編碼。取得錯誤訊息數字編碼的方法1.mysqli_errno()mysqli_errno()函數傳回目前MySQL連線的最近錯誤號碼。文法如下:$erro

See all articles