}
數(shù)據較多(duō)可(kě)以navicat軟件(jiàn)操作φ•✘(zuò);速度較快(kuài)
phpexcel類庫;
<?php
if (!defined('PHPEXCEL_ROOT')) {↓§©
define('PHPEXCEL₹₩"≠_ROOT', dirname(__FILE__≈λ) . '/');
require(PHPE♥γ£XCEL_ROOT . 'PHPExcel/Autoloader.php');≥"'
}
class PHPExcel
{
private $_uniqueID↓>;
private $_propert™ε≤≠ies;
private $_securi∞ β×ty;
private <★$_workSheetCollection = ar↑♥←ray();
private $_calculationEngine = NULL;
private $_activeSheetI ™ndex = 0;
private $_n∞ φ≠amedRanges = array();
privat'₹↔∏e $_cellXfSupervisor;
private $₹≠_cellXfCollection = array();
privat↑&÷e $_cellStyleXfCollection = array();
public function₩£₽ __construct()
{
$this->_uniqueID = uniqᣩφid();
$this->_calculationEn"∏gine = PHPExcel_Calculation::geλ¶tInstance($this);
// Initi≤φalise worksheet collection andφ₹ add one worksheet
φβ $this->_workSheet→'↑Collection = array();
$thi♣₽$s->_workSheetCollect¥φ ion[] = new PHPExcel_Workshee€↓☆t($this);
 ≥β♣; $this->_activeSheetIndex = 0 ¥;
// Cre¶©ate document properties
$thi®✘©s->_properties = new PHPExcel_doc♦≥ ♠umentProperties();
// Cre←≤δate document security
$this->_δ'™security = new PHPExcel_documentSecurity();
// Se✘<t named ranges
&∏ βΩnbsp; $this->_namedRanges = arr÷™Ωay();
// Cre÷✔ate the cellXf supervisor
$this-&g₹∞δ™t;_cellXfSupervisor ♥¥≥= new PHPExcel_Style(true);
$₹←this->_cellXfSupervisor->bindPa"πrent($this);
// Creat ★✔e the default style
$this->aσπ∏ddCellXf(new PHPExce€∏l_Style);
$<✘this->addCellStyleXf(new☆¥ PHPExcel_Style);
}
public fuπε♠nction __destruct() {
PHP≥ Excel_Calculation::uns&β×etInstance($this);
&n'>&bsp; $this->disconnectWorksheets();
} // &nbs&÷↔∏p; function __destruct()
public funct×£♦σion disconnectWorksheets()
{
$worksheet = NULL;
&nb£✘sp; foreach($this->_workSheet ¶♣&Collection as $k => &$work¥✔sheet) {
&nbs↔✘÷↓p; $worksheet->disconnectCells();
 '; $this->_workShe€ etCollection[$k] = null;
 ε₽®; }
unset($worβ∞λksheet);
$this-≈<>_workSheetCollection = array();
}
public function getCalculationEngine()
{
return $this->_calculationE>γ₹↓ngine;
} // function getCellCacheController()
public function ∑φgetProperties()
{
¶∑↑± return $this->β≥•;_properties;
}
public function setPro₹₹perties(PHPExcel_documentProperties $pValue)
{
$this->♥'"_properties = $pValue;
}
public functi&★¥§on getSecurity()
{
&nbγ sp; return $this->_securi♦←αty;
}
public function set< Security(PHPExcel_documentSecurity $pValue)
{
&✘✔nbsp; $this->_security = $pV¥≥≠alue;
}
public fun↔≈ction getActiveSheet()λ×
{
return✔♦ $this->_workSheetColl✘™≥"ection[$this->_activeSheetIndex];
}
public function createShe≤♠et($iSheetIndex = NUL L)
{
¥β≠>$newSheet = new PHPExcel_Worksh£¶ eet($this);
$th≠↑is->addSheet($newSheet,✘¶§ $iSheetIndex);
☆φλφ return $newSheet;
}
public function Ω☆∞₩sheetNameExists($pShe€×etName)
{
return α€×($this->getSheetByName($pπ€ &SheetName) !== NULL);
}
public function addγSheet(PHPExcel_Worksheet $£≈βpSheet, $iSheetIndex = NUL©♠€L)
{
if ($↕★£™this->sheetNameExists($pSh♠§βeet->getTitle())) {
  €✘←; throw new P←•ε<HPExcel_Exception(
♦✘¥♠ "Workbook already contains a worksheet named '{♦★$pSheet->getTitle()}'. Rename t≥λ¥his worksheet first."☆Ω
&n§ €bsp; );
≤★ }
&nbs÷≈p; if($iSheetIndex === NULL) {
&n>☆bsp; if ($this-&₽§gt;_activeSheetIndex &l♦φ∏t; 0) {
&nb©φ↓¶sp; $this-&₹§σgt;_activeSheetIndex ¶= 0;
 δ♦ασ; }
π"•" $this-↔$∞♣>_workSheetCollection[] =→φ $pSheet;
} e↓λ↕™lse {
&nb≈↔sp; // Insert the sheet at t∏₩he requested index
&nbs★Ω©±p; array_splice(
&nbs§εp; $thγ$is->_workSheetCollection,
&nbs₩♦p; $iSheeασ↓tIndex,
&n±∞←bsp; 0 π,
€¶ ¥ array($pSh¥±→eet)
&n±γ ₩bsp;  &©; );
&nbs✔→∞>p; // Adjust acti♠♣ve sheet index if necessary
&nbs επ✔p; if ($this->_activ ∞★eSheetIndex >= $iSheetIn™Ω≥dex) {
&nbs¥→λ₩p; ++$this->_a≠♦ctiveSheetIndex;
 ≥€ ♣; }
}
return $pSεΩheet;
}
public function ≠↕≈removeSheetByIndex($pIndex = 0)
{
$num ←¥Sheets = count($this->_wor✔¶kSheetCollection);
¶≤α if ($pIndex &g®✔₽t; $numSheets - 1) {
♦∑π© throw neπ<w PHPExcel_Exception(
∏ § "You tried to remo₩α÷ve a sheet by the out of bounds δ¥✔index: {$pIndex}. The actual number★β∞ of sheets is {$numSheets}."
&₩←λnbsp; );
&nbΩ¥$sp; } else {
&n♠≠♥bsp; array_sp±&λ≥lice($this->_workSheπ÷ etCollection, $pIndex, 1);
}
// Adjust ∞ active sheet index if necessarσ≥y
if<Ω (($this->_activeSh≠ eetIndex >= $pIndex) &&
&nb→✘sp; ($pIndex > count($this->_φ$workSheetCollection) - 1)) {
&nb♥•sp; --™±&$this->_activeSheetIndex<γ;
₽ }
}
public function g±®&etSheet($pIndex = 0)
{
&nb←≥Ωsp; $numSheets = count($th₹βis->_workSheetCollection);
&δ•↑•nbsp; if ($pIndex > $numSheets ✘Ω£- 1) {
₹≈α throw≠♠♣ new PHPExcel_Exception(
★€ "Your requested γ≥ sheet index: {$pIndex} is out of bound☆™λ☆s. The actual number of sh≥≤eets is {$numSheets}."
&nb↓÷sp; );
&nφ ♠bsp; } else {
₹ return $this->_workSheetCo™↕llection[$pIndex];
}
}
public functio®$n getAllSheets()
{
return $thiπ✔s->_workSheetCollecti±∞÷on;
}
public funct↓☆ion getSheetByName($pName = '')
{
&nbs₽δλp; $worksheetCount = counγ∏§≤t($this->_workSheetCollection);
fo£λ&≈r ($i = 0; $i < $wπ∑orksheetCount; ++$i) {
&♠←nbsp; if ($וthis->_workSheetCollectio¶•₩n[$i]->getTitle() === $pNam♣↓e) {
&nbs•♦p; return ♣₩$this->_workSheetCollection[$iπ₩÷];
↓φ }
}
&'©¥↕nbsp; return NULL;
}
public f®←★unction getIndex(PHPExcel_Worksheet $pα∑Sheet)
{
foreach↑$↕™ ($this->_workSheetφ Collection as $key => φ$value) {
&✘¥ε if↕δ£≥ ($value->getHashCo∞§©de() == $pSheet->getHas¥ ±hCode()) {
 >↔; ←★ε∞return $key;
&nb ≥φ↓sp; }
}
 &ε; throw new PHPExcel_β≥Exception("Sheet does no↔®t exist.");
}
public function✔¶×δ setIndexByName($sheetName, $ne€€ΩwIndex)
{
$oldI≠ $ndex = $this->getIndex($this->get≥₹SheetByName($sheetName✘₹));
&n∑×bsp; $pSheet = array_splice(
&♣'nbsp; $this-&gσ±♣t;_workSheetCollection,
 αλα•; $oldIndex,
&nbα•©↕sp; 1
&nbs≠¶p; );
&nb₽♦α≥sp; array_splice(
±§← $this->_wo♣↕rkSheetCollection,
↓ $newIndex,
'σ™ 0,
♣β $pSheet
);
return $ne λ"wIndex;
}
public function get♦$₹SheetCount()
{
 ®λ; return count($this->_workSheetCo× ∑↕llection);
}
public function getA¥&↕ctiveSheetIndex()
{
&nb¶♣sp; return $this->_activeSheetIndex;₩☆
}
public functi↓↕✔™on setActiveSheetIndπ&ex($pIndex = 0)
{
$numSheets = count($this->_workShe→♥♥↓etCollection);
if ($p©✘♣φIndex > $numSheets - 1) {
γ throw new PHPExcel_Exception(₽≤
&nbs≠ p; "You tried to set a shee≠&εt active by the out of bo ₩unds index: {$pIndex}. The a•≤γ↑ctual number of sheets is {$numSheetsπ☆}."
&nγ÷≤βbsp; );
&nb♠≠×¥sp; } else {
 '™↕; $this->_activeSh$→€∑eetIndex = $pIndex;
↔' ∑}
return $↔δ≥this->getActiveSheet();
}
public functionγ•≈ setActiveSheetIndexByName≠↕ ($pValue = '')
{
&n₽★bsp; if (($worksheet = ↕∏$this->getSheetByName($pValue)) ins☆≥≤tanceof PHPExcel_Worksheet) {
Ω§§ $this->setActiveSheetIn™Ωσ•dex($this->getIndex($worksheet));
&∏≥nbsp; return $works₹ε≥heet;
}
&nbs₹≈δ≥p; throw new PHPExcel_E ↔↕xception('Workbook does not contain sheet:' . $pValue);
}
public func∞©tion getSheetNames()
{
&nb€ sp; $returnValue = array();
&n≥®bsp; $worksheetCount = $thiε✔ €s->getSheetCount();
→≤ for ($i = 0; $i < $worksheetCo∑↓β unt; ++$i) {
 ≥λ≥; $returnValue[β'¶∑] = $this->getSheet($i)->getTitl≤↔e();
 " ; }
return $r ÷÷eturnValue;
}
public function ≠> addExternalSheet(PHPExcel_Work₹↓♥sheet $pSheet, $iSheetIndex = πnull) {
if ('$this->sheetNameExist↔♦λs($pSheet->getTitle())★∞') {
&nbs€÷p; throπ>→w new PHPExcel_Exception("Workbook↑₩↔ already contains a worksheet named '{$pSheΩΩ÷∞et->getTitle()}'. Re"π₽name the external sheet firs±↔t.");
&nbs↔ p; }
// couπ♥×nt how many cellXfs there areβ®• in this workbook cuα rrently, we will need t¶σ₽his below
γ€ $countCellXfs = count($this≠¶σ->_cellXfCollectio>≠©Ωn);
//$<±∏ copy all the shared cellXπ☆fs from the external£± workbook and append them to the c™&urrent
forea§→&•ch ($pSheet->getParent()->getCell α↓XfCollection() as $cellXf) {
±>σδ $this->addCellXf∏↓(clone $cellXf);
↓ ← }
// move ₩↕sheet to this workbook
$pShe∏et->rebindParent($this);
&γnbsp; // updat the c$₹≈ellXfs
≠• foreach ($pSheet->getCellCollection€×∏€(false) as $cellID) {
&♥"✔nbsp; $cell = $pShee≈®λ₩t->getCell($cellID);
δ×♣♠ $cell->€≥;setXfIndex( $cell->getXfIndex() +₽" $countCellXfs );
• }
&nbs>↓±<p; return $this->addSheet( ∑♦λ$pSheet, $iSheetIndex ₹);
}
public function getNamed♥↑σφRanges() {
return $thi←©β♣s->_namedRanges;
}
public function∑€ addNamedRange(PHPExcel_Na&↑medRange $namedRange) {
✔↓♠ if ($namedRange->ge£"'&tScope() == null) {
&n>€♣★bsp; //< global scope
¶β $¥♣&this->_namedRanges[$namedRange-&g✘↕♦♣t;getName()] = $namedR♦'ange;
 ✔♦; } else {
&nbs£©p; // local scope>↔±σ
&nbsεσλβp; $this->_nε₽Ω£amedRanges[$namedRange->δφ;getScope()->getTit ≈δ§le().'!'.$namedRange-&gΩ∞♥Ωt;getName()] = $namedRange;
¶$ }
return true;
}
public function getNamed↔£¥βRange($namedRange, PHPExcel_Worksh±☆eet $pSheet = null) {←Ω♥
&nb ∞ε↕sp; $returnValue = null;
&n₹₩♣↓bsp; if ($namedRange != '' && (±>$namedRange !== NULL)) {
&nbs✘←≤γp; // first look for globπ€®al defined name
>≠ if (isset($this->_namedRanges€✔$σ[$namedRange])) {
 $γ±±; $returnVa×&✘lue = $this->_name§βπdRanges[$namedRange];
ε'✘→ }
&nbs↔βp; // then look for local d©₹♠efined name (has priority over ∑ £global defined name if both names£ε↕ exist)
 ♣Ω; if (($pSheet !== NULL) &>±λ;& isset($this->_na♥σ☆medRanges[$pSheet->getTiγ ♣tle() . '!' . $namedRange])) {
&nb₹★sp; $retu©←≤rnValue = $this->_namedRanges[$pS←☆heet->getTitle() . 'β✔!' . $namedRange];
&n♣¶bsp; }
}
€≤↑ return $returnValue;
}
public f∑♠unction removeNamedRange($namedRange, P♣σHPExcel_Worksheet $pSheet₩£★ = null) {
 Ω₹; if ($pSheet === NUL&"☆≠L) {
&δ'nbsp; if (isset($this->_nam↕₽ edRanges[$namedRange§♠☆™])) {
&γ≤ ≠nbsp; 宥 unset($this->_namedRa©•©←nges[$namedRange]);
δ£ ♣αγ₽}
} else {
φ✔¶• if (isset($this->_name&€dRanges[$pSheet->getTitle() . '!™ €§' . $namedRange])) {
&nb"€±®sp; unset($this->_na≥←πmedRanges[$pSheet->get♠∏•ΩTitle() . '!' . $namedRange]);
φ☆♦ }
}↕×♠
&nb₹π πsp; return $this;
}
public function getWork≠↑∏§sheetIterator() {
&nb•↑sp; return new PHPExcel_Worksheα↑&γetIterator($this);
}
public functioα±n copy() {
$co✘™pied = clone $this;
$w¥₽orksheetCount = count($this->_workSheetCollection);
for ($i = 0ש; $i < $worksheetCount; ++$i♠®δ') {
&n¥✔bsp; $this->_workSheetCo↓llection[$i] = $this->_wor☆₩kSheetCollection[$i]->α€;copy();
&n§¶™$bsp; $this-&g£&¥♣t;_workSheetCollecti∏®♠on[$i]->rebindParent($t≥ →his);
}
return $cop>Ωied;
}
public functi₹☆on __clone() {
f<↑★€oreach($this as $key => $v¥al) {
α♠>® if (is_object($v¥♦al) || (is_array($val))) {
&n€Ω♠bsp; &nbs∑₩★"p; $this->{$key} = unserial♥™ize(serialize($val));
 "δ∞; }
 ÷↑¥¶; }
}
public function getCel☆↑♦lXfCollection()
{
&nγ∏Ωbsp; return $this->_cellXfColleα"ction;
}
public function getCellX♠±fByIndex($pIndex = 0)
{
φ↔ return $this->_cellXfCo ∑↕αllection[$pIndex];
}
public function getCellσα÷XfByHashCode($pValue =☆ '')
{
fore≥↑∏≠ach ($this->_cellXfCollection €as $cellXf) {
→§≤& if ($cellXf->getHashCΩ <ode() == $pValue) {
&nβ≠bsp; return $₩∞cellXf;
 ×<; }
&π¶≈nbsp; }
ret±★φurn false;
}
public function cel₹δ≈δlXfExists($pCellStyle = null) ®©φ
{
&nbs↓•®×p; return in_array($pCellStyle, $thisααδ->_cellXfCollection, tru£↕πe);
}
public funcσε↕≥tion getDefaultStyle()
{
if (isse"₩πt($this->_cellXfCollection[0])) α{
&<✔nbsp; return $this->_cellXfCollectio→₩n[0];
♣∞↕↕ }
th★✘≈row new PHPExcel_Exception('No ←default style found f¥∑↕or this workbook');
}
public function a÷₹ddCellXf(PHPExcel_Style $style)
{
&≤★nbsp; $this->_cellXfCollection[] ="£β× $style;
$style-&₹¶§gt;setIndex(count($this->_cellXfΩ≈Collection) - 1);
}
public function remov∏®∏eCellXfByIndex($pIndex = 0)
{
ifγ ($pIndex > count(₹δ$this->_cellXfCol↑®lection) - 1) {
 ¶π; throw new α®>•PHPExcel_Exception("CellXf index ↑© is out of bounds.");
}™∞ else {
&nbs↑♣ p; // first remove the c≤σ ellXf
♥∏ ε array_splice($this->_cell <≠XfCollection, $pIndeγΩ←x, 1);
∞& // then upΩ'"dat cellXf indexes for cel ♣ ls
&nbs≤ αp; foreach ($th£®πis->_workSheetCollection as £® $worksheet) {
&nb™¶sp; ♥β☆βforeach ($worksheet->getCell₽'↑Collection(false) as $cellID) {
&nbδ™✔∞sp; $cell = $worksheet-&g→βδ t;getCell($cellID);
&nbs®∏↓αp; λγ♣$xfIndex = $cell->getXfInd≥÷™ ex();
"£↔ ±δ✘♣ if (π↕♦$xfIndex > $pIndex ) {
&n♠ bsp; π> // decrease x↕←↑f index by 1
&nbsφ¥→p; &nbs→ ♣↓p; $cell-γ§π>setXfIndex($xfIndex - 1);
&nb∏φsp; &nbs§₩p; } else if ($xfI'♠"ndex == $pIndex) {
 >₩φ↓; &nb∞λsp; // set to∞§ default xf index 0
★π±÷ ™↕ &n ✘bsp; $cell->setXfIndex(0✘¥);
&nbδ♣>∑sp;  >®; }
&nb↕λsp;  ™→φ; }
®§α¥ }
}
}
public fu<₹§♣nction getCellXfSupervisor()
{
ret≈&urn $this->_cellXfSupervis↕↑or;
}
public func♣ εtion getCellStyleXfCollection()
{
 π₹; return $this->_cellStyleXfC₩₩¥↓ollection;
}
public function getCe ΩllStyleXfByIndex($pIndex = 0)
{
α→ return $this->_cellStyleXfC§↕ollection[$pIndex];
}
public f↑λ→unction getCellStyleXfByHashCode($pVa©α€lue = '')
{
foreaε≈ch ($this->_cellXfStyleCollectiΩ<εon as $cellStyleXf) {
&n× bsp; if ($cellStyleXβ£f->getHashCode() == $pValue) {
♣™ return $♥∏≥cellStyleXf;
 ← π≥; }
÷ε}
®← return false;
}
public function addCellSt§ ¶₹yleXf(PHPExcel_Style $pStyle)
{
$this-&g₹t;_cellStyleXfCollection[] = ↓π∏$pStyle;
←©₹ $pStyle->setIndeΩ✔x(count($this->_c×←↕ellStyleXfCollection) - 1);∑£©±
}
public fun≈♦ction removeCellStyleXfByIndex($pIndex &♥= 0)
{
&nb✘ε ™sp; if ($pIndex > count($th¥♠→™is->_cellStyleXfCollection) - "♠ 1) {
&nbs€αp; throw new PHPExcel_Exception("≤>;CellStyleXf index is out of bounds.&βΩ≠quot;);
}↔σπ else {
&nbsδ☆↓∏p; array_splice($this->_cellStyleXfC•★≈"ollection, $pIndex, 1);
}
}
public function garbageCo÷↕llect()
{
//'™• how many references ar₩™±e there to each cellX>₹f ?
¥↕ $countReferencesCellXf = arra☆↓'→y();
f↕π¥oreach ($this->_cellXfColl ∑ection as $index => $cellX↓σ≤₹f) {
 €→≈♠; $countReferencesCellXf[$i& ndex] = 0;
}
←απ foreach ($this->getWork©↑sheetIterator() as $sheet•®÷φ) {
≥<₹ // from cells
&nb>γ© sp; foreach ($↓∏€sheet->getCellCollection(fal¶♣<πse) as $cellID) {
&n±∑bsp; $c≠✔≤ell = $sheet->getCell($cellID);
&nb©♠sp; £φε++$countReferencesCellXf[$cell->getXΩ fIndex()];
&ε★★nbsp; }
÷≠$÷ // from row↓ dimensions
≈≈₩ foreach ($sheet->getRπ®owDimensions() as $rowDiΩ↕✔πmension) {
&n∏♣®bsp; if ($rowDimension-&≠→gt;getXfIndex() !== null) {
 ↕₽; ♦™γ ++$countRe₹♣ferencesCellXf[$rowDimension-&g♣δφt;getXfIndex()];
↔ ∏ ←≤ }
&n→¶®αbsp; }
&n§←✔bsp; // from column dimensions
&nb₹≈♥sp; foreach ($&↓✘sheet->getColumnDimensionsφ®<() as $columnDimension) {
&n♣∏bsp;  ¥±≈; ++$countReferencesCellβε Xf[$columnDimension->g€πetXfIndex()];
®∞π£ }
&nbs↔→✔&p; }
↓∑π // remove cellXfs♦γλ☆ without references and ←±¶create mapping so we♥Ω can updat xfIndex
// fo €r all cells and columnsε✔£
$cou↓ £ntNeededCellXfs = 0;
♦λ foreach ($this->_cellXfCollσ&ection as $index => $cellXΩ™ f) {
&™ ↑ nbsp; if ($countReferencesCel ↑lXf[$index] > 0 || $index == 0™£) { // we must never re∏ move the first cellXf
λ€ &Ω§εnbsp; ++$countNeededCellXf≠∞s;
&n≤₩∑®bsp; } else {
&n¥"bsp; }
&nb¥₩¥sp; $map[$index] = $count€•→NeededCellXfs - 1;
}
&nb ↔™©sp; $this->_cellXfC♦"™ollection = array_values($th←↓is->_cellXfCollection);
 ÷∏; // updat the index for all ce βllXfs
forea<♠¶ch ($this->_cellXfColl↑₩φection as $i => $cellXf) {
$cellXf->setIndex >♦'($i);
}
// ↓₹make sure there is always at lea§×st one cellXf (there should ×$♣be)
if (empty($λ↓this->_cellXfCollectδΩ Ωion)) {
&nbφ•γ≈sp; $this->_cellXfColl₹₹✘ection[] = new PHPExcel_Style();♦
}
 ε♥₩; // updat the xfIndex for all cell< s, row dimensions, column di"✘βmensions
foreach±≤ ($this->getWorksheetI↔>terator() as $sheet) {
&nb'₩≥↓sp; // for all cells
&≈↔nbsp; fπ★oreach ($sheet->getCellCollec≥'tion(false) as $cellID) {
&n↓Ωφbsp; &↕₽ nbsp; $cell = $sheet->getCell(σ$cellID);
&n↔ε≤bsp; $cell- ₹α>setXfIndex( $map←↕®[$cell->getXfIndex(♦ '')] );
&nb©↕sp; }
&♠♥Ω±nbsp; // for all$♣∑✘ row dimensions
&>♠nbsp; foreach ®≥∑($sheet->getRowDim♥♠"•ensions() as $rowDimension) {
&nb∏₹sp; '↑γ if ($rowDimension->g↔<etXfIndex() !== null) {
&nδ×÷bsp; &nbs♣♠p; $≠✔ rowDimension->setXfIndex( $map[$ro÷↕↑wDimension->getXfIndex()] );
 " ; ¥≠≤ }
&nb×∑sp; }
&nbs≈♦$↓p; // for all c± ₽Ωolumn dimensions
&<$nbsp; foreach ($sheet-&≤ ≈gt;getColumnDimensions() as $columnDi÷₽<↓mension) {
≥$φ $columnDimeε&nsion->setXfIndex( $map[$colum∞εδ✔nDimension->getXfIndex()] ₩↔✘&);
 ↔₹ ↓; }
// also do garbage colle< ction for all the sheets
± $sheet->garbageCollect≈$ →();
}♥₹γ&
}
public funcδ↑÷δtion getID() {
retu₽✔rn $this->_uniqueID;
}
}