Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Игорь
vtorpoisk
Commits
9f4f2745
Commit
9f4f2745
authored
Mar 01, 2021
by
Игорь
Browse files
init
parent
a765cdc4
Changes
230
Show whitespace changes
Inline
Side-by-side
Too many changes to show.
To preserve performance only
230 of 230+
files are displayed.
Plain diff
Email patch
lib/Classes/PHPExcel/Reader/Excel5.php
0 → 100644
View file @
9f4f2745
This source diff could not be displayed because it is too large. You can
view the blob
instead.
lib/Classes/PHPExcel/Reader/Excel5/Escher.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Reader_Excel5
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_Reader_Excel5_Escher
*
* @category PHPExcel
* @package PHPExcel_Reader_Excel5
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Reader_Excel5_Escher
{
const
DGGCONTAINER
=
0xF000
;
const
BSTORECONTAINER
=
0xF001
;
const
DGCONTAINER
=
0xF002
;
const
SPGRCONTAINER
=
0xF003
;
const
SPCONTAINER
=
0xF004
;
const
DGG
=
0xF006
;
const
BSE
=
0xF007
;
const
DG
=
0xF008
;
const
SPGR
=
0xF009
;
const
SP
=
0xF00A
;
const
OPT
=
0xF00B
;
const
CLIENTTEXTBOX
=
0xF00D
;
const
CLIENTANCHOR
=
0xF010
;
const
CLIENTDATA
=
0xF011
;
const
BLIPJPEG
=
0xF01D
;
const
BLIPPNG
=
0xF01E
;
const
SPLITMENUCOLORS
=
0xF11E
;
const
TERTIARYOPT
=
0xF122
;
/**
* Escher stream data (binary)
*
* @var string
*/
private
$_data
;
/**
* Size in bytes of the Escher stream data
*
* @var int
*/
private
$_dataSize
;
/**
* Current position of stream pointer in Escher stream data
*
* @var int
*/
private
$_pos
;
/**
* The object to be returned by the reader. Modified during load.
*
* @var mixed
*/
private
$_object
;
/**
* Create a new PHPExcel_Reader_Excel5_Escher instance
*
* @param mixed $object
*/
public
function
__construct
(
$object
)
{
$this
->
_object
=
$object
;
}
/**
* Load Escher stream data. May be a partial Escher stream.
*
* @param string $data
*/
public
function
load
(
$data
)
{
$this
->
_data
=
$data
;
// total byte size of Excel data (workbook global substream + sheet substreams)
$this
->
_dataSize
=
strlen
(
$this
->
_data
);
$this
->
_pos
=
0
;
// Parse Escher stream
while
(
$this
->
_pos
<
$this
->
_dataSize
)
{
// offset: 2; size: 2: Record Type
$fbt
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$this
->
_data
,
$this
->
_pos
+
2
);
switch
(
$fbt
)
{
case
self
::
DGGCONTAINER
:
$this
->
_readDggContainer
();
break
;
case
self
::
DGG
:
$this
->
_readDgg
();
break
;
case
self
::
BSTORECONTAINER
:
$this
->
_readBstoreContainer
();
break
;
case
self
::
BSE
:
$this
->
_readBSE
();
break
;
case
self
::
BLIPJPEG
:
$this
->
_readBlipJPEG
();
break
;
case
self
::
BLIPPNG
:
$this
->
_readBlipPNG
();
break
;
case
self
::
OPT
:
$this
->
_readOPT
();
break
;
case
self
::
TERTIARYOPT
:
$this
->
_readTertiaryOPT
();
break
;
case
self
::
SPLITMENUCOLORS
:
$this
->
_readSplitMenuColors
();
break
;
case
self
::
DGCONTAINER
:
$this
->
_readDgContainer
();
break
;
case
self
::
DG
:
$this
->
_readDg
();
break
;
case
self
::
SPGRCONTAINER
:
$this
->
_readSpgrContainer
();
break
;
case
self
::
SPCONTAINER
:
$this
->
_readSpContainer
();
break
;
case
self
::
SPGR
:
$this
->
_readSpgr
();
break
;
case
self
::
SP
:
$this
->
_readSp
();
break
;
case
self
::
CLIENTTEXTBOX
:
$this
->
_readClientTextbox
();
break
;
case
self
::
CLIENTANCHOR
:
$this
->
_readClientAnchor
();
break
;
case
self
::
CLIENTDATA
:
$this
->
_readClientData
();
break
;
default
:
$this
->
_readDefault
();
break
;
}
}
return
$this
->
_object
;
}
/**
* Read a generic record
*/
private
function
_readDefault
()
{
// offset 0; size: 2; recVer and recInstance
$verInstance
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$this
->
_data
,
$this
->
_pos
);
// offset: 2; size: 2: Record Type
$fbt
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$this
->
_data
,
$this
->
_pos
+
2
);
// bit: 0-3; mask: 0x000F; recVer
$recVer
=
(
0x000F
&
$verInstance
)
>>
0
;
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
}
/**
* Read DggContainer record (Drawing Group Container)
*/
private
function
_readDggContainer
()
{
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
// record is a container, read contents
$dggContainer
=
new
PHPExcel_Shared_Escher_DggContainer
();
$this
->
_object
->
setDggContainer
(
$dggContainer
);
$reader
=
new
PHPExcel_Reader_Excel5_Escher
(
$dggContainer
);
$reader
->
load
(
$recordData
);
}
/**
* Read Dgg record (Drawing Group)
*/
private
function
_readDgg
()
{
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
}
/**
* Read BstoreContainer record (Blip Store Container)
*/
private
function
_readBstoreContainer
()
{
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
// record is a container, read contents
$bstoreContainer
=
new
PHPExcel_Shared_Escher_DggContainer_BstoreContainer
();
$this
->
_object
->
setBstoreContainer
(
$bstoreContainer
);
$reader
=
new
PHPExcel_Reader_Excel5_Escher
(
$bstoreContainer
);
$reader
->
load
(
$recordData
);
}
/**
* Read BSE record
*/
private
function
_readBSE
()
{
// offset: 0; size: 2; recVer and recInstance
// bit: 4-15; mask: 0xFFF0; recInstance
$recInstance
=
(
0xFFF0
&
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$this
->
_data
,
$this
->
_pos
))
>>
4
;
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
// add BSE to BstoreContainer
$BSE
=
new
PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE
();
$this
->
_object
->
addBSE
(
$BSE
);
$BSE
->
setBLIPType
(
$recInstance
);
// offset: 0; size: 1; btWin32 (MSOBLIPTYPE)
$btWin32
=
ord
(
$recordData
[
0
]);
// offset: 1; size: 1; btWin32 (MSOBLIPTYPE)
$btMacOS
=
ord
(
$recordData
[
1
]);
// offset: 2; size: 16; MD4 digest
$rgbUid
=
substr
(
$recordData
,
2
,
16
);
// offset: 18; size: 2; tag
$tag
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$recordData
,
18
);
// offset: 20; size: 4; size of BLIP in bytes
$size
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$recordData
,
20
);
// offset: 24; size: 4; number of references to this BLIP
$cRef
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$recordData
,
24
);
// offset: 28; size: 4; MSOFO file offset
$foDelay
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$recordData
,
28
);
// offset: 32; size: 1; unused1
$unused1
=
ord
(
$recordData
{
32
});
// offset: 33; size: 1; size of nameData in bytes (including null terminator)
$cbName
=
ord
(
$recordData
{
33
});
// offset: 34; size: 1; unused2
$unused2
=
ord
(
$recordData
{
34
});
// offset: 35; size: 1; unused3
$unused3
=
ord
(
$recordData
{
35
});
// offset: 36; size: $cbName; nameData
$nameData
=
substr
(
$recordData
,
36
,
$cbName
);
// offset: 36 + $cbName, size: var; the BLIP data
$blipData
=
substr
(
$recordData
,
36
+
$cbName
);
// record is a container, read contents
$reader
=
new
PHPExcel_Reader_Excel5_Escher
(
$BSE
);
$reader
->
load
(
$blipData
);
}
/**
* Read BlipJPEG record. Holds raw JPEG image data
*/
private
function
_readBlipJPEG
()
{
// offset: 0; size: 2; recVer and recInstance
// bit: 4-15; mask: 0xFFF0; recInstance
$recInstance
=
(
0xFFF0
&
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$this
->
_data
,
$this
->
_pos
))
>>
4
;
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
$pos
=
0
;
// offset: 0; size: 16; rgbUid1 (MD4 digest of)
$rgbUid1
=
substr
(
$recordData
,
0
,
16
);
$pos
+=
16
;
// offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3
if
(
in_array
(
$recInstance
,
array
(
0x046B
,
0x06E3
)))
{
$rgbUid2
=
substr
(
$recordData
,
16
,
16
);
$pos
+=
16
;
}
// offset: var; size: 1; tag
$tag
=
ord
(
$recordData
{
$pos
});
$pos
+=
1
;
// offset: var; size: var; the raw image data
$data
=
substr
(
$recordData
,
$pos
);
$blip
=
new
PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip
();
$blip
->
setData
(
$data
);
$this
->
_object
->
setBlip
(
$blip
);
}
/**
* Read BlipPNG record. Holds raw PNG image data
*/
private
function
_readBlipPNG
()
{
// offset: 0; size: 2; recVer and recInstance
// bit: 4-15; mask: 0xFFF0; recInstance
$recInstance
=
(
0xFFF0
&
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$this
->
_data
,
$this
->
_pos
))
>>
4
;
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
$pos
=
0
;
// offset: 0; size: 16; rgbUid1 (MD4 digest of)
$rgbUid1
=
substr
(
$recordData
,
0
,
16
);
$pos
+=
16
;
// offset: 16; size: 16; rgbUid2 (MD4 digest), only if $recInstance = 0x46B or 0x6E3
if
(
$recInstance
==
0x06E1
)
{
$rgbUid2
=
substr
(
$recordData
,
16
,
16
);
$pos
+=
16
;
}
// offset: var; size: 1; tag
$tag
=
ord
(
$recordData
{
$pos
});
$pos
+=
1
;
// offset: var; size: var; the raw image data
$data
=
substr
(
$recordData
,
$pos
);
$blip
=
new
PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip
();
$blip
->
setData
(
$data
);
$this
->
_object
->
setBlip
(
$blip
);
}
/**
* Read OPT record. This record may occur within DggContainer record or SpContainer
*/
private
function
_readOPT
()
{
// offset: 0; size: 2; recVer and recInstance
// bit: 4-15; mask: 0xFFF0; recInstance
$recInstance
=
(
0xFFF0
&
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$this
->
_data
,
$this
->
_pos
))
>>
4
;
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
$this
->
_readOfficeArtRGFOPTE
(
$recordData
,
$recInstance
);
}
/**
* Read TertiaryOPT record
*/
private
function
_readTertiaryOPT
()
{
// offset: 0; size: 2; recVer and recInstance
// bit: 4-15; mask: 0xFFF0; recInstance
$recInstance
=
(
0xFFF0
&
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$this
->
_data
,
$this
->
_pos
))
>>
4
;
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
}
/**
* Read SplitMenuColors record
*/
private
function
_readSplitMenuColors
()
{
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
}
/**
* Read DgContainer record (Drawing Container)
*/
private
function
_readDgContainer
()
{
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
// record is a container, read contents
$dgContainer
=
new
PHPExcel_Shared_Escher_DgContainer
();
$this
->
_object
->
setDgContainer
(
$dgContainer
);
$reader
=
new
PHPExcel_Reader_Excel5_Escher
(
$dgContainer
);
$escher
=
$reader
->
load
(
$recordData
);
}
/**
* Read Dg record (Drawing)
*/
private
function
_readDg
()
{
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
}
/**
* Read SpgrContainer record (Shape Group Container)
*/
private
function
_readSpgrContainer
()
{
// context is either context DgContainer or SpgrContainer
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
// record is a container, read contents
$spgrContainer
=
new
PHPExcel_Shared_Escher_DgContainer_SpgrContainer
();
if
(
$this
->
_object
instanceof
PHPExcel_Shared_Escher_DgContainer
)
{
// DgContainer
$this
->
_object
->
setSpgrContainer
(
$spgrContainer
);
}
else
{
// SpgrContainer
$this
->
_object
->
addChild
(
$spgrContainer
);
}
$reader
=
new
PHPExcel_Reader_Excel5_Escher
(
$spgrContainer
);
$escher
=
$reader
->
load
(
$recordData
);
}
/**
* Read SpContainer record (Shape Container)
*/
private
function
_readSpContainer
()
{
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// add spContainer to spgrContainer
$spContainer
=
new
PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer
();
$this
->
_object
->
addChild
(
$spContainer
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
// record is a container, read contents
$reader
=
new
PHPExcel_Reader_Excel5_Escher
(
$spContainer
);
$escher
=
$reader
->
load
(
$recordData
);
}
/**
* Read Spgr record (Shape Group)
*/
private
function
_readSpgr
()
{
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
}
/**
* Read Sp record (Shape)
*/
private
function
_readSp
()
{
// offset: 0; size: 2; recVer and recInstance
// bit: 4-15; mask: 0xFFF0; recInstance
$recInstance
=
(
0xFFF0
&
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$this
->
_data
,
$this
->
_pos
))
>>
4
;
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
}
/**
* Read ClientTextbox record
*/
private
function
_readClientTextbox
()
{
// offset: 0; size: 2; recVer and recInstance
// bit: 4-15; mask: 0xFFF0; recInstance
$recInstance
=
(
0xFFF0
&
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$this
->
_data
,
$this
->
_pos
))
>>
4
;
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
}
/**
* Read ClientAnchor record. This record holds information about where the shape is anchored in worksheet
*/
private
function
_readClientAnchor
()
{
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
// offset: 2; size: 2; upper-left corner column index (0-based)
$c1
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$recordData
,
2
);
// offset: 4; size: 2; upper-left corner horizontal offset in 1/1024 of column width
$startOffsetX
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$recordData
,
4
);
// offset: 6; size: 2; upper-left corner row index (0-based)
$r1
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$recordData
,
6
);
// offset: 8; size: 2; upper-left corner vertical offset in 1/256 of row height
$startOffsetY
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$recordData
,
8
);
// offset: 10; size: 2; bottom-right corner column index (0-based)
$c2
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$recordData
,
10
);
// offset: 12; size: 2; bottom-right corner horizontal offset in 1/1024 of column width
$endOffsetX
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$recordData
,
12
);
// offset: 14; size: 2; bottom-right corner row index (0-based)
$r2
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$recordData
,
14
);
// offset: 16; size: 2; bottom-right corner vertical offset in 1/256 of row height
$endOffsetY
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$recordData
,
16
);
// set the start coordinates
$this
->
_object
->
setStartCoordinates
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$c1
)
.
(
$r1
+
1
));
// set the start offsetX
$this
->
_object
->
setStartOffsetX
(
$startOffsetX
);
// set the start offsetY
$this
->
_object
->
setStartOffsetY
(
$startOffsetY
);
// set the end coordinates
$this
->
_object
->
setEndCoordinates
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$c2
)
.
(
$r2
+
1
));
// set the end offsetX
$this
->
_object
->
setEndOffsetX
(
$endOffsetX
);
// set the end offsetY
$this
->
_object
->
setEndOffsetY
(
$endOffsetY
);
}
/**
* Read ClientData record
*/
private
function
_readClientData
()
{
$length
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$this
->
_data
,
$this
->
_pos
+
4
);
$recordData
=
substr
(
$this
->
_data
,
$this
->
_pos
+
8
,
$length
);
// move stream pointer to next record
$this
->
_pos
+=
8
+
$length
;
}
/**
* Read OfficeArtRGFOPTE table of property-value pairs
*
* @param string $data Binary data
* @param int $n Number of properties
*/
private
function
_readOfficeArtRGFOPTE
(
$data
,
$n
)
{
$splicedComplexData
=
substr
(
$data
,
6
*
$n
);
// loop through property-value pairs
for
(
$i
=
0
;
$i
<
$n
;
++
$i
)
{
// read 6 bytes at a time
$fopte
=
substr
(
$data
,
6
*
$i
,
6
);
// offset: 0; size: 2; opid
$opid
=
PHPExcel_Reader_Excel5
::
_GetInt2d
(
$fopte
,
0
);
// bit: 0-13; mask: 0x3FFF; opid.opid
$opidOpid
=
(
0x3FFF
&
$opid
)
>>
0
;
// bit: 14; mask 0x4000; 1 = value in op field is BLIP identifier
$opidFBid
=
(
0x4000
&
$opid
)
>>
14
;
// bit: 15; mask 0x8000; 1 = this is a complex property, op field specifies size of complex data
$opidFComplex
=
(
0x8000
&
$opid
)
>>
15
;
// offset: 2; size: 4; the value for this property
$op
=
PHPExcel_Reader_Excel5
::
_GetInt4d
(
$fopte
,
2
);
if
(
$opidFComplex
)
{
$complexData
=
substr
(
$splicedComplexData
,
0
,
$op
);
$splicedComplexData
=
substr
(
$splicedComplexData
,
$op
);
// we store string value with complex data
$value
=
$complexData
;
}
else
{
// we store integer value
$value
=
$op
;
}
$this
->
_object
->
setOPT
(
$opidOpid
,
$value
);
}
}
}
lib/Classes/PHPExcel/Reader/Excel5/MD5.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Reader_Excel5
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_Reader_Excel5_MD5
*
* @category PHPExcel
* @package PHPExcel_Reader_Excel5
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Reader_Excel5_MD5
{
// Context
private
$a
;
private
$b
;
private
$c
;
private
$d
;
/**
* MD5 stream constructor
*/
public
function
__construct
()
{
$this
->
reset
();
}
/**
* Reset the MD5 stream context
*/
public
function
reset
()
{
$this
->
a
=
0x67452301
;
$this
->
b
=
0xEFCDAB89
;
$this
->
c
=
0x98BADCFE
;
$this
->
d
=
0x10325476
;
}
/**
* Get MD5 stream context
*
* @return string
*/
public
function
getContext
()
{
$s
=
''
;
foreach
(
array
(
'a'
,
'b'
,
'c'
,
'd'
)
as
$i
)
{
$v
=
$this
->
{
$i
};
$s
.
=
chr
(
$v
&
0xff
);
$s
.
=
chr
((
$v
>>
8
)
&
0xff
);
$s
.
=
chr
((
$v
>>
16
)
&
0xff
);
$s
.
=
chr
((
$v
>>
24
)
&
0xff
);
}
return
$s
;
}
/**
* Add data to context
*
* @param string $data Data to add
*/
public
function
add
(
$data
)
{
$words
=
array_values
(
unpack
(
'V16'
,
$data
));
$A
=
$this
->
a
;
$B
=
$this
->
b
;
$C
=
$this
->
c
;
$D
=
$this
->
d
;
$F
=
array
(
'PHPExcel_Reader_Excel5_MD5'
,
'F'
);
$G
=
array
(
'PHPExcel_Reader_Excel5_MD5'
,
'G'
);
$H
=
array
(
'PHPExcel_Reader_Excel5_MD5'
,
'H'
);
$I
=
array
(
'PHPExcel_Reader_Excel5_MD5'
,
'I'
);
/* ROUND 1 */
self
::
step
(
$F
,
$A
,
$B
,
$C
,
$D
,
$words
[
0
],
7
,
0xd76aa478
);
self
::
step
(
$F
,
$D
,
$A
,
$B
,
$C
,
$words
[
1
],
12
,
0xe8c7b756
);
self
::
step
(
$F
,
$C
,
$D
,
$A
,
$B
,
$words
[
2
],
17
,
0x242070db
);
self
::
step
(
$F
,
$B
,
$C
,
$D
,
$A
,
$words
[
3
],
22
,
0xc1bdceee
);
self
::
step
(
$F
,
$A
,
$B
,
$C
,
$D
,
$words
[
4
],
7
,
0xf57c0faf
);
self
::
step
(
$F
,
$D
,
$A
,
$B
,
$C
,
$words
[
5
],
12
,
0x4787c62a
);
self
::
step
(
$F
,
$C
,
$D
,
$A
,
$B
,
$words
[
6
],
17
,
0xa8304613
);
self
::
step
(
$F
,
$B
,
$C
,
$D
,
$A
,
$words
[
7
],
22
,
0xfd469501
);
self
::
step
(
$F
,
$A
,
$B
,
$C
,
$D
,
$words
[
8
],
7
,
0x698098d8
);
self
::
step
(
$F
,
$D
,
$A
,
$B
,
$C
,
$words
[
9
],
12
,
0x8b44f7af
);
self
::
step
(
$F
,
$C
,
$D
,
$A
,
$B
,
$words
[
10
],
17
,
0xffff5bb1
);
self
::
step
(
$F
,
$B
,
$C
,
$D
,
$A
,
$words
[
11
],
22
,
0x895cd7be
);
self
::
step
(
$F
,
$A
,
$B
,
$C
,
$D
,
$words
[
12
],
7
,
0x6b901122
);
self
::
step
(
$F
,
$D
,
$A
,
$B
,
$C
,
$words
[
13
],
12
,
0xfd987193
);
self
::
step
(
$F
,
$C
,
$D
,
$A
,
$B
,
$words
[
14
],
17
,
0xa679438e
);
self
::
step
(
$F
,
$B
,
$C
,
$D
,
$A
,
$words
[
15
],
22
,
0x49b40821
);
/* ROUND 2 */
self
::
step
(
$G
,
$A
,
$B
,
$C
,
$D
,
$words
[
1
],
5
,
0xf61e2562
);
self
::
step
(
$G
,
$D
,
$A
,
$B
,
$C
,
$words
[
6
],
9
,
0xc040b340
);
self
::
step
(
$G
,
$C
,
$D
,
$A
,
$B
,
$words
[
11
],
14
,
0x265e5a51
);
self
::
step
(
$G
,
$B
,
$C
,
$D
,
$A
,
$words
[
0
],
20
,
0xe9b6c7aa
);
self
::
step
(
$G
,
$A
,
$B
,
$C
,
$D
,
$words
[
5
],
5
,
0xd62f105d
);
self
::
step
(
$G
,
$D
,
$A
,
$B
,
$C
,
$words
[
10
],
9
,
0x02441453
);
self
::
step
(
$G
,
$C
,
$D
,
$A
,
$B
,
$words
[
15
],
14
,
0xd8a1e681
);
self
::
step
(
$G
,
$B
,
$C
,
$D
,
$A
,
$words
[
4
],
20
,
0xe7d3fbc8
);
self
::
step
(
$G
,
$A
,
$B
,
$C
,
$D
,
$words
[
9
],
5
,
0x21e1cde6
);
self
::
step
(
$G
,
$D
,
$A
,
$B
,
$C
,
$words
[
14
],
9
,
0xc33707d6
);
self
::
step
(
$G
,
$C
,
$D
,
$A
,
$B
,
$words
[
3
],
14
,
0xf4d50d87
);
self
::
step
(
$G
,
$B
,
$C
,
$D
,
$A
,
$words
[
8
],
20
,
0x455a14ed
);
self
::
step
(
$G
,
$A
,
$B
,
$C
,
$D
,
$words
[
13
],
5
,
0xa9e3e905
);
self
::
step
(
$G
,
$D
,
$A
,
$B
,
$C
,
$words
[
2
],
9
,
0xfcefa3f8
);
self
::
step
(
$G
,
$C
,
$D
,
$A
,
$B
,
$words
[
7
],
14
,
0x676f02d9
);
self
::
step
(
$G
,
$B
,
$C
,
$D
,
$A
,
$words
[
12
],
20
,
0x8d2a4c8a
);
/* ROUND 3 */
self
::
step
(
$H
,
$A
,
$B
,
$C
,
$D
,
$words
[
5
],
4
,
0xfffa3942
);
self
::
step
(
$H
,
$D
,
$A
,
$B
,
$C
,
$words
[
8
],
11
,
0x8771f681
);
self
::
step
(
$H
,
$C
,
$D
,
$A
,
$B
,
$words
[
11
],
16
,
0x6d9d6122
);
self
::
step
(
$H
,
$B
,
$C
,
$D
,
$A
,
$words
[
14
],
23
,
0xfde5380c
);
self
::
step
(
$H
,
$A
,
$B
,
$C
,
$D
,
$words
[
1
],
4
,
0xa4beea44
);
self
::
step
(
$H
,
$D
,
$A
,
$B
,
$C
,
$words
[
4
],
11
,
0x4bdecfa9
);
self
::
step
(
$H
,
$C
,
$D
,
$A
,
$B
,
$words
[
7
],
16
,
0xf6bb4b60
);
self
::
step
(
$H
,
$B
,
$C
,
$D
,
$A
,
$words
[
10
],
23
,
0xbebfbc70
);
self
::
step
(
$H
,
$A
,
$B
,
$C
,
$D
,
$words
[
13
],
4
,
0x289b7ec6
);
self
::
step
(
$H
,
$D
,
$A
,
$B
,
$C
,
$words
[
0
],
11
,
0xeaa127fa
);
self
::
step
(
$H
,
$C
,
$D
,
$A
,
$B
,
$words
[
3
],
16
,
0xd4ef3085
);
self
::
step
(
$H
,
$B
,
$C
,
$D
,
$A
,
$words
[
6
],
23
,
0x04881d05
);
self
::
step
(
$H
,
$A
,
$B
,
$C
,
$D
,
$words
[
9
],
4
,
0xd9d4d039
);
self
::
step
(
$H
,
$D
,
$A
,
$B
,
$C
,
$words
[
12
],
11
,
0xe6db99e5
);
self
::
step
(
$H
,
$C
,
$D
,
$A
,
$B
,
$words
[
15
],
16
,
0x1fa27cf8
);
self
::
step
(
$H
,
$B
,
$C
,
$D
,
$A
,
$words
[
2
],
23
,
0xc4ac5665
);
/* ROUND 4 */
self
::
step
(
$I
,
$A
,
$B
,
$C
,
$D
,
$words
[
0
],
6
,
0xf4292244
);
self
::
step
(
$I
,
$D
,
$A
,
$B
,
$C
,
$words
[
7
],
10
,
0x432aff97
);
self
::
step
(
$I
,
$C
,
$D
,
$A
,
$B
,
$words
[
14
],
15
,
0xab9423a7
);
self
::
step
(
$I
,
$B
,
$C
,
$D
,
$A
,
$words
[
5
],
21
,
0xfc93a039
);
self
::
step
(
$I
,
$A
,
$B
,
$C
,
$D
,
$words
[
12
],
6
,
0x655b59c3
);
self
::
step
(
$I
,
$D
,
$A
,
$B
,
$C
,
$words
[
3
],
10
,
0x8f0ccc92
);
self
::
step
(
$I
,
$C
,
$D
,
$A
,
$B
,
$words
[
10
],
15
,
0xffeff47d
);
self
::
step
(
$I
,
$B
,
$C
,
$D
,
$A
,
$words
[
1
],
21
,
0x85845dd1
);
self
::
step
(
$I
,
$A
,
$B
,
$C
,
$D
,
$words
[
8
],
6
,
0x6fa87e4f
);
self
::
step
(
$I
,
$D
,
$A
,
$B
,
$C
,
$words
[
15
],
10
,
0xfe2ce6e0
);
self
::
step
(
$I
,
$C
,
$D
,
$A
,
$B
,
$words
[
6
],
15
,
0xa3014314
);
self
::
step
(
$I
,
$B
,
$C
,
$D
,
$A
,
$words
[
13
],
21
,
0x4e0811a1
);
self
::
step
(
$I
,
$A
,
$B
,
$C
,
$D
,
$words
[
4
],
6
,
0xf7537e82
);
self
::
step
(
$I
,
$D
,
$A
,
$B
,
$C
,
$words
[
11
],
10
,
0xbd3af235
);
self
::
step
(
$I
,
$C
,
$D
,
$A
,
$B
,
$words
[
2
],
15
,
0x2ad7d2bb
);
self
::
step
(
$I
,
$B
,
$C
,
$D
,
$A
,
$words
[
9
],
21
,
0xeb86d391
);
$this
->
a
=
(
$this
->
a
+
$A
)
&
0xffffffff
;
$this
->
b
=
(
$this
->
b
+
$B
)
&
0xffffffff
;
$this
->
c
=
(
$this
->
c
+
$C
)
&
0xffffffff
;
$this
->
d
=
(
$this
->
d
+
$D
)
&
0xffffffff
;
}
private
static
function
F
(
$X
,
$Y
,
$Z
)
{
return
((
$X
&
$Y
)
|
((
~
$X
)
&
$Z
));
// X AND Y OR NOT X AND Z
}
private
static
function
G
(
$X
,
$Y
,
$Z
)
{
return
((
$X
&
$Z
)
|
(
$Y
&
(
~
$Z
)));
// X AND Z OR Y AND NOT Z
}
private
static
function
H
(
$X
,
$Y
,
$Z
)
{
return
(
$X
^
$Y
^
$Z
);
// X XOR Y XOR Z
}
private
static
function
I
(
$X
,
$Y
,
$Z
)
{
return
(
$Y
^
(
$X
|
(
~
$Z
)))
;
// Y XOR (X OR NOT Z)
}
private
static
function
step
(
$func
,
&
$A
,
$B
,
$C
,
$D
,
$M
,
$s
,
$t
)
{
$A
=
(
$A
+
call_user_func
(
$func
,
$B
,
$C
,
$D
)
+
$M
+
$t
)
&
0xffffffff
;
$A
=
self
::
rotate
(
$A
,
$s
);
$A
=
(
$B
+
$A
)
&
0xffffffff
;
}
private
static
function
rotate
(
$decimal
,
$bits
)
{
$binary
=
str_pad
(
decbin
(
$decimal
),
32
,
"0"
,
STR_PAD_LEFT
);
return
bindec
(
substr
(
$binary
,
$bits
)
.
substr
(
$binary
,
0
,
$bits
));
}
}
\ No newline at end of file
lib/Classes/PHPExcel/Reader/Excel5/RC4.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Reader_Excel5
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_Reader_Excel5_RC4
*
* @category PHPExcel
* @package PHPExcel_Reader_Excel5
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Reader_Excel5_RC4
{
// Context
var
$s
=
array
();
var
$i
=
0
;
var
$j
=
0
;
/**
* RC4 stream decryption/encryption constrcutor
*
* @param string $key Encryption key/passphrase
*/
public
function
__construct
(
$key
)
{
$len
=
strlen
(
$key
);
for
(
$this
->
i
=
0
;
$this
->
i
<
256
;
$this
->
i
++
)
{
$this
->
s
[
$this
->
i
]
=
$this
->
i
;
}
$this
->
j
=
0
;
for
(
$this
->
i
=
0
;
$this
->
i
<
256
;
$this
->
i
++
)
{
$this
->
j
=
(
$this
->
j
+
$this
->
s
[
$this
->
i
]
+
ord
(
$key
[
$this
->
i
%
$len
]))
%
256
;
$t
=
$this
->
s
[
$this
->
i
];
$this
->
s
[
$this
->
i
]
=
$this
->
s
[
$this
->
j
];
$this
->
s
[
$this
->
j
]
=
$t
;
}
$this
->
i
=
$this
->
j
=
0
;
}
/**
* Symmetric decryption/encryption function
*
* @param string $data Data to encrypt/decrypt
*
* @return string
*/
public
function
RC4
(
$data
)
{
$len
=
strlen
(
$data
);
for
(
$c
=
0
;
$c
<
$len
;
$c
++
)
{
$this
->
i
=
(
$this
->
i
+
1
)
%
256
;
$this
->
j
=
(
$this
->
j
+
$this
->
s
[
$this
->
i
])
%
256
;
$t
=
$this
->
s
[
$this
->
i
];
$this
->
s
[
$this
->
i
]
=
$this
->
s
[
$this
->
j
];
$this
->
s
[
$this
->
j
]
=
$t
;
$t
=
(
$this
->
s
[
$this
->
i
]
+
$this
->
s
[
$this
->
j
])
%
256
;
$data
[
$c
]
=
chr
(
ord
(
$data
[
$c
])
^
$this
->
s
[
$t
]);
}
return
$data
;
}
}
lib/Classes/PHPExcel/Reader/Exception.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_Reader_Exception
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Reader_Exception
extends
PHPExcel_Exception
{
/**
* Error handler callback
*
* @param mixed $code
* @param mixed $string
* @param mixed $file
* @param mixed $line
* @param mixed $context
*/
public
static
function
errorHandlerCallback
(
$code
,
$string
,
$file
,
$line
,
$context
)
{
$e
=
new
self
(
$string
,
$code
);
$e
->
line
=
$line
;
$e
->
file
=
$file
;
throw
$e
;
}
}
lib/Classes/PHPExcel/Reader/Gnumeric.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/** PHPExcel root directory */
if
(
!
defined
(
'PHPEXCEL_ROOT'
))
{
/**
* @ignore
*/
define
(
'PHPEXCEL_ROOT'
,
dirname
(
__FILE__
)
.
'/../../'
);
require
(
PHPEXCEL_ROOT
.
'PHPExcel/Autoloader.php'
);
}
/**
* PHPExcel_Reader_Gnumeric
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Reader_Gnumeric
extends
PHPExcel_Reader_Abstract
implements
PHPExcel_Reader_IReader
{
/**
* Formats
*
* @var array
*/
private
$_styles
=
array
();
/**
* Shared Expressions
*
* @var array
*/
private
$_expressions
=
array
();
private
$_referenceHelper
=
null
;
/**
* Create a new PHPExcel_Reader_Gnumeric
*/
public
function
__construct
()
{
$this
->
_readFilter
=
new
PHPExcel_Reader_DefaultReadFilter
();
$this
->
_referenceHelper
=
PHPExcel_ReferenceHelper
::
getInstance
();
}
/**
* Can the current PHPExcel_Reader_IReader read the file?
*
* @param string $pFilename
* @return boolean
* @throws PHPExcel_Reader_Exception
*/
public
function
canRead
(
$pFilename
)
{
// Check if file exists
if
(
!
file_exists
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! File does not exist."
);
}
// Check if gzlib functions are available
if
(
!
function_exists
(
'gzread'
))
{
throw
new
PHPExcel_Reader_Exception
(
"gzlib library is not enabled"
);
}
// Read signature data (first 3 bytes)
$fh
=
fopen
(
$pFilename
,
'r'
);
$data
=
fread
(
$fh
,
2
);
fclose
(
$fh
);
if
(
$data
!=
chr
(
0x1F
)
.
chr
(
0x8B
))
{
return
false
;
}
return
true
;
}
/**
* Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object
*
* @param string $pFilename
* @throws PHPExcel_Reader_Exception
*/
public
function
listWorksheetNames
(
$pFilename
)
{
// Check if file exists
if
(
!
file_exists
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! File does not exist."
);
}
$xml
=
new
XMLReader
();
$xml
->
open
(
'compress.zlib://'
.
realpath
(
$pFilename
),
null
,
PHPExcel_Settings
::
getLibXmlLoaderOptions
()
);
$xml
->
setParserProperty
(
2
,
true
);
$worksheetNames
=
array
();
while
(
$xml
->
read
())
{
if
(
$xml
->
name
==
'gnm:SheetName'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
)
{
$xml
->
read
();
// Move onto the value node
$worksheetNames
[]
=
(
string
)
$xml
->
value
;
}
elseif
(
$xml
->
name
==
'gnm:Sheets'
)
{
// break out of the loop once we've got our sheet names rather than parse the entire file
break
;
}
}
return
$worksheetNames
;
}
/**
* Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)
*
* @param string $pFilename
* @throws PHPExcel_Reader_Exception
*/
public
function
listWorksheetInfo
(
$pFilename
)
{
// Check if file exists
if
(
!
file_exists
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! File does not exist."
);
}
$xml
=
new
XMLReader
();
$xml
->
open
(
'compress.zlib://'
.
realpath
(
$pFilename
),
null
,
PHPExcel_Settings
::
getLibXmlLoaderOptions
()
);
$xml
->
setParserProperty
(
2
,
true
);
$worksheetInfo
=
array
();
while
(
$xml
->
read
())
{
if
(
$xml
->
name
==
'gnm:Sheet'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
)
{
$tmpInfo
=
array
(
'worksheetName'
=>
''
,
'lastColumnLetter'
=>
'A'
,
'lastColumnIndex'
=>
0
,
'totalRows'
=>
0
,
'totalColumns'
=>
0
,
);
while
(
$xml
->
read
())
{
if
(
$xml
->
name
==
'gnm:Name'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
)
{
$xml
->
read
();
// Move onto the value node
$tmpInfo
[
'worksheetName'
]
=
(
string
)
$xml
->
value
;
}
elseif
(
$xml
->
name
==
'gnm:MaxCol'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
)
{
$xml
->
read
();
// Move onto the value node
$tmpInfo
[
'lastColumnIndex'
]
=
(
int
)
$xml
->
value
;
$tmpInfo
[
'totalColumns'
]
=
(
int
)
$xml
->
value
+
1
;
}
elseif
(
$xml
->
name
==
'gnm:MaxRow'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
)
{
$xml
->
read
();
// Move onto the value node
$tmpInfo
[
'totalRows'
]
=
(
int
)
$xml
->
value
+
1
;
break
;
}
}
$tmpInfo
[
'lastColumnLetter'
]
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$tmpInfo
[
'lastColumnIndex'
]);
$worksheetInfo
[]
=
$tmpInfo
;
}
}
return
$worksheetInfo
;
}
private
function
_gzfileGetContents
(
$filename
)
{
$file
=
@
gzopen
(
$filename
,
'rb'
);
if
(
$file
!==
false
)
{
$data
=
''
;
while
(
!
gzeof
(
$file
))
{
$data
.
=
gzread
(
$file
,
1024
);
}
gzclose
(
$file
);
}
return
$data
;
}
/**
* Loads PHPExcel from file
*
* @param string $pFilename
* @return PHPExcel
* @throws PHPExcel_Reader_Exception
*/
public
function
load
(
$pFilename
)
{
// Create new PHPExcel
$objPHPExcel
=
new
PHPExcel
();
// Load into this instance
return
$this
->
loadIntoExisting
(
$pFilename
,
$objPHPExcel
);
}
/**
* Loads PHPExcel from file into PHPExcel instance
*
* @param string $pFilename
* @param PHPExcel $objPHPExcel
* @return PHPExcel
* @throws PHPExcel_Reader_Exception
*/
public
function
loadIntoExisting
(
$pFilename
,
PHPExcel
$objPHPExcel
)
{
// Check if file exists
if
(
!
file_exists
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! File does not exist."
);
}
$timezoneObj
=
new
DateTimeZone
(
'Europe/London'
);
$GMT
=
new
DateTimeZone
(
'UTC'
);
$gFileData
=
$this
->
_gzfileGetContents
(
$pFilename
);
// echo '<pre>';
// echo htmlentities($gFileData,ENT_QUOTES,'UTF-8');
// echo '</pre><hr />';
//
$xml
=
simplexml_load_string
(
$gFileData
,
'SimpleXMLElement'
,
PHPExcel_Settings
::
getLibXmlLoaderOptions
());
$namespacesMeta
=
$xml
->
getNamespaces
(
true
);
// var_dump($namespacesMeta);
//
$gnmXML
=
$xml
->
children
(
$namespacesMeta
[
'gnm'
]);
$docProps
=
$objPHPExcel
->
getProperties
();
// Document Properties are held differently, depending on the version of Gnumeric
if
(
isset
(
$namespacesMeta
[
'office'
]))
{
$officeXML
=
$xml
->
children
(
$namespacesMeta
[
'office'
]);
$officeDocXML
=
$officeXML
->
{
'document-meta'
};
$officeDocMetaXML
=
$officeDocXML
->
meta
;
foreach
(
$officeDocMetaXML
as
$officePropertyData
)
{
$officePropertyDC
=
array
();
if
(
isset
(
$namespacesMeta
[
'dc'
]))
{
$officePropertyDC
=
$officePropertyData
->
children
(
$namespacesMeta
[
'dc'
]);
}
foreach
(
$officePropertyDC
as
$propertyName
=>
$propertyValue
)
{
$propertyValue
=
(
string
)
$propertyValue
;
switch
(
$propertyName
)
{
case
'title'
:
$docProps
->
setTitle
(
trim
(
$propertyValue
));
break
;
case
'subject'
:
$docProps
->
setSubject
(
trim
(
$propertyValue
));
break
;
case
'creator'
:
$docProps
->
setCreator
(
trim
(
$propertyValue
));
$docProps
->
setLastModifiedBy
(
trim
(
$propertyValue
));
break
;
case
'date'
:
$creationDate
=
strtotime
(
trim
(
$propertyValue
));
$docProps
->
setCreated
(
$creationDate
);
$docProps
->
setModified
(
$creationDate
);
break
;
case
'description'
:
$docProps
->
setDescription
(
trim
(
$propertyValue
));
break
;
}
}
$officePropertyMeta
=
array
();
if
(
isset
(
$namespacesMeta
[
'meta'
]))
{
$officePropertyMeta
=
$officePropertyData
->
children
(
$namespacesMeta
[
'meta'
]);
}
foreach
(
$officePropertyMeta
as
$propertyName
=>
$propertyValue
)
{
$attributes
=
$propertyValue
->
attributes
(
$namespacesMeta
[
'meta'
]);
$propertyValue
=
(
string
)
$propertyValue
;
switch
(
$propertyName
)
{
case
'keyword'
:
$docProps
->
setKeywords
(
trim
(
$propertyValue
));
break
;
case
'initial-creator'
:
$docProps
->
setCreator
(
trim
(
$propertyValue
));
$docProps
->
setLastModifiedBy
(
trim
(
$propertyValue
));
break
;
case
'creation-date'
:
$creationDate
=
strtotime
(
trim
(
$propertyValue
));
$docProps
->
setCreated
(
$creationDate
);
$docProps
->
setModified
(
$creationDate
);
break
;
case
'user-defined'
:
list
(,
$attrName
)
=
explode
(
':'
,
$attributes
[
'name'
]);
switch
(
$attrName
)
{
case
'publisher'
:
$docProps
->
setCompany
(
trim
(
$propertyValue
));
break
;
case
'category'
:
$docProps
->
setCategory
(
trim
(
$propertyValue
));
break
;
case
'manager'
:
$docProps
->
setManager
(
trim
(
$propertyValue
));
break
;
}
break
;
}
}
}
}
elseif
(
isset
(
$gnmXML
->
Summary
))
{
foreach
(
$gnmXML
->
Summary
->
Item
as
$summaryItem
)
{
$propertyName
=
$summaryItem
->
name
;
$propertyValue
=
$summaryItem
->
{
'val-string'
};
switch
(
$propertyName
)
{
case
'title'
:
$docProps
->
setTitle
(
trim
(
$propertyValue
));
break
;
case
'comments'
:
$docProps
->
setDescription
(
trim
(
$propertyValue
));
break
;
case
'keywords'
:
$docProps
->
setKeywords
(
trim
(
$propertyValue
));
break
;
case
'category'
:
$docProps
->
setCategory
(
trim
(
$propertyValue
));
break
;
case
'manager'
:
$docProps
->
setManager
(
trim
(
$propertyValue
));
break
;
case
'author'
:
$docProps
->
setCreator
(
trim
(
$propertyValue
));
$docProps
->
setLastModifiedBy
(
trim
(
$propertyValue
));
break
;
case
'company'
:
$docProps
->
setCompany
(
trim
(
$propertyValue
));
break
;
}
}
}
$worksheetID
=
0
;
foreach
(
$gnmXML
->
Sheets
->
Sheet
as
$sheet
)
{
$worksheetName
=
(
string
)
$sheet
->
Name
;
// echo '<b>Worksheet: ',$worksheetName,'</b><br />';
if
((
isset
(
$this
->
_loadSheetsOnly
))
&&
(
!
in_array
(
$worksheetName
,
$this
->
_loadSheetsOnly
)))
{
continue
;
}
$maxRow
=
$maxCol
=
0
;
// Create new Worksheet
$objPHPExcel
->
createSheet
();
$objPHPExcel
->
setActiveSheetIndex
(
$worksheetID
);
// Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in formula
// cells... during the load, all formulae should be correct, and we're simply bringing the worksheet
// name in line with the formula, not the reverse
$objPHPExcel
->
getActiveSheet
()
->
setTitle
(
$worksheetName
,
false
);
if
((
!
$this
->
_readDataOnly
)
&&
(
isset
(
$sheet
->
PrintInformation
)))
{
if
(
isset
(
$sheet
->
PrintInformation
->
Margins
))
{
foreach
(
$sheet
->
PrintInformation
->
Margins
->
children
(
'gnm'
,
TRUE
)
as
$key
=>
$margin
)
{
$marginAttributes
=
$margin
->
attributes
();
$marginSize
=
72
/
100
;
// Default
switch
(
$marginAttributes
[
'PrefUnit'
])
{
case
'mm'
:
$marginSize
=
intval
(
$marginAttributes
[
'Points'
])
/
100
;
break
;
}
switch
(
$key
)
{
case
'top'
:
$objPHPExcel
->
getActiveSheet
()
->
getPageMargins
()
->
setTop
(
$marginSize
);
break
;
case
'bottom'
:
$objPHPExcel
->
getActiveSheet
()
->
getPageMargins
()
->
setBottom
(
$marginSize
);
break
;
case
'left'
:
$objPHPExcel
->
getActiveSheet
()
->
getPageMargins
()
->
setLeft
(
$marginSize
);
break
;
case
'right'
:
$objPHPExcel
->
getActiveSheet
()
->
getPageMargins
()
->
setRight
(
$marginSize
);
break
;
case
'header'
:
$objPHPExcel
->
getActiveSheet
()
->
getPageMargins
()
->
setHeader
(
$marginSize
);
break
;
case
'footer'
:
$objPHPExcel
->
getActiveSheet
()
->
getPageMargins
()
->
setFooter
(
$marginSize
);
break
;
}
}
}
}
foreach
(
$sheet
->
Cells
->
Cell
as
$cell
)
{
$cellAttributes
=
$cell
->
attributes
();
$row
=
(
int
)
$cellAttributes
->
Row
+
1
;
$column
=
(
int
)
$cellAttributes
->
Col
;
if
(
$row
>
$maxRow
)
$maxRow
=
$row
;
if
(
$column
>
$maxCol
)
$maxCol
=
$column
;
$column
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$column
);
// Read cell?
if
(
$this
->
getReadFilter
()
!==
NULL
)
{
if
(
!
$this
->
getReadFilter
()
->
readCell
(
$column
,
$row
,
$worksheetName
))
{
continue
;
}
}
$ValueType
=
$cellAttributes
->
ValueType
;
$ExprID
=
(
string
)
$cellAttributes
->
ExprID
;
// echo 'Cell ',$column,$row,'<br />';
// echo 'Type is ',$ValueType,'<br />';
// echo 'Value is ',$cell,'<br />';
$type
=
PHPExcel_Cell_DataType
::
TYPE_FORMULA
;
if
(
$ExprID
>
''
)
{
if
(((
string
)
$cell
)
>
''
)
{
$this
->
_expressions
[
$ExprID
]
=
array
(
'column'
=>
$cellAttributes
->
Col
,
'row'
=>
$cellAttributes
->
Row
,
'formula'
=>
(
string
)
$cell
);
// echo 'NEW EXPRESSION ',$ExprID,'<br />';
}
else
{
$expression
=
$this
->
_expressions
[
$ExprID
];
$cell
=
$this
->
_referenceHelper
->
updateFormulaReferences
(
$expression
[
'formula'
],
'A1'
,
$cellAttributes
->
Col
-
$expression
[
'column'
],
$cellAttributes
->
Row
-
$expression
[
'row'
],
$worksheetName
);
// echo 'SHARED EXPRESSION ',$ExprID,'<br />';
// echo 'New Value is ',$cell,'<br />';
}
$type
=
PHPExcel_Cell_DataType
::
TYPE_FORMULA
;
}
else
{
switch
(
$ValueType
)
{
case
'10'
:
// NULL
$type
=
PHPExcel_Cell_DataType
::
TYPE_NULL
;
break
;
case
'20'
:
// Boolean
$type
=
PHPExcel_Cell_DataType
::
TYPE_BOOL
;
$cell
=
(
$cell
==
'TRUE'
)
?
True
:
False
;
break
;
case
'30'
:
// Integer
$cell
=
intval
(
$cell
);
case
'40'
:
// Float
$type
=
PHPExcel_Cell_DataType
::
TYPE_NUMERIC
;
break
;
case
'50'
:
// Error
$type
=
PHPExcel_Cell_DataType
::
TYPE_ERROR
;
break
;
case
'60'
:
// String
$type
=
PHPExcel_Cell_DataType
::
TYPE_STRING
;
break
;
case
'70'
:
// Cell Range
case
'80'
:
// Array
}
}
$objPHPExcel
->
getActiveSheet
()
->
getCell
(
$column
.
$row
)
->
setValueExplicit
(
$cell
,
$type
);
}
if
((
!
$this
->
_readDataOnly
)
&&
(
isset
(
$sheet
->
Objects
)))
{
foreach
(
$sheet
->
Objects
->
children
(
'gnm'
,
TRUE
)
as
$key
=>
$comment
)
{
$commentAttributes
=
$comment
->
attributes
();
// Only comment objects are handled at the moment
if
(
$commentAttributes
->
Text
)
{
$objPHPExcel
->
getActiveSheet
()
->
getComment
(
(
string
)
$commentAttributes
->
ObjectBound
)
->
setAuthor
(
(
string
)
$commentAttributes
->
Author
)
->
setText
(
$this
->
_parseRichText
((
string
)
$commentAttributes
->
Text
)
);
}
}
}
// echo '$maxCol=',$maxCol,'; $maxRow=',$maxRow,'<br />';
//
foreach
(
$sheet
->
Styles
->
StyleRegion
as
$styleRegion
)
{
$styleAttributes
=
$styleRegion
->
attributes
();
if
((
$styleAttributes
[
'startRow'
]
<=
$maxRow
)
&&
(
$styleAttributes
[
'startCol'
]
<=
$maxCol
))
{
$startColumn
=
PHPExcel_Cell
::
stringFromColumnIndex
((
int
)
$styleAttributes
[
'startCol'
]);
$startRow
=
$styleAttributes
[
'startRow'
]
+
1
;
$endColumn
=
(
$styleAttributes
[
'endCol'
]
>
$maxCol
)
?
$maxCol
:
(
int
)
$styleAttributes
[
'endCol'
];
$endColumn
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$endColumn
);
$endRow
=
(
$styleAttributes
[
'endRow'
]
>
$maxRow
)
?
$maxRow
:
$styleAttributes
[
'endRow'
];
$endRow
+=
1
;
$cellRange
=
$startColumn
.
$startRow
.
':'
.
$endColumn
.
$endRow
;
// echo $cellRange,'<br />';
$styleAttributes
=
$styleRegion
->
Style
->
attributes
();
// var_dump($styleAttributes);
// echo '<br />';
// We still set the number format mask for date/time values, even if _readDataOnly is true
if
((
!
$this
->
_readDataOnly
)
||
(
PHPExcel_Shared_Date
::
isDateTimeFormatCode
((
string
)
$styleAttributes
[
'Format'
])))
{
$styleArray
=
array
();
$styleArray
[
'numberformat'
][
'code'
]
=
(
string
)
$styleAttributes
[
'Format'
];
// If _readDataOnly is false, we set all formatting information
if
(
!
$this
->
_readDataOnly
)
{
switch
(
$styleAttributes
[
'HAlign'
])
{
case
'1'
:
$styleArray
[
'alignment'
][
'horizontal'
]
=
PHPExcel_Style_Alignment
::
HORIZONTAL_GENERAL
;
break
;
case
'2'
:
$styleArray
[
'alignment'
][
'horizontal'
]
=
PHPExcel_Style_Alignment
::
HORIZONTAL_LEFT
;
break
;
case
'4'
:
$styleArray
[
'alignment'
][
'horizontal'
]
=
PHPExcel_Style_Alignment
::
HORIZONTAL_RIGHT
;
break
;
case
'8'
:
$styleArray
[
'alignment'
][
'horizontal'
]
=
PHPExcel_Style_Alignment
::
HORIZONTAL_CENTER
;
break
;
case
'16'
:
case
'64'
:
$styleArray
[
'alignment'
][
'horizontal'
]
=
PHPExcel_Style_Alignment
::
HORIZONTAL_CENTER_CONTINUOUS
;
break
;
case
'32'
:
$styleArray
[
'alignment'
][
'horizontal'
]
=
PHPExcel_Style_Alignment
::
HORIZONTAL_JUSTIFY
;
break
;
}
switch
(
$styleAttributes
[
'VAlign'
])
{
case
'1'
:
$styleArray
[
'alignment'
][
'vertical'
]
=
PHPExcel_Style_Alignment
::
VERTICAL_TOP
;
break
;
case
'2'
:
$styleArray
[
'alignment'
][
'vertical'
]
=
PHPExcel_Style_Alignment
::
VERTICAL_BOTTOM
;
break
;
case
'4'
:
$styleArray
[
'alignment'
][
'vertical'
]
=
PHPExcel_Style_Alignment
::
VERTICAL_CENTER
;
break
;
case
'8'
:
$styleArray
[
'alignment'
][
'vertical'
]
=
PHPExcel_Style_Alignment
::
VERTICAL_JUSTIFY
;
break
;
}
$styleArray
[
'alignment'
][
'wrap'
]
=
(
$styleAttributes
[
'WrapText'
]
==
'1'
)
?
True
:
False
;
$styleArray
[
'alignment'
][
'shrinkToFit'
]
=
(
$styleAttributes
[
'ShrinkToFit'
]
==
'1'
)
?
True
:
False
;
$styleArray
[
'alignment'
][
'indent'
]
=
(
intval
(
$styleAttributes
[
"Indent"
])
>
0
)
?
$styleAttributes
[
"indent"
]
:
0
;
$RGB
=
self
::
_parseGnumericColour
(
$styleAttributes
[
"Fore"
]);
$styleArray
[
'font'
][
'color'
][
'rgb'
]
=
$RGB
;
$RGB
=
self
::
_parseGnumericColour
(
$styleAttributes
[
"Back"
]);
$shade
=
$styleAttributes
[
"Shade"
];
if
((
$RGB
!=
'000000'
)
||
(
$shade
!=
'0'
))
{
$styleArray
[
'fill'
][
'color'
][
'rgb'
]
=
$styleArray
[
'fill'
][
'startcolor'
][
'rgb'
]
=
$RGB
;
$RGB2
=
self
::
_parseGnumericColour
(
$styleAttributes
[
"PatternColor"
]);
$styleArray
[
'fill'
][
'endcolor'
][
'rgb'
]
=
$RGB2
;
switch
(
$shade
)
{
case
'1'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_SOLID
;
break
;
case
'2'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_GRADIENT_LINEAR
;
break
;
case
'3'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_GRADIENT_PATH
;
break
;
case
'4'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_DARKDOWN
;
break
;
case
'5'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_DARKGRAY
;
break
;
case
'6'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_DARKGRID
;
break
;
case
'7'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_DARKHORIZONTAL
;
break
;
case
'8'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_DARKTRELLIS
;
break
;
case
'9'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_DARKUP
;
break
;
case
'10'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_DARKVERTICAL
;
break
;
case
'11'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_GRAY0625
;
break
;
case
'12'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_GRAY125
;
break
;
case
'13'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_LIGHTDOWN
;
break
;
case
'14'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_LIGHTGRAY
;
break
;
case
'15'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_LIGHTGRID
;
break
;
case
'16'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_LIGHTHORIZONTAL
;
break
;
case
'17'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_LIGHTTRELLIS
;
break
;
case
'18'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_LIGHTUP
;
break
;
case
'19'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_LIGHTVERTICAL
;
break
;
case
'20'
:
$styleArray
[
'fill'
][
'type'
]
=
PHPExcel_Style_Fill
::
FILL_PATTERN_MEDIUMGRAY
;
break
;
}
}
$fontAttributes
=
$styleRegion
->
Style
->
Font
->
attributes
();
// var_dump($fontAttributes);
// echo '<br />';
$styleArray
[
'font'
][
'name'
]
=
(
string
)
$styleRegion
->
Style
->
Font
;
$styleArray
[
'font'
][
'size'
]
=
intval
(
$fontAttributes
[
'Unit'
]);
$styleArray
[
'font'
][
'bold'
]
=
(
$fontAttributes
[
'Bold'
]
==
'1'
)
?
True
:
False
;
$styleArray
[
'font'
][
'italic'
]
=
(
$fontAttributes
[
'Italic'
]
==
'1'
)
?
True
:
False
;
$styleArray
[
'font'
][
'strike'
]
=
(
$fontAttributes
[
'StrikeThrough'
]
==
'1'
)
?
True
:
False
;
switch
(
$fontAttributes
[
'Underline'
])
{
case
'1'
:
$styleArray
[
'font'
][
'underline'
]
=
PHPExcel_Style_Font
::
UNDERLINE_SINGLE
;
break
;
case
'2'
:
$styleArray
[
'font'
][
'underline'
]
=
PHPExcel_Style_Font
::
UNDERLINE_DOUBLE
;
break
;
case
'3'
:
$styleArray
[
'font'
][
'underline'
]
=
PHPExcel_Style_Font
::
UNDERLINE_SINGLEACCOUNTING
;
break
;
case
'4'
:
$styleArray
[
'font'
][
'underline'
]
=
PHPExcel_Style_Font
::
UNDERLINE_DOUBLEACCOUNTING
;
break
;
default
:
$styleArray
[
'font'
][
'underline'
]
=
PHPExcel_Style_Font
::
UNDERLINE_NONE
;
break
;
}
switch
(
$fontAttributes
[
'Script'
])
{
case
'1'
:
$styleArray
[
'font'
][
'superScript'
]
=
True
;
break
;
case
'-1'
:
$styleArray
[
'font'
][
'subScript'
]
=
True
;
break
;
}
if
(
isset
(
$styleRegion
->
Style
->
StyleBorder
))
{
if
(
isset
(
$styleRegion
->
Style
->
StyleBorder
->
Top
))
{
$styleArray
[
'borders'
][
'top'
]
=
self
::
_parseBorderAttributes
(
$styleRegion
->
Style
->
StyleBorder
->
Top
->
attributes
());
}
if
(
isset
(
$styleRegion
->
Style
->
StyleBorder
->
Bottom
))
{
$styleArray
[
'borders'
][
'bottom'
]
=
self
::
_parseBorderAttributes
(
$styleRegion
->
Style
->
StyleBorder
->
Bottom
->
attributes
());
}
if
(
isset
(
$styleRegion
->
Style
->
StyleBorder
->
Left
))
{
$styleArray
[
'borders'
][
'left'
]
=
self
::
_parseBorderAttributes
(
$styleRegion
->
Style
->
StyleBorder
->
Left
->
attributes
());
}
if
(
isset
(
$styleRegion
->
Style
->
StyleBorder
->
Right
))
{
$styleArray
[
'borders'
][
'right'
]
=
self
::
_parseBorderAttributes
(
$styleRegion
->
Style
->
StyleBorder
->
Right
->
attributes
());
}
if
((
isset
(
$styleRegion
->
Style
->
StyleBorder
->
Diagonal
))
&&
(
isset
(
$styleRegion
->
Style
->
StyleBorder
->
{
'Rev-Diagonal'
})))
{
$styleArray
[
'borders'
][
'diagonal'
]
=
self
::
_parseBorderAttributes
(
$styleRegion
->
Style
->
StyleBorder
->
Diagonal
->
attributes
());
$styleArray
[
'borders'
][
'diagonaldirection'
]
=
PHPExcel_Style_Borders
::
DIAGONAL_BOTH
;
}
elseif
(
isset
(
$styleRegion
->
Style
->
StyleBorder
->
Diagonal
))
{
$styleArray
[
'borders'
][
'diagonal'
]
=
self
::
_parseBorderAttributes
(
$styleRegion
->
Style
->
StyleBorder
->
Diagonal
->
attributes
());
$styleArray
[
'borders'
][
'diagonaldirection'
]
=
PHPExcel_Style_Borders
::
DIAGONAL_UP
;
}
elseif
(
isset
(
$styleRegion
->
Style
->
StyleBorder
->
{
'Rev-Diagonal'
}))
{
$styleArray
[
'borders'
][
'diagonal'
]
=
self
::
_parseBorderAttributes
(
$styleRegion
->
Style
->
StyleBorder
->
{
'Rev-Diagonal'
}
->
attributes
());
$styleArray
[
'borders'
][
'diagonaldirection'
]
=
PHPExcel_Style_Borders
::
DIAGONAL_DOWN
;
}
}
if
(
isset
(
$styleRegion
->
Style
->
HyperLink
))
{
// TO DO
$hyperlink
=
$styleRegion
->
Style
->
HyperLink
->
attributes
();
}
}
// var_dump($styleArray);
// echo '<br />';
$objPHPExcel
->
getActiveSheet
()
->
getStyle
(
$cellRange
)
->
applyFromArray
(
$styleArray
);
}
}
}
if
((
!
$this
->
_readDataOnly
)
&&
(
isset
(
$sheet
->
Cols
)))
{
// Column Widths
$columnAttributes
=
$sheet
->
Cols
->
attributes
();
$defaultWidth
=
$columnAttributes
[
'DefaultSizePts'
]
/
5.4
;
$c
=
0
;
foreach
(
$sheet
->
Cols
->
ColInfo
as
$columnOverride
)
{
$columnAttributes
=
$columnOverride
->
attributes
();
$column
=
$columnAttributes
[
'No'
];
$columnWidth
=
$columnAttributes
[
'Unit'
]
/
5.4
;
$hidden
=
((
isset
(
$columnAttributes
[
'Hidden'
]))
&&
(
$columnAttributes
[
'Hidden'
]
==
'1'
))
?
true
:
false
;
$columnCount
=
(
isset
(
$columnAttributes
[
'Count'
]))
?
$columnAttributes
[
'Count'
]
:
1
;
while
(
$c
<
$column
)
{
$objPHPExcel
->
getActiveSheet
()
->
getColumnDimension
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$c
))
->
setWidth
(
$defaultWidth
);
++
$c
;
}
while
((
$c
<
(
$column
+
$columnCount
))
&&
(
$c
<=
$maxCol
))
{
$objPHPExcel
->
getActiveSheet
()
->
getColumnDimension
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$c
))
->
setWidth
(
$columnWidth
);
if
(
$hidden
)
{
$objPHPExcel
->
getActiveSheet
()
->
getColumnDimension
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$c
))
->
setVisible
(
false
);
}
++
$c
;
}
}
while
(
$c
<=
$maxCol
)
{
$objPHPExcel
->
getActiveSheet
()
->
getColumnDimension
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$c
))
->
setWidth
(
$defaultWidth
);
++
$c
;
}
}
if
((
!
$this
->
_readDataOnly
)
&&
(
isset
(
$sheet
->
Rows
)))
{
// Row Heights
$rowAttributes
=
$sheet
->
Rows
->
attributes
();
$defaultHeight
=
$rowAttributes
[
'DefaultSizePts'
];
$r
=
0
;
foreach
(
$sheet
->
Rows
->
RowInfo
as
$rowOverride
)
{
$rowAttributes
=
$rowOverride
->
attributes
();
$row
=
$rowAttributes
[
'No'
];
$rowHeight
=
$rowAttributes
[
'Unit'
];
$hidden
=
((
isset
(
$rowAttributes
[
'Hidden'
]))
&&
(
$rowAttributes
[
'Hidden'
]
==
'1'
))
?
true
:
false
;
$rowCount
=
(
isset
(
$rowAttributes
[
'Count'
]))
?
$rowAttributes
[
'Count'
]
:
1
;
while
(
$r
<
$row
)
{
++
$r
;
$objPHPExcel
->
getActiveSheet
()
->
getRowDimension
(
$r
)
->
setRowHeight
(
$defaultHeight
);
}
while
((
$r
<
(
$row
+
$rowCount
))
&&
(
$r
<
$maxRow
))
{
++
$r
;
$objPHPExcel
->
getActiveSheet
()
->
getRowDimension
(
$r
)
->
setRowHeight
(
$rowHeight
);
if
(
$hidden
)
{
$objPHPExcel
->
getActiveSheet
()
->
getRowDimension
(
$r
)
->
setVisible
(
false
);
}
}
}
while
(
$r
<
$maxRow
)
{
++
$r
;
$objPHPExcel
->
getActiveSheet
()
->
getRowDimension
(
$r
)
->
setRowHeight
(
$defaultHeight
);
}
}
// Handle Merged Cells in this worksheet
if
(
isset
(
$sheet
->
MergedRegions
))
{
foreach
(
$sheet
->
MergedRegions
->
Merge
as
$mergeCells
)
{
if
(
strpos
(
$mergeCells
,
':'
)
!==
FALSE
)
{
$objPHPExcel
->
getActiveSheet
()
->
mergeCells
(
$mergeCells
);
}
}
}
$worksheetID
++
;
}
// Loop through definedNames (global named ranges)
if
(
isset
(
$gnmXML
->
Names
))
{
foreach
(
$gnmXML
->
Names
->
Name
as
$namedRange
)
{
$name
=
(
string
)
$namedRange
->
name
;
$range
=
(
string
)
$namedRange
->
value
;
if
(
stripos
(
$range
,
'#REF!'
)
!==
false
)
{
continue
;
}
$range
=
explode
(
'!'
,
$range
);
$range
[
0
]
=
trim
(
$range
[
0
],
"'"
);;
if
(
$worksheet
=
$objPHPExcel
->
getSheetByName
(
$range
[
0
]))
{
$extractedRange
=
str_replace
(
'$'
,
''
,
$range
[
1
]);
$objPHPExcel
->
addNamedRange
(
new
PHPExcel_NamedRange
(
$name
,
$worksheet
,
$extractedRange
)
);
}
}
}
// Return
return
$objPHPExcel
;
}
private
static
function
_parseBorderAttributes
(
$borderAttributes
)
{
$styleArray
=
array
();
if
(
isset
(
$borderAttributes
[
"Color"
]))
{
$RGB
=
self
::
_parseGnumericColour
(
$borderAttributes
[
"Color"
]);
$styleArray
[
'color'
][
'rgb'
]
=
$RGB
;
}
switch
(
$borderAttributes
[
"Style"
])
{
case
'0'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_NONE
;
break
;
case
'1'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_THIN
;
break
;
case
'2'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_MEDIUM
;
break
;
case
'4'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_DASHED
;
break
;
case
'5'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_THICK
;
break
;
case
'6'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_DOUBLE
;
break
;
case
'7'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_DOTTED
;
break
;
case
'9'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_DASHDOT
;
break
;
case
'10'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_MEDIUMDASHDOT
;
break
;
case
'11'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_DASHDOTDOT
;
break
;
case
'12'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_MEDIUMDASHDOTDOT
;
break
;
case
'13'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_MEDIUMDASHDOTDOT
;
break
;
case
'3'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_SLANTDASHDOT
;
break
;
case
'8'
:
$styleArray
[
'style'
]
=
PHPExcel_Style_Border
::
BORDER_MEDIUMDASHED
;
break
;
}
return
$styleArray
;
}
private
function
_parseRichText
(
$is
=
''
)
{
$value
=
new
PHPExcel_RichText
();
$value
->
createText
(
$is
);
return
$value
;
}
private
static
function
_parseGnumericColour
(
$gnmColour
)
{
list
(
$gnmR
,
$gnmG
,
$gnmB
)
=
explode
(
':'
,
$gnmColour
);
$gnmR
=
substr
(
str_pad
(
$gnmR
,
4
,
'0'
,
STR_PAD_RIGHT
),
0
,
2
);
$gnmG
=
substr
(
str_pad
(
$gnmG
,
4
,
'0'
,
STR_PAD_RIGHT
),
0
,
2
);
$gnmB
=
substr
(
str_pad
(
$gnmB
,
4
,
'0'
,
STR_PAD_RIGHT
),
0
,
2
);
$RGB
=
$gnmR
.
$gnmG
.
$gnmB
;
// echo 'Excel Colour: ',$RGB,'<br />';
return
$RGB
;
}
}
lib/Classes/PHPExcel/Reader/HTML.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/** PHPExcel root directory */
if
(
!
defined
(
'PHPEXCEL_ROOT'
))
{
/**
* @ignore
*/
define
(
'PHPEXCEL_ROOT'
,
dirname
(
__FILE__
)
.
'/../../'
);
require
(
PHPEXCEL_ROOT
.
'PHPExcel/Autoloader.php'
);
}
/**
* PHPExcel_Reader_HTML
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Reader_HTML
extends
PHPExcel_Reader_Abstract
implements
PHPExcel_Reader_IReader
{
/**
* Input encoding
*
* @var string
*/
private
$_inputEncoding
=
'ANSI'
;
/**
* Sheet index to read
*
* @var int
*/
private
$_sheetIndex
=
0
;
/**
* Formats
*
* @var array
*/
private
$_formats
=
array
(
'h1'
=>
array
(
'font'
=>
array
(
'bold'
=>
true
,
'size'
=>
24
,
),
),
// Bold, 24pt
'h2'
=>
array
(
'font'
=>
array
(
'bold'
=>
true
,
'size'
=>
18
,
),
),
// Bold, 18pt
'h3'
=>
array
(
'font'
=>
array
(
'bold'
=>
true
,
'size'
=>
13.5
,
),
),
// Bold, 13.5pt
'h4'
=>
array
(
'font'
=>
array
(
'bold'
=>
true
,
'size'
=>
12
,
),
),
// Bold, 12pt
'h5'
=>
array
(
'font'
=>
array
(
'bold'
=>
true
,
'size'
=>
10
,
),
),
// Bold, 10pt
'h6'
=>
array
(
'font'
=>
array
(
'bold'
=>
true
,
'size'
=>
7.5
,
),
),
// Bold, 7.5pt
'a'
=>
array
(
'font'
=>
array
(
'underline'
=>
true
,
'color'
=>
array
(
'argb'
=>
PHPExcel_Style_Color
::
COLOR_BLUE
,
),
),
),
// Blue underlined
'hr'
=>
array
(
'borders'
=>
array
(
'bottom'
=>
array
(
'style'
=>
PHPExcel_Style_Border
::
BORDER_THIN
,
'color'
=>
array
(
PHPExcel_Style_Color
::
COLOR_BLACK
,
),
),
),
),
// Bottom border
);
/**
* Create a new PHPExcel_Reader_HTML
*/
public
function
__construct
()
{
$this
->
_readFilter
=
new
PHPExcel_Reader_DefaultReadFilter
();
}
/**
* Validate that the current file is an HTML file
*
* @return boolean
*/
protected
function
_isValidFormat
()
{
// Reading 2048 bytes should be enough to validate that the format is HTML
$data
=
fread
(
$this
->
_fileHandle
,
2048
);
if
((
strpos
(
$data
,
'<'
)
!==
FALSE
)
&&
(
strlen
(
$data
)
!==
strlen
(
strip_tags
(
$data
))))
{
return
TRUE
;
}
return
FALSE
;
}
/**
* Loads PHPExcel from file
*
* @param string $pFilename
* @return PHPExcel
* @throws PHPExcel_Reader_Exception
*/
public
function
load
(
$pFilename
)
{
// Create new PHPExcel
$objPHPExcel
=
new
PHPExcel
();
// Load into this instance
return
$this
->
loadIntoExisting
(
$pFilename
,
$objPHPExcel
);
}
/**
* Set input encoding
*
* @param string $pValue Input encoding
*/
public
function
setInputEncoding
(
$pValue
=
'ANSI'
)
{
$this
->
_inputEncoding
=
$pValue
;
return
$this
;
}
/**
* Get input encoding
*
* @return string
*/
public
function
getInputEncoding
()
{
return
$this
->
_inputEncoding
;
}
// Data Array used for testing only, should write to PHPExcel object on completion of tests
private
$_dataArray
=
array
();
private
$_tableLevel
=
0
;
private
$_nestedColumn
=
array
(
'A'
);
private
function
_setTableStartColumn
(
$column
)
{
if
(
$this
->
_tableLevel
==
0
)
$column
=
'A'
;
++
$this
->
_tableLevel
;
$this
->
_nestedColumn
[
$this
->
_tableLevel
]
=
$column
;
return
$this
->
_nestedColumn
[
$this
->
_tableLevel
];
}
private
function
_getTableStartColumn
()
{
return
$this
->
_nestedColumn
[
$this
->
_tableLevel
];
}
private
function
_releaseTableStartColumn
()
{
--
$this
->
_tableLevel
;
return
array_pop
(
$this
->
_nestedColumn
);
}
private
function
_flushCell
(
$sheet
,
$column
,
$row
,
&
$cellContent
)
{
if
(
is_string
(
$cellContent
))
{
// Simple String content
if
(
trim
(
$cellContent
)
>
''
)
{
// Only actually write it if there's content in the string
// echo 'FLUSH CELL: ' , $column , $row , ' => ' , $cellContent , '<br />';
// Write to worksheet to be done here...
// ... we return the cell so we can mess about with styles more easily
$cell
=
$sheet
->
setCellValue
(
$column
.
$row
,
$cellContent
,
true
);
$this
->
_dataArray
[
$row
][
$column
]
=
$cellContent
;
}
}
else
{
// We have a Rich Text run
// TODO
$this
->
_dataArray
[
$row
][
$column
]
=
'RICH TEXT: '
.
$cellContent
;
}
$cellContent
=
(
string
)
''
;
}
private
function
_processDomElement
(
DOMNode
$element
,
$sheet
,
&
$row
,
&
$column
,
&
$cellContent
){
foreach
(
$element
->
childNodes
as
$child
){
if
(
$child
instanceof
DOMText
)
{
$domText
=
preg_replace
(
'/\s+/'
,
' '
,
trim
(
$child
->
nodeValue
));
if
(
is_string
(
$cellContent
))
{
// simply append the text if the cell content is a plain text string
$cellContent
.
=
$domText
;
}
else
{
// but if we have a rich text run instead, we need to append it correctly
// TODO
}
}
elseif
(
$child
instanceof
DOMElement
)
{
// echo '<b>DOM ELEMENT: </b>' , strtoupper($child->nodeName) , '<br />';
$attributeArray
=
array
();
foreach
(
$child
->
attributes
as
$attribute
)
{
// echo '<b>ATTRIBUTE: </b>' , $attribute->name , ' => ' , $attribute->value , '<br />';
$attributeArray
[
$attribute
->
name
]
=
$attribute
->
value
;
}
switch
(
$child
->
nodeName
)
{
case
'meta'
:
foreach
(
$attributeArray
as
$attributeName
=>
$attributeValue
)
{
switch
(
$attributeName
)
{
case
'content'
:
// TODO
// Extract character set, so we can convert to UTF-8 if required
break
;
}
}
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
break
;
case
'title'
:
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
$sheet
->
setTitle
(
$cellContent
);
$cellContent
=
''
;
break
;
case
'span'
:
case
'div'
:
case
'font'
:
case
'i'
:
case
'em'
:
case
'strong'
:
case
'b'
:
// echo 'STYLING, SPAN OR DIV<br />';
if
(
$cellContent
>
''
)
$cellContent
.
=
' '
;
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
if
(
$cellContent
>
''
)
$cellContent
.
=
' '
;
// echo 'END OF STYLING, SPAN OR DIV<br />';
break
;
case
'hr'
:
$this
->
_flushCell
(
$sheet
,
$column
,
$row
,
$cellContent
);
++
$row
;
if
(
isset
(
$this
->
_formats
[
$child
->
nodeName
]))
{
$sheet
->
getStyle
(
$column
.
$row
)
->
applyFromArray
(
$this
->
_formats
[
$child
->
nodeName
]);
}
else
{
$cellContent
=
'----------'
;
$this
->
_flushCell
(
$sheet
,
$column
,
$row
,
$cellContent
);
}
++
$row
;
case
'br'
:
if
(
$this
->
_tableLevel
>
0
)
{
// If we're inside a table, replace with a \n
$cellContent
.
=
"
\n
"
;
}
else
{
// Otherwise flush our existing content and move the row cursor on
$this
->
_flushCell
(
$sheet
,
$column
,
$row
,
$cellContent
);
++
$row
;
}
// echo 'HARD LINE BREAK: ' , '<br />';
break
;
case
'a'
:
// echo 'START OF HYPERLINK: ' , '<br />';
foreach
(
$attributeArray
as
$attributeName
=>
$attributeValue
)
{
switch
(
$attributeName
)
{
case
'href'
:
// echo 'Link to ' , $attributeValue , '<br />';
$sheet
->
getCell
(
$column
.
$row
)
->
getHyperlink
()
->
setUrl
(
$attributeValue
);
if
(
isset
(
$this
->
_formats
[
$child
->
nodeName
]))
{
$sheet
->
getStyle
(
$column
.
$row
)
->
applyFromArray
(
$this
->
_formats
[
$child
->
nodeName
]);
}
break
;
}
}
$cellContent
.
=
' '
;
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
// echo 'END OF HYPERLINK:' , '<br />';
break
;
case
'h1'
:
case
'h2'
:
case
'h3'
:
case
'h4'
:
case
'h5'
:
case
'h6'
:
case
'ol'
:
case
'ul'
:
case
'p'
:
if
(
$this
->
_tableLevel
>
0
)
{
// If we're inside a table, replace with a \n
$cellContent
.
=
"
\n
"
;
// echo 'LIST ENTRY: ' , '<br />';
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
// echo 'END OF LIST ENTRY:' , '<br />';
}
else
{
if
(
$cellContent
>
''
)
{
$this
->
_flushCell
(
$sheet
,
$column
,
$row
,
$cellContent
);
$row
+=
2
;
}
// echo 'START OF PARAGRAPH: ' , '<br />';
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
// echo 'END OF PARAGRAPH:' , '<br />';
$this
->
_flushCell
(
$sheet
,
$column
,
$row
,
$cellContent
);
if
(
isset
(
$this
->
_formats
[
$child
->
nodeName
]))
{
$sheet
->
getStyle
(
$column
.
$row
)
->
applyFromArray
(
$this
->
_formats
[
$child
->
nodeName
]);
}
$row
+=
2
;
$column
=
'A'
;
}
break
;
case
'li'
:
if
(
$this
->
_tableLevel
>
0
)
{
// If we're inside a table, replace with a \n
$cellContent
.
=
"
\n
"
;
// echo 'LIST ENTRY: ' , '<br />';
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
// echo 'END OF LIST ENTRY:' , '<br />';
}
else
{
if
(
$cellContent
>
''
)
{
$this
->
_flushCell
(
$sheet
,
$column
,
$row
,
$cellContent
);
}
++
$row
;
// echo 'LIST ENTRY: ' , '<br />';
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
// echo 'END OF LIST ENTRY:' , '<br />';
$this
->
_flushCell
(
$sheet
,
$column
,
$row
,
$cellContent
);
$column
=
'A'
;
}
break
;
case
'table'
:
$this
->
_flushCell
(
$sheet
,
$column
,
$row
,
$cellContent
);
$column
=
$this
->
_setTableStartColumn
(
$column
);
// echo 'START OF TABLE LEVEL ' , $this->_tableLevel , '<br />';
if
(
$this
->
_tableLevel
>
1
)
--
$row
;
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
// echo 'END OF TABLE LEVEL ' , $this->_tableLevel , '<br />';
$column
=
$this
->
_releaseTableStartColumn
();
if
(
$this
->
_tableLevel
>
1
)
{
++
$column
;
}
else
{
++
$row
;
}
break
;
case
'thead'
:
case
'tbody'
:
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
break
;
case
'tr'
:
++
$row
;
$column
=
$this
->
_getTableStartColumn
();
$cellContent
=
''
;
// echo 'START OF TABLE ' , $this->_tableLevel , ' ROW<br />';
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
// echo 'END OF TABLE ' , $this->_tableLevel , ' ROW<br />';
break
;
case
'th'
:
case
'td'
:
// echo 'START OF TABLE ' , $this->_tableLevel , ' CELL<br />';
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
// echo 'END OF TABLE ' , $this->_tableLevel , ' CELL<br />';
$this
->
_flushCell
(
$sheet
,
$column
,
$row
,
$cellContent
);
++
$column
;
break
;
case
'body'
:
$row
=
1
;
$column
=
'A'
;
$content
=
''
;
$this
->
_tableLevel
=
0
;
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
break
;
default
:
$this
->
_processDomElement
(
$child
,
$sheet
,
$row
,
$column
,
$cellContent
);
}
}
}
}
/**
* Loads PHPExcel from file into PHPExcel instance
*
* @param string $pFilename
* @param PHPExcel $objPHPExcel
* @return PHPExcel
* @throws PHPExcel_Reader_Exception
*/
public
function
loadIntoExisting
(
$pFilename
,
PHPExcel
$objPHPExcel
)
{
// Open file to validate
$this
->
_openFile
(
$pFilename
);
if
(
!
$this
->
_isValidFormat
())
{
fclose
(
$this
->
_fileHandle
);
throw
new
PHPExcel_Reader_Exception
(
$pFilename
.
" is an Invalid HTML file."
);
}
// Close after validating
fclose
(
$this
->
_fileHandle
);
// Create new PHPExcel
while
(
$objPHPExcel
->
getSheetCount
()
<=
$this
->
_sheetIndex
)
{
$objPHPExcel
->
createSheet
();
}
$objPHPExcel
->
setActiveSheetIndex
(
$this
->
_sheetIndex
);
// Create a new DOM object
$dom
=
new
domDocument
;
// Reload the HTML file into the DOM object
$loaded
=
$dom
->
loadHTMLFile
(
$pFilename
,
PHPExcel_Settings
::
getLibXmlLoaderOptions
());
if
(
$loaded
===
FALSE
)
{
throw
new
PHPExcel_Reader_Exception
(
'Failed to load '
,
$pFilename
,
' as a DOM Document'
);
}
// Discard white space
$dom
->
preserveWhiteSpace
=
false
;
$row
=
0
;
$column
=
'A'
;
$content
=
''
;
$this
->
_processDomElement
(
$dom
,
$objPHPExcel
->
getActiveSheet
(),
$row
,
$column
,
$content
);
// echo '<hr />';
// var_dump($this->_dataArray);
// Return
return
$objPHPExcel
;
}
/**
* Get sheet index
*
* @return int
*/
public
function
getSheetIndex
()
{
return
$this
->
_sheetIndex
;
}
/**
* Set sheet index
*
* @param int $pValue Sheet index
* @return PHPExcel_Reader_HTML
*/
public
function
setSheetIndex
(
$pValue
=
0
)
{
$this
->
_sheetIndex
=
$pValue
;
return
$this
;
}
}
lib/Classes/PHPExcel/Reader/IReadFilter.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_Reader_IReadFilter
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
interface
PHPExcel_Reader_IReadFilter
{
/**
* Should this cell be read?
*
* @param $column String column index
* @param $row Row index
* @param $worksheetName Optional worksheet name
* @return boolean
*/
public
function
readCell
(
$column
,
$row
,
$worksheetName
=
''
);
}
lib/Classes/PHPExcel/Reader/IReader.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_Reader_IReader
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
interface
PHPExcel_Reader_IReader
{
/**
* Can the current PHPExcel_Reader_IReader read the file?
*
* @param string $pFilename
* @return boolean
*/
public
function
canRead
(
$pFilename
);
/**
* Loads PHPExcel from file
*
* @param string $pFilename
* @throws PHPExcel_Reader_Exception
*/
public
function
load
(
$pFilename
);
}
lib/Classes/PHPExcel/Reader/OOCalc.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/** PHPExcel root directory */
if
(
!
defined
(
'PHPEXCEL_ROOT'
))
{
/**
* @ignore
*/
define
(
'PHPEXCEL_ROOT'
,
dirname
(
__FILE__
)
.
'/../../'
);
require
(
PHPEXCEL_ROOT
.
'PHPExcel/Autoloader.php'
);
}
/**
* PHPExcel_Reader_OOCalc
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Reader_OOCalc
extends
PHPExcel_Reader_Abstract
implements
PHPExcel_Reader_IReader
{
/**
* Formats
*
* @var array
*/
private
$_styles
=
array
();
/**
* Create a new PHPExcel_Reader_OOCalc
*/
public
function
__construct
()
{
$this
->
_readFilter
=
new
PHPExcel_Reader_DefaultReadFilter
();
}
/**
* Can the current PHPExcel_Reader_IReader read the file?
*
* @param string $pFilename
* @return boolean
* @throws PHPExcel_Reader_Exception
*/
public
function
canRead
(
$pFilename
)
{
// Check if file exists
if
(
!
file_exists
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! File does not exist."
);
}
$zipClass
=
PHPExcel_Settings
::
getZipClass
();
// Check if zip class exists
// if (!class_exists($zipClass, FALSE)) {
// throw new PHPExcel_Reader_Exception($zipClass . " library is not enabled");
// }
$mimeType
=
'UNKNOWN'
;
// Load file
$zip
=
new
$zipClass
;
if
(
$zip
->
open
(
$pFilename
)
===
true
)
{
// check if it is an OOXML archive
$stat
=
$zip
->
statName
(
'mimetype'
);
if
(
$stat
&&
(
$stat
[
'size'
]
<=
255
))
{
$mimeType
=
$zip
->
getFromName
(
$stat
[
'name'
]);
}
elseif
(
$stat
=
$zip
->
statName
(
'META-INF/manifest.xml'
))
{
$xml
=
simplexml_load_string
(
$zip
->
getFromName
(
'META-INF/manifest.xml'
),
'SimpleXMLElement'
,
PHPExcel_Settings
::
getLibXmlLoaderOptions
());
$namespacesContent
=
$xml
->
getNamespaces
(
true
);
if
(
isset
(
$namespacesContent
[
'manifest'
]))
{
$manifest
=
$xml
->
children
(
$namespacesContent
[
'manifest'
]);
foreach
(
$manifest
as
$manifestDataSet
)
{
$manifestAttributes
=
$manifestDataSet
->
attributes
(
$namespacesContent
[
'manifest'
]);
if
(
$manifestAttributes
->
{
'full-path'
}
==
'/'
)
{
$mimeType
=
(
string
)
$manifestAttributes
->
{
'media-type'
};
break
;
}
}
}
}
$zip
->
close
();
return
(
$mimeType
===
'application/vnd.oasis.opendocument.spreadsheet'
);
}
return
FALSE
;
}
/**
* Reads names of the worksheets from a file, without parsing the whole file to a PHPExcel object
*
* @param string $pFilename
* @throws PHPExcel_Reader_Exception
*/
public
function
listWorksheetNames
(
$pFilename
)
{
// Check if file exists
if
(
!
file_exists
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! File does not exist."
);
}
$zipClass
=
PHPExcel_Settings
::
getZipClass
();
$zip
=
new
$zipClass
;
if
(
!
$zip
->
open
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! Error opening file."
);
}
$worksheetNames
=
array
();
$xml
=
new
XMLReader
();
$res
=
$xml
->
open
(
'zip://'
.
realpath
(
$pFilename
)
.
'#content.xml'
,
null
,
PHPExcel_Settings
::
getLibXmlLoaderOptions
());
$xml
->
setParserProperty
(
2
,
true
);
// Step into the first level of content of the XML
$xml
->
read
();
while
(
$xml
->
read
())
{
// Quickly jump through to the office:body node
while
(
$xml
->
name
!==
'office:body'
)
{
if
(
$xml
->
isEmptyElement
)
$xml
->
read
();
else
$xml
->
next
();
}
// Now read each node until we find our first table:table node
while
(
$xml
->
read
())
{
if
(
$xml
->
name
==
'table:table'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
)
{
// Loop through each table:table node reading the table:name attribute for each worksheet name
do
{
$worksheetNames
[]
=
$xml
->
getAttribute
(
'table:name'
);
$xml
->
next
();
}
while
(
$xml
->
name
==
'table:table'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
);
}
}
}
return
$worksheetNames
;
}
/**
* Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)
*
* @param string $pFilename
* @throws PHPExcel_Reader_Exception
*/
public
function
listWorksheetInfo
(
$pFilename
)
{
// Check if file exists
if
(
!
file_exists
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! File does not exist."
);
}
$worksheetInfo
=
array
();
$zipClass
=
PHPExcel_Settings
::
getZipClass
();
$zip
=
new
$zipClass
;
if
(
!
$zip
->
open
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! Error opening file."
);
}
$xml
=
new
XMLReader
();
$res
=
$xml
->
open
(
'zip://'
.
realpath
(
$pFilename
)
.
'#content.xml'
,
null
,
PHPExcel_Settings
::
getLibXmlLoaderOptions
());
$xml
->
setParserProperty
(
2
,
true
);
// Step into the first level of content of the XML
$xml
->
read
();
while
(
$xml
->
read
())
{
// Quickly jump through to the office:body node
while
(
$xml
->
name
!==
'office:body'
)
{
if
(
$xml
->
isEmptyElement
)
$xml
->
read
();
else
$xml
->
next
();
}
// Now read each node until we find our first table:table node
while
(
$xml
->
read
())
{
if
(
$xml
->
name
==
'table:table'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
)
{
$worksheetNames
[]
=
$xml
->
getAttribute
(
'table:name'
);
$tmpInfo
=
array
(
'worksheetName'
=>
$xml
->
getAttribute
(
'table:name'
),
'lastColumnLetter'
=>
'A'
,
'lastColumnIndex'
=>
0
,
'totalRows'
=>
0
,
'totalColumns'
=>
0
,
);
// Loop through each child node of the table:table element reading
$currCells
=
0
;
do
{
$xml
->
read
();
if
(
$xml
->
name
==
'table:table-row'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
)
{
$rowspan
=
$xml
->
getAttribute
(
'table:number-rows-repeated'
);
$rowspan
=
empty
(
$rowspan
)
?
1
:
$rowspan
;
$tmpInfo
[
'totalRows'
]
+=
$rowspan
;
$tmpInfo
[
'totalColumns'
]
=
max
(
$tmpInfo
[
'totalColumns'
],
$currCells
);
$currCells
=
0
;
// Step into the row
$xml
->
read
();
do
{
if
(
$xml
->
name
==
'table:table-cell'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
)
{
if
(
!
$xml
->
isEmptyElement
)
{
$currCells
++
;
$xml
->
next
();
}
else
{
$xml
->
read
();
}
}
elseif
(
$xml
->
name
==
'table:covered-table-cell'
&&
$xml
->
nodeType
==
XMLReader
::
ELEMENT
)
{
$mergeSize
=
$xml
->
getAttribute
(
'table:number-columns-repeated'
);
$currCells
+=
$mergeSize
;
$xml
->
read
();
}
}
while
(
$xml
->
name
!=
'table:table-row'
);
}
}
while
(
$xml
->
name
!=
'table:table'
);
$tmpInfo
[
'totalColumns'
]
=
max
(
$tmpInfo
[
'totalColumns'
],
$currCells
);
$tmpInfo
[
'lastColumnIndex'
]
=
$tmpInfo
[
'totalColumns'
]
-
1
;
$tmpInfo
[
'lastColumnLetter'
]
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$tmpInfo
[
'lastColumnIndex'
]);
$worksheetInfo
[]
=
$tmpInfo
;
}
}
// foreach($workbookData->table as $worksheetDataSet) {
// $worksheetData = $worksheetDataSet->children($namespacesContent['table']);
// $worksheetDataAttributes = $worksheetDataSet->attributes($namespacesContent['table']);
//
// $rowIndex = 0;
// foreach ($worksheetData as $key => $rowData) {
// switch ($key) {
// case 'table-row' :
// $rowDataTableAttributes = $rowData->attributes($namespacesContent['table']);
// $rowRepeats = (isset($rowDataTableAttributes['number-rows-repeated'])) ?
// $rowDataTableAttributes['number-rows-repeated'] : 1;
// $columnIndex = 0;
//
// foreach ($rowData as $key => $cellData) {
// $cellDataTableAttributes = $cellData->attributes($namespacesContent['table']);
// $colRepeats = (isset($cellDataTableAttributes['number-columns-repeated'])) ?
// $cellDataTableAttributes['number-columns-repeated'] : 1;
// $cellDataOfficeAttributes = $cellData->attributes($namespacesContent['office']);
// if (isset($cellDataOfficeAttributes['value-type'])) {
// $tmpInfo['lastColumnIndex'] = max($tmpInfo['lastColumnIndex'], $columnIndex + $colRepeats - 1);
// $tmpInfo['totalRows'] = max($tmpInfo['totalRows'], $rowIndex + $rowRepeats);
// }
// $columnIndex += $colRepeats;
// }
// $rowIndex += $rowRepeats;
// break;
// }
// }
//
// $tmpInfo['lastColumnLetter'] = PHPExcel_Cell::stringFromColumnIndex($tmpInfo['lastColumnIndex']);
// $tmpInfo['totalColumns'] = $tmpInfo['lastColumnIndex'] + 1;
//
// }
// }
}
return
$worksheetInfo
;
}
/**
* Loads PHPExcel from file
*
* @param string $pFilename
* @return PHPExcel
* @throws PHPExcel_Reader_Exception
*/
public
function
load
(
$pFilename
)
{
// Create new PHPExcel
$objPHPExcel
=
new
PHPExcel
();
// Load into this instance
return
$this
->
loadIntoExisting
(
$pFilename
,
$objPHPExcel
);
}
private
static
function
identifyFixedStyleValue
(
$styleList
,
&
$styleAttributeValue
)
{
$styleAttributeValue
=
strtolower
(
$styleAttributeValue
);
foreach
(
$styleList
as
$style
)
{
if
(
$styleAttributeValue
==
strtolower
(
$style
))
{
$styleAttributeValue
=
$style
;
return
true
;
}
}
return
false
;
}
/**
* Loads PHPExcel from file into PHPExcel instance
*
* @param string $pFilename
* @param PHPExcel $objPHPExcel
* @return PHPExcel
* @throws PHPExcel_Reader_Exception
*/
public
function
loadIntoExisting
(
$pFilename
,
PHPExcel
$objPHPExcel
)
{
// Check if file exists
if
(
!
file_exists
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! File does not exist."
);
}
$timezoneObj
=
new
DateTimeZone
(
'Europe/London'
);
$GMT
=
new
DateTimeZone
(
'UTC'
);
$zipClass
=
PHPExcel_Settings
::
getZipClass
();
$zip
=
new
$zipClass
;
if
(
!
$zip
->
open
(
$pFilename
))
{
throw
new
PHPExcel_Reader_Exception
(
"Could not open "
.
$pFilename
.
" for reading! Error opening file."
);
}
// echo '<h1>Meta Information</h1>';
$xml
=
simplexml_load_string
(
$zip
->
getFromName
(
"meta.xml"
),
'SimpleXMLElement'
,
PHPExcel_Settings
::
getLibXmlLoaderOptions
());
$namespacesMeta
=
$xml
->
getNamespaces
(
true
);
// echo '<pre>';
// print_r($namespacesMeta);
// echo '</pre><hr />';
$docProps
=
$objPHPExcel
->
getProperties
();
$officeProperty
=
$xml
->
children
(
$namespacesMeta
[
'office'
]);
foreach
(
$officeProperty
as
$officePropertyData
)
{
$officePropertyDC
=
array
();
if
(
isset
(
$namespacesMeta
[
'dc'
]))
{
$officePropertyDC
=
$officePropertyData
->
children
(
$namespacesMeta
[
'dc'
]);
}
foreach
(
$officePropertyDC
as
$propertyName
=>
$propertyValue
)
{
$propertyValue
=
(
string
)
$propertyValue
;
switch
(
$propertyName
)
{
case
'title'
:
$docProps
->
setTitle
(
$propertyValue
);
break
;
case
'subject'
:
$docProps
->
setSubject
(
$propertyValue
);
break
;
case
'creator'
:
$docProps
->
setCreator
(
$propertyValue
);
$docProps
->
setLastModifiedBy
(
$propertyValue
);
break
;
case
'date'
:
$creationDate
=
strtotime
(
$propertyValue
);
$docProps
->
setCreated
(
$creationDate
);
$docProps
->
setModified
(
$creationDate
);
break
;
case
'description'
:
$docProps
->
setDescription
(
$propertyValue
);
break
;
}
}
$officePropertyMeta
=
array
();
if
(
isset
(
$namespacesMeta
[
'dc'
]))
{
$officePropertyMeta
=
$officePropertyData
->
children
(
$namespacesMeta
[
'meta'
]);
}
foreach
(
$officePropertyMeta
as
$propertyName
=>
$propertyValue
)
{
$propertyValueAttributes
=
$propertyValue
->
attributes
(
$namespacesMeta
[
'meta'
]);
$propertyValue
=
(
string
)
$propertyValue
;
switch
(
$propertyName
)
{
case
'initial-creator'
:
$docProps
->
setCreator
(
$propertyValue
);
break
;
case
'keyword'
:
$docProps
->
setKeywords
(
$propertyValue
);
break
;
case
'creation-date'
:
$creationDate
=
strtotime
(
$propertyValue
);
$docProps
->
setCreated
(
$creationDate
);
break
;
case
'user-defined'
:
$propertyValueType
=
PHPExcel_DocumentProperties
::
PROPERTY_TYPE_STRING
;
foreach
(
$propertyValueAttributes
as
$key
=>
$value
)
{
if
(
$key
==
'name'
)
{
$propertyValueName
=
(
string
)
$value
;
}
elseif
(
$key
==
'value-type'
)
{
switch
(
$value
)
{
case
'date'
:
$propertyValue
=
PHPExcel_DocumentProperties
::
convertProperty
(
$propertyValue
,
'date'
);
$propertyValueType
=
PHPExcel_DocumentProperties
::
PROPERTY_TYPE_DATE
;
break
;
case
'boolean'
:
$propertyValue
=
PHPExcel_DocumentProperties
::
convertProperty
(
$propertyValue
,
'bool'
);
$propertyValueType
=
PHPExcel_DocumentProperties
::
PROPERTY_TYPE_BOOLEAN
;
break
;
case
'float'
:
$propertyValue
=
PHPExcel_DocumentProperties
::
convertProperty
(
$propertyValue
,
'r4'
);
$propertyValueType
=
PHPExcel_DocumentProperties
::
PROPERTY_TYPE_FLOAT
;
break
;
default
:
$propertyValueType
=
PHPExcel_DocumentProperties
::
PROPERTY_TYPE_STRING
;
}
}
}
$docProps
->
setCustomProperty
(
$propertyValueName
,
$propertyValue
,
$propertyValueType
);
break
;
}
}
}
// echo '<h1>Workbook Content</h1>';
$xml
=
simplexml_load_string
(
$zip
->
getFromName
(
"content.xml"
),
'SimpleXMLElement'
,
PHPExcel_Settings
::
getLibXmlLoaderOptions
());
$namespacesContent
=
$xml
->
getNamespaces
(
true
);
// echo '<pre>';
// print_r($namespacesContent);
// echo '</pre><hr />';
$workbook
=
$xml
->
children
(
$namespacesContent
[
'office'
]);
foreach
(
$workbook
->
body
->
spreadsheet
as
$workbookData
)
{
$workbookData
=
$workbookData
->
children
(
$namespacesContent
[
'table'
]);
$worksheetID
=
0
;
foreach
(
$workbookData
->
table
as
$worksheetDataSet
)
{
$worksheetData
=
$worksheetDataSet
->
children
(
$namespacesContent
[
'table'
]);
// print_r($worksheetData);
// echo '<br />';
$worksheetDataAttributes
=
$worksheetDataSet
->
attributes
(
$namespacesContent
[
'table'
]);
// print_r($worksheetDataAttributes);
// echo '<br />';
if
((
isset
(
$this
->
_loadSheetsOnly
))
&&
(
isset
(
$worksheetDataAttributes
[
'name'
]))
&&
(
!
in_array
(
$worksheetDataAttributes
[
'name'
],
$this
->
_loadSheetsOnly
)))
{
continue
;
}
// echo '<h2>Worksheet '.$worksheetDataAttributes['name'].'</h2>';
// Create new Worksheet
$objPHPExcel
->
createSheet
();
$objPHPExcel
->
setActiveSheetIndex
(
$worksheetID
);
if
(
isset
(
$worksheetDataAttributes
[
'name'
]))
{
$worksheetName
=
(
string
)
$worksheetDataAttributes
[
'name'
];
// Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in
// formula cells... during the load, all formulae should be correct, and we're simply
// bringing the worksheet name in line with the formula, not the reverse
$objPHPExcel
->
getActiveSheet
()
->
setTitle
(
$worksheetName
,
false
);
}
$rowID
=
1
;
foreach
(
$worksheetData
as
$key
=>
$rowData
)
{
// echo '<b>'.$key.'</b><br />';
switch
(
$key
)
{
case
'table-header-rows'
:
foreach
(
$rowData
as
$key
=>
$cellData
)
{
$rowData
=
$cellData
;
break
;
}
case
'table-row'
:
$rowDataTableAttributes
=
$rowData
->
attributes
(
$namespacesContent
[
'table'
]);
$rowRepeats
=
(
isset
(
$rowDataTableAttributes
[
'number-rows-repeated'
]))
?
$rowDataTableAttributes
[
'number-rows-repeated'
]
:
1
;
$columnID
=
'A'
;
foreach
(
$rowData
as
$key
=>
$cellData
)
{
if
(
$this
->
getReadFilter
()
!==
NULL
)
{
if
(
!
$this
->
getReadFilter
()
->
readCell
(
$columnID
,
$rowID
,
$worksheetName
))
{
continue
;
}
}
// echo '<b>'.$columnID.$rowID.'</b><br />';
$cellDataText
=
(
isset
(
$namespacesContent
[
'text'
]))
?
$cellData
->
children
(
$namespacesContent
[
'text'
])
:
''
;
$cellDataOffice
=
$cellData
->
children
(
$namespacesContent
[
'office'
]);
$cellDataOfficeAttributes
=
$cellData
->
attributes
(
$namespacesContent
[
'office'
]);
$cellDataTableAttributes
=
$cellData
->
attributes
(
$namespacesContent
[
'table'
]);
// echo 'Office Attributes: ';
// print_r($cellDataOfficeAttributes);
// echo '<br />Table Attributes: ';
// print_r($cellDataTableAttributes);
// echo '<br />Cell Data Text';
// print_r($cellDataText);
// echo '<br />';
//
$type
=
$formatting
=
$hyperlink
=
null
;
$hasCalculatedValue
=
false
;
$cellDataFormula
=
''
;
if
(
isset
(
$cellDataTableAttributes
[
'formula'
]))
{
$cellDataFormula
=
$cellDataTableAttributes
[
'formula'
];
$hasCalculatedValue
=
true
;
}
if
(
isset
(
$cellDataOffice
->
annotation
))
{
// echo 'Cell has comment<br />';
$annotationText
=
$cellDataOffice
->
annotation
->
children
(
$namespacesContent
[
'text'
]);
$textArray
=
array
();
foreach
(
$annotationText
as
$t
)
{
foreach
(
$t
->
span
as
$text
)
{
$textArray
[]
=
(
string
)
$text
;
}
}
$text
=
implode
(
"
\n
"
,
$textArray
);
// echo $text,'<br />';
$objPHPExcel
->
getActiveSheet
()
->
getComment
(
$columnID
.
$rowID
)
// ->setAuthor( $author )
->
setText
(
$this
->
_parseRichText
(
$text
)
);
}
if
(
isset
(
$cellDataText
->
p
))
{
// Consolidate if there are multiple p records (maybe with spans as well)
$dataArray
=
array
();
// Text can have multiple text:p and within those, multiple text:span.
// text:p newlines, but text:span does not.
// Also, here we assume there is no text data is span fields are specified, since
// we have no way of knowing proper positioning anyway.
foreach
(
$cellDataText
->
p
as
$pData
)
{
if
(
isset
(
$pData
->
span
))
{
// span sections do not newline, so we just create one large string here
$spanSection
=
""
;
foreach
(
$pData
->
span
as
$spanData
)
{
$spanSection
.
=
$spanData
;
}
array_push
(
$dataArray
,
$spanSection
);
}
else
{
array_push
(
$dataArray
,
$pData
);
}
}
$allCellDataText
=
implode
(
$dataArray
,
"
\n
"
);
// echo 'Value Type is '.$cellDataOfficeAttributes['value-type'].'<br />';
switch
(
$cellDataOfficeAttributes
[
'value-type'
])
{
case
'string'
:
$type
=
PHPExcel_Cell_DataType
::
TYPE_STRING
;
$dataValue
=
$allCellDataText
;
if
(
isset
(
$dataValue
->
a
))
{
$dataValue
=
$dataValue
->
a
;
$cellXLinkAttributes
=
$dataValue
->
attributes
(
$namespacesContent
[
'xlink'
]);
$hyperlink
=
$cellXLinkAttributes
[
'href'
];
}
break
;
case
'boolean'
:
$type
=
PHPExcel_Cell_DataType
::
TYPE_BOOL
;
$dataValue
=
(
$allCellDataText
==
'TRUE'
)
?
True
:
False
;
break
;
case
'percentage'
:
$type
=
PHPExcel_Cell_DataType
::
TYPE_NUMERIC
;
$dataValue
=
(
float
)
$cellDataOfficeAttributes
[
'value'
];
if
(
floor
(
$dataValue
)
==
$dataValue
)
{
$dataValue
=
(
integer
)
$dataValue
;
}
$formatting
=
PHPExcel_Style_NumberFormat
::
FORMAT_PERCENTAGE_00
;
break
;
case
'currency'
:
$type
=
PHPExcel_Cell_DataType
::
TYPE_NUMERIC
;
$dataValue
=
(
float
)
$cellDataOfficeAttributes
[
'value'
];
if
(
floor
(
$dataValue
)
==
$dataValue
)
{
$dataValue
=
(
integer
)
$dataValue
;
}
$formatting
=
PHPExcel_Style_NumberFormat
::
FORMAT_CURRENCY_USD_SIMPLE
;
break
;
case
'float'
:
$type
=
PHPExcel_Cell_DataType
::
TYPE_NUMERIC
;
$dataValue
=
(
float
)
$cellDataOfficeAttributes
[
'value'
];
if
(
floor
(
$dataValue
)
==
$dataValue
)
{
if
(
$dataValue
==
(
integer
)
$dataValue
)
$dataValue
=
(
integer
)
$dataValue
;
else
$dataValue
=
(
float
)
$dataValue
;
}
break
;
case
'date'
:
$type
=
PHPExcel_Cell_DataType
::
TYPE_NUMERIC
;
$dateObj
=
new
DateTime
(
$cellDataOfficeAttributes
[
'date-value'
],
$GMT
);
$dateObj
->
setTimeZone
(
$timezoneObj
);
list
(
$year
,
$month
,
$day
,
$hour
,
$minute
,
$second
)
=
explode
(
' '
,
$dateObj
->
format
(
'Y m d H i s'
));
$dataValue
=
PHPExcel_Shared_Date
::
FormattedPHPToExcel
(
$year
,
$month
,
$day
,
$hour
,
$minute
,
$second
);
if
(
$dataValue
!=
floor
(
$dataValue
))
{
$formatting
=
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_XLSX15
.
' '
.
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_TIME4
;
}
else
{
$formatting
=
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_XLSX15
;
}
break
;
case
'time'
:
$type
=
PHPExcel_Cell_DataType
::
TYPE_NUMERIC
;
$dataValue
=
PHPExcel_Shared_Date
::
PHPToExcel
(
strtotime
(
'01-01-1970 '
.
implode
(
':'
,
sscanf
(
$cellDataOfficeAttributes
[
'time-value'
],
'PT%dH%dM%dS'
))));
$formatting
=
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_TIME4
;
break
;
}
// echo 'Data value is '.$dataValue.'<br />';
// if ($hyperlink !== NULL) {
// echo 'Hyperlink is '.$hyperlink.'<br />';
// }
}
else
{
$type
=
PHPExcel_Cell_DataType
::
TYPE_NULL
;
$dataValue
=
NULL
;
}
if
(
$hasCalculatedValue
)
{
$type
=
PHPExcel_Cell_DataType
::
TYPE_FORMULA
;
// echo 'Formula: ', $cellDataFormula, PHP_EOL;
$cellDataFormula
=
substr
(
$cellDataFormula
,
strpos
(
$cellDataFormula
,
':='
)
+
1
);
$temp
=
explode
(
'"'
,
$cellDataFormula
);
$tKey
=
false
;
foreach
(
$temp
as
&
$value
)
{
// Only replace in alternate array entries (i.e. non-quoted blocks)
if
(
$tKey
=
!
$tKey
)
{
$value
=
preg_replace
(
'/\[([^\.]+)\.([^\.]+):\.([^\.]+)\]/Ui'
,
'$1!$2:$3'
,
$value
);
// Cell range reference in another sheet
$value
=
preg_replace
(
'/\[([^\.]+)\.([^\.]+)\]/Ui'
,
'$1!$2'
,
$value
);
// Cell reference in another sheet
$value
=
preg_replace
(
'/\[\.([^\.]+):\.([^\.]+)\]/Ui'
,
'$1:$2'
,
$value
);
// Cell range reference
$value
=
preg_replace
(
'/\[\.([^\.]+)\]/Ui'
,
'$1'
,
$value
);
// Simple cell reference
$value
=
PHPExcel_Calculation
::
_translateSeparator
(
';'
,
','
,
$value
,
$inBraces
);
}
}
unset
(
$value
);
// Then rebuild the formula string
$cellDataFormula
=
implode
(
'"'
,
$temp
);
// echo 'Adjusted Formula: ', $cellDataFormula, PHP_EOL;
}
$colRepeats
=
(
isset
(
$cellDataTableAttributes
[
'number-columns-repeated'
]))
?
$cellDataTableAttributes
[
'number-columns-repeated'
]
:
1
;
if
(
$type
!==
NULL
)
{
for
(
$i
=
0
;
$i
<
$colRepeats
;
++
$i
)
{
if
(
$i
>
0
)
{
++
$columnID
;
}
if
(
$type
!==
PHPExcel_Cell_DataType
::
TYPE_NULL
)
{
for
(
$rowAdjust
=
0
;
$rowAdjust
<
$rowRepeats
;
++
$rowAdjust
)
{
$rID
=
$rowID
+
$rowAdjust
;
$objPHPExcel
->
getActiveSheet
()
->
getCell
(
$columnID
.
$rID
)
->
setValueExplicit
(((
$hasCalculatedValue
)
?
$cellDataFormula
:
$dataValue
),
$type
);
if
(
$hasCalculatedValue
)
{
// echo 'Forumla result is '.$dataValue.'<br />';
$objPHPExcel
->
getActiveSheet
()
->
getCell
(
$columnID
.
$rID
)
->
setCalculatedValue
(
$dataValue
);
}
if
(
$formatting
!==
NULL
)
{
$objPHPExcel
->
getActiveSheet
()
->
getStyle
(
$columnID
.
$rID
)
->
getNumberFormat
()
->
setFormatCode
(
$formatting
);
}
else
{
$objPHPExcel
->
getActiveSheet
()
->
getStyle
(
$columnID
.
$rID
)
->
getNumberFormat
()
->
setFormatCode
(
PHPExcel_Style_NumberFormat
::
FORMAT_GENERAL
);
}
if
(
$hyperlink
!==
NULL
)
{
$objPHPExcel
->
getActiveSheet
()
->
getCell
(
$columnID
.
$rID
)
->
getHyperlink
()
->
setUrl
(
$hyperlink
);
}
}
}
}
}
// Merged cells
if
((
isset
(
$cellDataTableAttributes
[
'number-columns-spanned'
]))
||
(
isset
(
$cellDataTableAttributes
[
'number-rows-spanned'
])))
{
if
((
$type
!==
PHPExcel_Cell_DataType
::
TYPE_NULL
)
||
(
!
$this
->
_readDataOnly
))
{
$columnTo
=
$columnID
;
if
(
isset
(
$cellDataTableAttributes
[
'number-columns-spanned'
]))
{
$columnTo
=
PHPExcel_Cell
::
stringFromColumnIndex
(
PHPExcel_Cell
::
columnIndexFromString
(
$columnID
)
+
$cellDataTableAttributes
[
'number-columns-spanned'
]
-
2
);
}
$rowTo
=
$rowID
;
if
(
isset
(
$cellDataTableAttributes
[
'number-rows-spanned'
]))
{
$rowTo
=
$rowTo
+
$cellDataTableAttributes
[
'number-rows-spanned'
]
-
1
;
}
$cellRange
=
$columnID
.
$rowID
.
':'
.
$columnTo
.
$rowTo
;
$objPHPExcel
->
getActiveSheet
()
->
mergeCells
(
$cellRange
);
}
}
++
$columnID
;
}
$rowID
+=
$rowRepeats
;
break
;
}
}
++
$worksheetID
;
}
}
// Return
return
$objPHPExcel
;
}
private
function
_parseRichText
(
$is
=
''
)
{
$value
=
new
PHPExcel_RichText
();
$value
->
createText
(
$is
);
return
$value
;
}
}
lib/Classes/PHPExcel/Reader/SYLK.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/** PHPExcel root directory */
if
(
!
defined
(
'PHPEXCEL_ROOT'
))
{
/**
* @ignore
*/
define
(
'PHPEXCEL_ROOT'
,
dirname
(
__FILE__
)
.
'/../../'
);
require
(
PHPEXCEL_ROOT
.
'PHPExcel/Autoloader.php'
);
}
/**
* PHPExcel_Reader_SYLK
*
* @category PHPExcel
* @package PHPExcel_Reader
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Reader_SYLK
extends
PHPExcel_Reader_Abstract
implements
PHPExcel_Reader_IReader
{
/**
* Input encoding
*
* @var string
*/
private
$_inputEncoding
=
'ANSI'
;
/**
* Sheet index to read
*
* @var int
*/
private
$_sheetIndex
=
0
;
/**
* Formats
*
* @var array
*/
private
$_formats
=
array
();
/**
* Format Count
*
* @var int
*/
private
$_format
=
0
;
/**
* Create a new PHPExcel_Reader_SYLK
*/
public
function
__construct
()
{
$this
->
_readFilter
=
new
PHPExcel_Reader_DefaultReadFilter
();
}
/**
* Validate that the current file is a SYLK file
*
* @return boolean
*/
protected
function
_isValidFormat
()
{
// Read sample data (first 2 KB will do)
$data
=
fread
(
$this
->
_fileHandle
,
2048
);
// Count delimiters in file
$delimiterCount
=
substr_count
(
$data
,
';'
);
if
(
$delimiterCount
<
1
)
{
return
FALSE
;
}
// Analyze first line looking for ID; signature
$lines
=
explode
(
"
\n
"
,
$data
);
if
(
substr
(
$lines
[
0
],
0
,
4
)
!=
'ID;P'
)
{
return
FALSE
;
}
return
TRUE
;
}
/**
* Set input encoding
*
* @param string $pValue Input encoding
*/
public
function
setInputEncoding
(
$pValue
=
'ANSI'
)
{
$this
->
_inputEncoding
=
$pValue
;
return
$this
;
}
/**
* Get input encoding
*
* @return string
*/
public
function
getInputEncoding
()
{
return
$this
->
_inputEncoding
;
}
/**
* Return worksheet info (Name, Last Column Letter, Last Column Index, Total Rows, Total Columns)
*
* @param string $pFilename
* @throws PHPExcel_Reader_Exception
*/
public
function
listWorksheetInfo
(
$pFilename
)
{
// Open file
$this
->
_openFile
(
$pFilename
);
if
(
!
$this
->
_isValidFormat
())
{
fclose
(
$this
->
_fileHandle
);
throw
new
PHPExcel_Reader_Exception
(
$pFilename
.
" is an Invalid Spreadsheet file."
);
}
$fileHandle
=
$this
->
_fileHandle
;
rewind
(
$fileHandle
);
$worksheetInfo
=
array
();
$worksheetInfo
[
0
][
'worksheetName'
]
=
'Worksheet'
;
$worksheetInfo
[
0
][
'lastColumnLetter'
]
=
'A'
;
$worksheetInfo
[
0
][
'lastColumnIndex'
]
=
0
;
$worksheetInfo
[
0
][
'totalRows'
]
=
0
;
$worksheetInfo
[
0
][
'totalColumns'
]
=
0
;
// Loop through file
$rowData
=
array
();
// loop through one row (line) at a time in the file
$rowIndex
=
0
;
while
((
$rowData
=
fgets
(
$fileHandle
))
!==
FALSE
)
{
$columnIndex
=
0
;
// convert SYLK encoded $rowData to UTF-8
$rowData
=
PHPExcel_Shared_String
::
SYLKtoUTF8
(
$rowData
);
// explode each row at semicolons while taking into account that literal semicolon (;)
// is escaped like this (;;)
$rowData
=
explode
(
"
\t
"
,
str_replace
(
'¤'
,
';'
,
str_replace
(
';'
,
"
\t
"
,
str_replace
(
';;'
,
'¤'
,
rtrim
(
$rowData
)))));
$dataType
=
array_shift
(
$rowData
);
if
(
$dataType
==
'C'
)
{
// Read cell value data
foreach
(
$rowData
as
$rowDatum
)
{
switch
(
$rowDatum
{
0
})
{
case
'C'
:
case
'X'
:
$columnIndex
=
substr
(
$rowDatum
,
1
)
-
1
;
break
;
case
'R'
:
case
'Y'
:
$rowIndex
=
substr
(
$rowDatum
,
1
);
break
;
}
$worksheetInfo
[
0
][
'totalRows'
]
=
max
(
$worksheetInfo
[
0
][
'totalRows'
],
$rowIndex
);
$worksheetInfo
[
0
][
'lastColumnIndex'
]
=
max
(
$worksheetInfo
[
0
][
'lastColumnIndex'
],
$columnIndex
);
}
}
}
$worksheetInfo
[
0
][
'lastColumnLetter'
]
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$worksheetInfo
[
0
][
'lastColumnIndex'
]);
$worksheetInfo
[
0
][
'totalColumns'
]
=
$worksheetInfo
[
0
][
'lastColumnIndex'
]
+
1
;
// Close file
fclose
(
$fileHandle
);
return
$worksheetInfo
;
}
/**
* Loads PHPExcel from file
*
* @param string $pFilename
* @return PHPExcel
* @throws PHPExcel_Reader_Exception
*/
public
function
load
(
$pFilename
)
{
// Create new PHPExcel
$objPHPExcel
=
new
PHPExcel
();
// Load into this instance
return
$this
->
loadIntoExisting
(
$pFilename
,
$objPHPExcel
);
}
/**
* Loads PHPExcel from file into PHPExcel instance
*
* @param string $pFilename
* @param PHPExcel $objPHPExcel
* @return PHPExcel
* @throws PHPExcel_Reader_Exception
*/
public
function
loadIntoExisting
(
$pFilename
,
PHPExcel
$objPHPExcel
)
{
// Open file
$this
->
_openFile
(
$pFilename
);
if
(
!
$this
->
_isValidFormat
())
{
fclose
(
$this
->
_fileHandle
);
throw
new
PHPExcel_Reader_Exception
(
$pFilename
.
" is an Invalid Spreadsheet file."
);
}
$fileHandle
=
$this
->
_fileHandle
;
rewind
(
$fileHandle
);
// Create new PHPExcel
while
(
$objPHPExcel
->
getSheetCount
()
<=
$this
->
_sheetIndex
)
{
$objPHPExcel
->
createSheet
();
}
$objPHPExcel
->
setActiveSheetIndex
(
$this
->
_sheetIndex
);
$fromFormats
=
array
(
'\-'
,
'\ '
);
$toFormats
=
array
(
'-'
,
' '
);
// Loop through file
$rowData
=
array
();
$column
=
$row
=
''
;
// loop through one row (line) at a time in the file
while
((
$rowData
=
fgets
(
$fileHandle
))
!==
FALSE
)
{
// convert SYLK encoded $rowData to UTF-8
$rowData
=
PHPExcel_Shared_String
::
SYLKtoUTF8
(
$rowData
);
// explode each row at semicolons while taking into account that literal semicolon (;)
// is escaped like this (;;)
$rowData
=
explode
(
"
\t
"
,
str_replace
(
'¤'
,
';'
,
str_replace
(
';'
,
"
\t
"
,
str_replace
(
';;'
,
'¤'
,
rtrim
(
$rowData
)))));
$dataType
=
array_shift
(
$rowData
);
// Read shared styles
if
(
$dataType
==
'P'
)
{
$formatArray
=
array
();
foreach
(
$rowData
as
$rowDatum
)
{
switch
(
$rowDatum
{
0
})
{
case
'P'
:
$formatArray
[
'numberformat'
][
'code'
]
=
str_replace
(
$fromFormats
,
$toFormats
,
substr
(
$rowDatum
,
1
));
break
;
case
'E'
:
case
'F'
:
$formatArray
[
'font'
][
'name'
]
=
substr
(
$rowDatum
,
1
);
break
;
case
'L'
:
$formatArray
[
'font'
][
'size'
]
=
substr
(
$rowDatum
,
1
);
break
;
case
'S'
:
$styleSettings
=
substr
(
$rowDatum
,
1
);
for
(
$i
=
0
;
$i
<
strlen
(
$styleSettings
);
++
$i
)
{
switch
(
$styleSettings
{
$i
})
{
case
'I'
:
$formatArray
[
'font'
][
'italic'
]
=
true
;
break
;
case
'D'
:
$formatArray
[
'font'
][
'bold'
]
=
true
;
break
;
case
'T'
:
$formatArray
[
'borders'
][
'top'
][
'style'
]
=
PHPExcel_Style_Border
::
BORDER_THIN
;
break
;
case
'B'
:
$formatArray
[
'borders'
][
'bottom'
][
'style'
]
=
PHPExcel_Style_Border
::
BORDER_THIN
;
break
;
case
'L'
:
$formatArray
[
'borders'
][
'left'
][
'style'
]
=
PHPExcel_Style_Border
::
BORDER_THIN
;
break
;
case
'R'
:
$formatArray
[
'borders'
][
'right'
][
'style'
]
=
PHPExcel_Style_Border
::
BORDER_THIN
;
break
;
}
}
break
;
}
}
$this
->
_formats
[
'P'
.
$this
->
_format
++
]
=
$formatArray
;
// Read cell value data
}
elseif
(
$dataType
==
'C'
)
{
$hasCalculatedValue
=
false
;
$cellData
=
$cellDataFormula
=
''
;
foreach
(
$rowData
as
$rowDatum
)
{
switch
(
$rowDatum
{
0
})
{
case
'C'
:
case
'X'
:
$column
=
substr
(
$rowDatum
,
1
);
break
;
case
'R'
:
case
'Y'
:
$row
=
substr
(
$rowDatum
,
1
);
break
;
case
'K'
:
$cellData
=
substr
(
$rowDatum
,
1
);
break
;
case
'E'
:
$cellDataFormula
=
'='
.
substr
(
$rowDatum
,
1
);
// Convert R1C1 style references to A1 style references (but only when not quoted)
$temp
=
explode
(
'"'
,
$cellDataFormula
);
$key
=
false
;
foreach
(
$temp
as
&
$value
)
{
// Only count/replace in alternate array entries
if
(
$key
=
!
$key
)
{
preg_match_all
(
'/(R(\[?-?\d*\]?))(C(\[?-?\d*\]?))/'
,
$value
,
$cellReferences
,
PREG_SET_ORDER
+
PREG_OFFSET_CAPTURE
);
// Reverse the matches array, otherwise all our offsets will become incorrect if we modify our way
// through the formula from left to right. Reversing means that we work right to left.through
// the formula
$cellReferences
=
array_reverse
(
$cellReferences
);
// Loop through each R1C1 style reference in turn, converting it to its A1 style equivalent,
// then modify the formula to use that new reference
foreach
(
$cellReferences
as
$cellReference
)
{
$rowReference
=
$cellReference
[
2
][
0
];
// Empty R reference is the current row
if
(
$rowReference
==
''
)
$rowReference
=
$row
;
// Bracketed R references are relative to the current row
if
(
$rowReference
{
0
}
==
'['
)
$rowReference
=
$row
+
trim
(
$rowReference
,
'[]'
);
$columnReference
=
$cellReference
[
4
][
0
];
// Empty C reference is the current column
if
(
$columnReference
==
''
)
$columnReference
=
$column
;
// Bracketed C references are relative to the current column
if
(
$columnReference
{
0
}
==
'['
)
$columnReference
=
$column
+
trim
(
$columnReference
,
'[]'
);
$A1CellReference
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$columnReference
-
1
)
.
$rowReference
;
$value
=
substr_replace
(
$value
,
$A1CellReference
,
$cellReference
[
0
][
1
],
strlen
(
$cellReference
[
0
][
0
]));
}
}
}
unset
(
$value
);
// Then rebuild the formula string
$cellDataFormula
=
implode
(
'"'
,
$temp
);
$hasCalculatedValue
=
true
;
break
;
}
}
$columnLetter
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$column
-
1
);
$cellData
=
PHPExcel_Calculation
::
_unwrapResult
(
$cellData
);
// Set cell value
$objPHPExcel
->
getActiveSheet
()
->
getCell
(
$columnLetter
.
$row
)
->
setValue
((
$hasCalculatedValue
)
?
$cellDataFormula
:
$cellData
);
if
(
$hasCalculatedValue
)
{
$cellData
=
PHPExcel_Calculation
::
_unwrapResult
(
$cellData
);
$objPHPExcel
->
getActiveSheet
()
->
getCell
(
$columnLetter
.
$row
)
->
setCalculatedValue
(
$cellData
);
}
// Read cell formatting
}
elseif
(
$dataType
==
'F'
)
{
$formatStyle
=
$columnWidth
=
$styleSettings
=
''
;
$styleData
=
array
();
foreach
(
$rowData
as
$rowDatum
)
{
switch
(
$rowDatum
{
0
})
{
case
'C'
:
case
'X'
:
$column
=
substr
(
$rowDatum
,
1
);
break
;
case
'R'
:
case
'Y'
:
$row
=
substr
(
$rowDatum
,
1
);
break
;
case
'P'
:
$formatStyle
=
$rowDatum
;
break
;
case
'W'
:
list
(
$startCol
,
$endCol
,
$columnWidth
)
=
explode
(
' '
,
substr
(
$rowDatum
,
1
));
break
;
case
'S'
:
$styleSettings
=
substr
(
$rowDatum
,
1
);
for
(
$i
=
0
;
$i
<
strlen
(
$styleSettings
);
++
$i
)
{
switch
(
$styleSettings
{
$i
})
{
case
'I'
:
$styleData
[
'font'
][
'italic'
]
=
true
;
break
;
case
'D'
:
$styleData
[
'font'
][
'bold'
]
=
true
;
break
;
case
'T'
:
$styleData
[
'borders'
][
'top'
][
'style'
]
=
PHPExcel_Style_Border
::
BORDER_THIN
;
break
;
case
'B'
:
$styleData
[
'borders'
][
'bottom'
][
'style'
]
=
PHPExcel_Style_Border
::
BORDER_THIN
;
break
;
case
'L'
:
$styleData
[
'borders'
][
'left'
][
'style'
]
=
PHPExcel_Style_Border
::
BORDER_THIN
;
break
;
case
'R'
:
$styleData
[
'borders'
][
'right'
][
'style'
]
=
PHPExcel_Style_Border
::
BORDER_THIN
;
break
;
}
}
break
;
}
}
if
((
$formatStyle
>
''
)
&&
(
$column
>
''
)
&&
(
$row
>
''
))
{
$columnLetter
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$column
-
1
);
if
(
isset
(
$this
->
_formats
[
$formatStyle
]))
{
$objPHPExcel
->
getActiveSheet
()
->
getStyle
(
$columnLetter
.
$row
)
->
applyFromArray
(
$this
->
_formats
[
$formatStyle
]);
}
}
if
((
!
empty
(
$styleData
))
&&
(
$column
>
''
)
&&
(
$row
>
''
))
{
$columnLetter
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$column
-
1
);
$objPHPExcel
->
getActiveSheet
()
->
getStyle
(
$columnLetter
.
$row
)
->
applyFromArray
(
$styleData
);
}
if
(
$columnWidth
>
''
)
{
if
(
$startCol
==
$endCol
)
{
$startCol
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$startCol
-
1
);
$objPHPExcel
->
getActiveSheet
()
->
getColumnDimension
(
$startCol
)
->
setWidth
(
$columnWidth
);
}
else
{
$startCol
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$startCol
-
1
);
$endCol
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$endCol
-
1
);
$objPHPExcel
->
getActiveSheet
()
->
getColumnDimension
(
$startCol
)
->
setWidth
(
$columnWidth
);
do
{
$objPHPExcel
->
getActiveSheet
()
->
getColumnDimension
(
++
$startCol
)
->
setWidth
(
$columnWidth
);
}
while
(
$startCol
!=
$endCol
);
}
}
}
else
{
foreach
(
$rowData
as
$rowDatum
)
{
switch
(
$rowDatum
{
0
})
{
case
'C'
:
case
'X'
:
$column
=
substr
(
$rowDatum
,
1
);
break
;
case
'R'
:
case
'Y'
:
$row
=
substr
(
$rowDatum
,
1
);
break
;
}
}
}
}
// Close file
fclose
(
$fileHandle
);
// Return
return
$objPHPExcel
;
}
/**
* Get sheet index
*
* @return int
*/
public
function
getSheetIndex
()
{
return
$this
->
_sheetIndex
;
}
/**
* Set sheet index
*
* @param int $pValue Sheet index
* @return PHPExcel_Reader_SYLK
*/
public
function
setSheetIndex
(
$pValue
=
0
)
{
$this
->
_sheetIndex
=
$pValue
;
return
$this
;
}
}
lib/Classes/PHPExcel/ReferenceHelper.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_ReferenceHelper (Singleton)
*
* @category PHPExcel
* @package PHPExcel
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_ReferenceHelper
{
/** Constants */
/** Regular Expressions */
const
REFHELPER_REGEXP_CELLREF
=
'((\w*|\'[^!]*\')!)?(?<![:a-z\$])(\$?[a-z]{1,3}\$?\d+)(?=[^:!\d\'])'
;
const
REFHELPER_REGEXP_CELLRANGE
=
'((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}\$?\d+):(\$?[a-z]{1,3}\$?\d+)'
;
const
REFHELPER_REGEXP_ROWRANGE
=
'((\w*|\'[^!]*\')!)?(\$?\d+):(\$?\d+)'
;
const
REFHELPER_REGEXP_COLRANGE
=
'((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}):(\$?[a-z]{1,3})'
;
/**
* Instance of this class
*
* @var PHPExcel_ReferenceHelper
*/
private
static
$_instance
;
/**
* Get an instance of this class
*
* @return PHPExcel_ReferenceHelper
*/
public
static
function
getInstance
()
{
if
(
!
isset
(
self
::
$_instance
)
||
(
self
::
$_instance
===
NULL
))
{
self
::
$_instance
=
new
PHPExcel_ReferenceHelper
();
}
return
self
::
$_instance
;
}
/**
* Create a new PHPExcel_ReferenceHelper
*/
protected
function
__construct
()
{
}
/**
* Compare two column addresses
* Intended for use as a Callback function for sorting column addresses by column
*
* @param string $a First column to test (e.g. 'AA')
* @param string $b Second column to test (e.g. 'Z')
* @return integer
*/
public
static
function
columnSort
(
$a
,
$b
)
{
return
strcasecmp
(
strlen
(
$a
)
.
$a
,
strlen
(
$b
)
.
$b
);
}
/**
* Compare two column addresses
* Intended for use as a Callback function for reverse sorting column addresses by column
*
* @param string $a First column to test (e.g. 'AA')
* @param string $b Second column to test (e.g. 'Z')
* @return integer
*/
public
static
function
columnReverseSort
(
$a
,
$b
)
{
return
1
-
strcasecmp
(
strlen
(
$a
)
.
$a
,
strlen
(
$b
)
.
$b
);
}
/**
* Compare two cell addresses
* Intended for use as a Callback function for sorting cell addresses by column and row
*
* @param string $a First cell to test (e.g. 'AA1')
* @param string $b Second cell to test (e.g. 'Z1')
* @return integer
*/
public
static
function
cellSort
(
$a
,
$b
)
{
sscanf
(
$a
,
'%[A-Z]%d'
,
$ac
,
$ar
);
sscanf
(
$b
,
'%[A-Z]%d'
,
$bc
,
$br
);
if
(
$ar
==
$br
)
{
return
strcasecmp
(
strlen
(
$ac
)
.
$ac
,
strlen
(
$bc
)
.
$bc
);
}
return
(
$ar
<
$br
)
?
-
1
:
1
;
}
/**
* Compare two cell addresses
* Intended for use as a Callback function for sorting cell addresses by column and row
*
* @param string $a First cell to test (e.g. 'AA1')
* @param string $b Second cell to test (e.g. 'Z1')
* @return integer
*/
public
static
function
cellReverseSort
(
$a
,
$b
)
{
sscanf
(
$a
,
'%[A-Z]%d'
,
$ac
,
$ar
);
sscanf
(
$b
,
'%[A-Z]%d'
,
$bc
,
$br
);
if
(
$ar
==
$br
)
{
return
1
-
strcasecmp
(
strlen
(
$ac
)
.
$ac
,
strlen
(
$bc
)
.
$bc
);
}
return
(
$ar
<
$br
)
?
1
:
-
1
;
}
/**
* Test whether a cell address falls within a defined range of cells
*
* @param string $cellAddress Address of the cell we're testing
* @param integer $beforeRow Number of the row we're inserting/deleting before
* @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion)
* @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before
* @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion)
* @return boolean
*/
private
static
function
cellAddressInDeleteRange
(
$cellAddress
,
$beforeRow
,
$pNumRows
,
$beforeColumnIndex
,
$pNumCols
)
{
list
(
$cellColumn
,
$cellRow
)
=
PHPExcel_Cell
::
coordinateFromString
(
$cellAddress
);
$cellColumnIndex
=
PHPExcel_Cell
::
columnIndexFromString
(
$cellColumn
);
// Is cell within the range of rows/columns if we're deleting
if
(
$pNumRows
<
0
&&
(
$cellRow
>=
(
$beforeRow
+
$pNumRows
))
&&
(
$cellRow
<
$beforeRow
))
{
return
TRUE
;
}
elseif
(
$pNumCols
<
0
&&
(
$cellColumnIndex
>=
(
$beforeColumnIndex
+
$pNumCols
))
&&
(
$cellColumnIndex
<
$beforeColumnIndex
))
{
return
TRUE
;
}
return
FALSE
;
}
/**
* Update page breaks when inserting/deleting rows/columns
*
* @param PHPExcel_Worksheet $pSheet The worksheet that we're editing
* @param string $pBefore Insert/Delete before this cell address (e.g. 'A1')
* @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before
* @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion)
* @param integer $beforeRow Number of the row we're inserting/deleting before
* @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion)
*/
protected
function
_adjustPageBreaks
(
PHPExcel_Worksheet
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
)
{
$aBreaks
=
$pSheet
->
getBreaks
();
(
$pNumCols
>
0
||
$pNumRows
>
0
)
?
uksort
(
$aBreaks
,
array
(
'PHPExcel_ReferenceHelper'
,
'cellReverseSort'
))
:
uksort
(
$aBreaks
,
array
(
'PHPExcel_ReferenceHelper'
,
'cellSort'
));
foreach
(
$aBreaks
as
$key
=>
$value
)
{
if
(
self
::
cellAddressInDeleteRange
(
$key
,
$beforeRow
,
$pNumRows
,
$beforeColumnIndex
,
$pNumCols
))
{
// If we're deleting, then clear any defined breaks that are within the range
// of rows/columns that we're deleting
$pSheet
->
setBreak
(
$key
,
PHPExcel_Worksheet
::
BREAK_NONE
);
}
else
{
// Otherwise update any affected breaks by inserting a new break at the appropriate point
// and removing the old affected break
$newReference
=
$this
->
updateCellReference
(
$key
,
$pBefore
,
$pNumCols
,
$pNumRows
);
if
(
$key
!=
$newReference
)
{
$pSheet
->
setBreak
(
$newReference
,
$value
)
->
setBreak
(
$key
,
PHPExcel_Worksheet
::
BREAK_NONE
);
}
}
}
}
/**
* Update cell comments when inserting/deleting rows/columns
*
* @param PHPExcel_Worksheet $pSheet The worksheet that we're editing
* @param string $pBefore Insert/Delete before this cell address (e.g. 'A1')
* @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before
* @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion)
* @param integer $beforeRow Number of the row we're inserting/deleting before
* @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion)
*/
protected
function
_adjustComments
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
)
{
$aComments
=
$pSheet
->
getComments
();
$aNewComments
=
array
();
// the new array of all comments
foreach
(
$aComments
as
$key
=>
&
$value
)
{
// Any comments inside a deleted range will be ignored
if
(
!
self
::
cellAddressInDeleteRange
(
$key
,
$beforeRow
,
$pNumRows
,
$beforeColumnIndex
,
$pNumCols
))
{
// Otherwise build a new array of comments indexed by the adjusted cell reference
$newReference
=
$this
->
updateCellReference
(
$key
,
$pBefore
,
$pNumCols
,
$pNumRows
);
$aNewComments
[
$newReference
]
=
$value
;
}
}
// Replace the comments array with the new set of comments
$pSheet
->
setComments
(
$aNewComments
);
}
/**
* Update hyperlinks when inserting/deleting rows/columns
*
* @param PHPExcel_Worksheet $pSheet The worksheet that we're editing
* @param string $pBefore Insert/Delete before this cell address (e.g. 'A1')
* @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before
* @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion)
* @param integer $beforeRow Number of the row we're inserting/deleting before
* @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion)
*/
protected
function
_adjustHyperlinks
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
)
{
$aHyperlinkCollection
=
$pSheet
->
getHyperlinkCollection
();
(
$pNumCols
>
0
||
$pNumRows
>
0
)
?
uksort
(
$aHyperlinkCollection
,
array
(
'PHPExcel_ReferenceHelper'
,
'cellReverseSort'
))
:
uksort
(
$aHyperlinkCollection
,
array
(
'PHPExcel_ReferenceHelper'
,
'cellSort'
));
foreach
(
$aHyperlinkCollection
as
$key
=>
$value
)
{
$newReference
=
$this
->
updateCellReference
(
$key
,
$pBefore
,
$pNumCols
,
$pNumRows
);
if
(
$key
!=
$newReference
)
{
$pSheet
->
setHyperlink
(
$newReference
,
$value
);
$pSheet
->
setHyperlink
(
$key
,
null
);
}
}
}
/**
* Update data validations when inserting/deleting rows/columns
*
* @param PHPExcel_Worksheet $pSheet The worksheet that we're editing
* @param string $pBefore Insert/Delete before this cell address (e.g. 'A1')
* @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before
* @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion)
* @param integer $beforeRow Number of the row we're inserting/deleting before
* @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion)
*/
protected
function
_adjustDataValidations
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
)
{
$aDataValidationCollection
=
$pSheet
->
getDataValidationCollection
();
(
$pNumCols
>
0
||
$pNumRows
>
0
)
?
uksort
(
$aDataValidationCollection
,
array
(
'PHPExcel_ReferenceHelper'
,
'cellReverseSort'
))
:
uksort
(
$aDataValidationCollection
,
array
(
'PHPExcel_ReferenceHelper'
,
'cellSort'
));
foreach
(
$aDataValidationCollection
as
$key
=>
$value
)
{
$newReference
=
$this
->
updateCellReference
(
$key
,
$pBefore
,
$pNumCols
,
$pNumRows
);
if
(
$key
!=
$newReference
)
{
$pSheet
->
setDataValidation
(
$newReference
,
$value
);
$pSheet
->
setDataValidation
(
$key
,
null
);
}
}
}
/**
* Update merged cells when inserting/deleting rows/columns
*
* @param PHPExcel_Worksheet $pSheet The worksheet that we're editing
* @param string $pBefore Insert/Delete before this cell address (e.g. 'A1')
* @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before
* @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion)
* @param integer $beforeRow Number of the row we're inserting/deleting before
* @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion)
*/
protected
function
_adjustMergeCells
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
)
{
$aMergeCells
=
$pSheet
->
getMergeCells
();
$aNewMergeCells
=
array
();
// the new array of all merge cells
foreach
(
$aMergeCells
as
$key
=>
&
$value
)
{
$newReference
=
$this
->
updateCellReference
(
$key
,
$pBefore
,
$pNumCols
,
$pNumRows
);
$aNewMergeCells
[
$newReference
]
=
$newReference
;
}
$pSheet
->
setMergeCells
(
$aNewMergeCells
);
// replace the merge cells array
}
/**
* Update protected cells when inserting/deleting rows/columns
*
* @param PHPExcel_Worksheet $pSheet The worksheet that we're editing
* @param string $pBefore Insert/Delete before this cell address (e.g. 'A1')
* @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before
* @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion)
* @param integer $beforeRow Number of the row we're inserting/deleting before
* @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion)
*/
protected
function
_adjustProtectedCells
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
)
{
$aProtectedCells
=
$pSheet
->
getProtectedCells
();
(
$pNumCols
>
0
||
$pNumRows
>
0
)
?
uksort
(
$aProtectedCells
,
array
(
'PHPExcel_ReferenceHelper'
,
'cellReverseSort'
))
:
uksort
(
$aProtectedCells
,
array
(
'PHPExcel_ReferenceHelper'
,
'cellSort'
));
foreach
(
$aProtectedCells
as
$key
=>
$value
)
{
$newReference
=
$this
->
updateCellReference
(
$key
,
$pBefore
,
$pNumCols
,
$pNumRows
);
if
(
$key
!=
$newReference
)
{
$pSheet
->
protectCells
(
$newReference
,
$value
,
true
);
$pSheet
->
unprotectCells
(
$key
);
}
}
}
/**
* Update column dimensions when inserting/deleting rows/columns
*
* @param PHPExcel_Worksheet $pSheet The worksheet that we're editing
* @param string $pBefore Insert/Delete before this cell address (e.g. 'A1')
* @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before
* @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion)
* @param integer $beforeRow Number of the row we're inserting/deleting before
* @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion)
*/
protected
function
_adjustColumnDimensions
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
)
{
$aColumnDimensions
=
array_reverse
(
$pSheet
->
getColumnDimensions
(),
true
);
if
(
!
empty
(
$aColumnDimensions
))
{
foreach
(
$aColumnDimensions
as
$objColumnDimension
)
{
$newReference
=
$this
->
updateCellReference
(
$objColumnDimension
->
getColumnIndex
()
.
'1'
,
$pBefore
,
$pNumCols
,
$pNumRows
);
list
(
$newReference
)
=
PHPExcel_Cell
::
coordinateFromString
(
$newReference
);
if
(
$objColumnDimension
->
getColumnIndex
()
!=
$newReference
)
{
$objColumnDimension
->
setColumnIndex
(
$newReference
);
}
}
$pSheet
->
refreshColumnDimensions
();
}
}
/**
* Update row dimensions when inserting/deleting rows/columns
*
* @param PHPExcel_Worksheet $pSheet The worksheet that we're editing
* @param string $pBefore Insert/Delete before this cell address (e.g. 'A1')
* @param integer $beforeColumnIndex Index number of the column we're inserting/deleting before
* @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion)
* @param integer $beforeRow Number of the row we're inserting/deleting before
* @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion)
*/
protected
function
_adjustRowDimensions
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
)
{
$aRowDimensions
=
array_reverse
(
$pSheet
->
getRowDimensions
(),
true
);
if
(
!
empty
(
$aRowDimensions
))
{
foreach
(
$aRowDimensions
as
$objRowDimension
)
{
$newReference
=
$this
->
updateCellReference
(
'A'
.
$objRowDimension
->
getRowIndex
(),
$pBefore
,
$pNumCols
,
$pNumRows
);
list
(,
$newReference
)
=
PHPExcel_Cell
::
coordinateFromString
(
$newReference
);
if
(
$objRowDimension
->
getRowIndex
()
!=
$newReference
)
{
$objRowDimension
->
setRowIndex
(
$newReference
);
}
}
$pSheet
->
refreshRowDimensions
();
$copyDimension
=
$pSheet
->
getRowDimension
(
$beforeRow
-
1
);
for
(
$i
=
$beforeRow
;
$i
<=
$beforeRow
-
1
+
$pNumRows
;
++
$i
)
{
$newDimension
=
$pSheet
->
getRowDimension
(
$i
);
$newDimension
->
setRowHeight
(
$copyDimension
->
getRowHeight
());
$newDimension
->
setVisible
(
$copyDimension
->
getVisible
());
$newDimension
->
setOutlineLevel
(
$copyDimension
->
getOutlineLevel
());
$newDimension
->
setCollapsed
(
$copyDimension
->
getCollapsed
());
}
}
}
/**
* Insert a new column or row, updating all possible related data
*
* @param string $pBefore Insert before this cell address (e.g. 'A1')
* @param integer $pNumCols Number of columns to insert/delete (negative values indicate deletion)
* @param integer $pNumRows Number of rows to insert/delete (negative values indicate deletion)
* @param PHPExcel_Worksheet $pSheet The worksheet that we're editing
* @throws PHPExcel_Exception
*/
public
function
insertNewBefore
(
$pBefore
=
'A1'
,
$pNumCols
=
0
,
$pNumRows
=
0
,
PHPExcel_Worksheet
$pSheet
=
NULL
)
{
$remove
=
(
$pNumCols
<
0
||
$pNumRows
<
0
);
$aCellCollection
=
$pSheet
->
getCellCollection
();
// Get coordinates of $pBefore
$beforeColumn
=
'A'
;
$beforeRow
=
1
;
list
(
$beforeColumn
,
$beforeRow
)
=
PHPExcel_Cell
::
coordinateFromString
(
$pBefore
);
$beforeColumnIndex
=
PHPExcel_Cell
::
columnIndexFromString
(
$beforeColumn
);
// Clear cells if we are removing columns or rows
$highestColumn
=
$pSheet
->
getHighestColumn
();
$highestRow
=
$pSheet
->
getHighestRow
();
// 1. Clear column strips if we are removing columns
if
(
$pNumCols
<
0
&&
$beforeColumnIndex
-
2
+
$pNumCols
>
0
)
{
for
(
$i
=
1
;
$i
<=
$highestRow
-
1
;
++
$i
)
{
for
(
$j
=
$beforeColumnIndex
-
1
+
$pNumCols
;
$j
<=
$beforeColumnIndex
-
2
;
++
$j
)
{
$coordinate
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$j
)
.
$i
;
$pSheet
->
removeConditionalStyles
(
$coordinate
);
if
(
$pSheet
->
cellExists
(
$coordinate
))
{
$pSheet
->
getCell
(
$coordinate
)
->
setValueExplicit
(
''
,
PHPExcel_Cell_DataType
::
TYPE_NULL
);
$pSheet
->
getCell
(
$coordinate
)
->
setXfIndex
(
0
);
}
}
}
}
// 2. Clear row strips if we are removing rows
if
(
$pNumRows
<
0
&&
$beforeRow
-
1
+
$pNumRows
>
0
)
{
for
(
$i
=
$beforeColumnIndex
-
1
;
$i
<=
PHPExcel_Cell
::
columnIndexFromString
(
$highestColumn
)
-
1
;
++
$i
)
{
for
(
$j
=
$beforeRow
+
$pNumRows
;
$j
<=
$beforeRow
-
1
;
++
$j
)
{
$coordinate
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$i
)
.
$j
;
$pSheet
->
removeConditionalStyles
(
$coordinate
);
if
(
$pSheet
->
cellExists
(
$coordinate
))
{
$pSheet
->
getCell
(
$coordinate
)
->
setValueExplicit
(
''
,
PHPExcel_Cell_DataType
::
TYPE_NULL
);
$pSheet
->
getCell
(
$coordinate
)
->
setXfIndex
(
0
);
}
}
}
}
// Loop through cells, bottom-up, and change cell coordinates
if
(
$remove
)
{
// It's faster to reverse and pop than to use unshift, especially with large cell collections
$aCellCollection
=
array_reverse
(
$aCellCollection
);
}
while
(
$cellID
=
array_pop
(
$aCellCollection
))
{
$cell
=
$pSheet
->
getCell
(
$cellID
);
$cellIndex
=
PHPExcel_Cell
::
columnIndexFromString
(
$cell
->
getColumn
());
if
(
$cellIndex
-
1
+
$pNumCols
<
0
)
{
continue
;
}
// New coordinates
$newCoordinates
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$cellIndex
-
1
+
$pNumCols
)
.
(
$cell
->
getRow
()
+
$pNumRows
);
// Should the cell be updated? Move value and cellXf index from one cell to another.
if
((
$cellIndex
>=
$beforeColumnIndex
)
&&
(
$cell
->
getRow
()
>=
$beforeRow
))
{
// Update cell styles
$pSheet
->
getCell
(
$newCoordinates
)
->
setXfIndex
(
$cell
->
getXfIndex
());
// Insert this cell at its new location
if
(
$cell
->
getDataType
()
==
PHPExcel_Cell_DataType
::
TYPE_FORMULA
)
{
// Formula should be adjusted
$pSheet
->
getCell
(
$newCoordinates
)
->
setValue
(
$this
->
updateFormulaReferences
(
$cell
->
getValue
(),
$pBefore
,
$pNumCols
,
$pNumRows
,
$pSheet
->
getTitle
()));
}
else
{
// Formula should not be adjusted
$pSheet
->
getCell
(
$newCoordinates
)
->
setValue
(
$cell
->
getValue
());
}
// Clear the original cell
$pSheet
->
getCellCacheController
()
->
deleteCacheData
(
$cellID
);
}
else
{
/* We don't need to update styles for rows/columns before our insertion position,
but we do still need to adjust any formulae in those cells */
if
(
$cell
->
getDataType
()
==
PHPExcel_Cell_DataType
::
TYPE_FORMULA
)
{
// Formula should be adjusted
$cell
->
setValue
(
$this
->
updateFormulaReferences
(
$cell
->
getValue
(),
$pBefore
,
$pNumCols
,
$pNumRows
,
$pSheet
->
getTitle
()));
}
}
}
// Duplicate styles for the newly inserted cells
$highestColumn
=
$pSheet
->
getHighestColumn
();
$highestRow
=
$pSheet
->
getHighestRow
();
if
(
$pNumCols
>
0
&&
$beforeColumnIndex
-
2
>
0
)
{
for
(
$i
=
$beforeRow
;
$i
<=
$highestRow
-
1
;
++
$i
)
{
// Style
$coordinate
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$beforeColumnIndex
-
2
)
.
$i
;
if
(
$pSheet
->
cellExists
(
$coordinate
))
{
$xfIndex
=
$pSheet
->
getCell
(
$coordinate
)
->
getXfIndex
();
$conditionalStyles
=
$pSheet
->
conditionalStylesExists
(
$coordinate
)
?
$pSheet
->
getConditionalStyles
(
$coordinate
)
:
false
;
for
(
$j
=
$beforeColumnIndex
-
1
;
$j
<=
$beforeColumnIndex
-
2
+
$pNumCols
;
++
$j
)
{
$pSheet
->
getCellByColumnAndRow
(
$j
,
$i
)
->
setXfIndex
(
$xfIndex
);
if
(
$conditionalStyles
)
{
$cloned
=
array
();
foreach
(
$conditionalStyles
as
$conditionalStyle
)
{
$cloned
[]
=
clone
$conditionalStyle
;
}
$pSheet
->
setConditionalStyles
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$j
)
.
$i
,
$cloned
);
}
}
}
}
}
if
(
$pNumRows
>
0
&&
$beforeRow
-
1
>
0
)
{
for
(
$i
=
$beforeColumnIndex
-
1
;
$i
<=
PHPExcel_Cell
::
columnIndexFromString
(
$highestColumn
)
-
1
;
++
$i
)
{
// Style
$coordinate
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$i
)
.
(
$beforeRow
-
1
);
if
(
$pSheet
->
cellExists
(
$coordinate
))
{
$xfIndex
=
$pSheet
->
getCell
(
$coordinate
)
->
getXfIndex
();
$conditionalStyles
=
$pSheet
->
conditionalStylesExists
(
$coordinate
)
?
$pSheet
->
getConditionalStyles
(
$coordinate
)
:
false
;
for
(
$j
=
$beforeRow
;
$j
<=
$beforeRow
-
1
+
$pNumRows
;
++
$j
)
{
$pSheet
->
getCell
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$i
)
.
$j
)
->
setXfIndex
(
$xfIndex
);
if
(
$conditionalStyles
)
{
$cloned
=
array
();
foreach
(
$conditionalStyles
as
$conditionalStyle
)
{
$cloned
[]
=
clone
$conditionalStyle
;
}
$pSheet
->
setConditionalStyles
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$i
)
.
$j
,
$cloned
);
}
}
}
}
}
// Update worksheet: column dimensions
$this
->
_adjustColumnDimensions
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
);
// Update worksheet: row dimensions
$this
->
_adjustRowDimensions
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
);
// Update worksheet: page breaks
$this
->
_adjustPageBreaks
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
);
// Update worksheet: comments
$this
->
_adjustComments
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
);
// Update worksheet: hyperlinks
$this
->
_adjustHyperlinks
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
);
// Update worksheet: data validations
$this
->
_adjustDataValidations
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
);
// Update worksheet: merge cells
$this
->
_adjustMergeCells
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
);
// Update worksheet: protected cells
$this
->
_adjustProtectedCells
(
$pSheet
,
$pBefore
,
$beforeColumnIndex
,
$pNumCols
,
$beforeRow
,
$pNumRows
);
// Update worksheet: autofilter
$autoFilter
=
$pSheet
->
getAutoFilter
();
$autoFilterRange
=
$autoFilter
->
getRange
();
if
(
!
empty
(
$autoFilterRange
))
{
if
(
$pNumCols
!=
0
)
{
$autoFilterColumns
=
array_keys
(
$autoFilter
->
getColumns
());
if
(
count
(
$autoFilterColumns
)
>
0
)
{
sscanf
(
$pBefore
,
'%[A-Z]%d'
,
$column
,
$row
);
$columnIndex
=
PHPExcel_Cell
::
columnIndexFromString
(
$column
);
list
(
$rangeStart
,
$rangeEnd
)
=
PHPExcel_Cell
::
rangeBoundaries
(
$autoFilterRange
);
if
(
$columnIndex
<=
$rangeEnd
[
0
])
{
if
(
$pNumCols
<
0
)
{
// If we're actually deleting any columns that fall within the autofilter range,
// then we delete any rules for those columns
$deleteColumn
=
$columnIndex
+
$pNumCols
-
1
;
$deleteCount
=
abs
(
$pNumCols
);
for
(
$i
=
1
;
$i
<=
$deleteCount
;
++
$i
)
{
if
(
in_array
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$deleteColumn
),
$autoFilterColumns
))
{
$autoFilter
->
clearColumn
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$deleteColumn
));
}
++
$deleteColumn
;
}
}
$startCol
=
(
$columnIndex
>
$rangeStart
[
0
])
?
$columnIndex
:
$rangeStart
[
0
];
// Shuffle columns in autofilter range
if
(
$pNumCols
>
0
)
{
// For insert, we shuffle from end to beginning to avoid overwriting
$startColID
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$startCol
-
1
);
$toColID
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$startCol
+
$pNumCols
-
1
);
$endColID
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$rangeEnd
[
0
]);
$startColRef
=
$startCol
;
$endColRef
=
$rangeEnd
[
0
];
$toColRef
=
$rangeEnd
[
0
]
+
$pNumCols
;
do
{
$autoFilter
->
shiftColumn
(
PHPExcel_Cell
::
stringFromColumnIndex
(
$endColRef
-
1
),
PHPExcel_Cell
::
stringFromColumnIndex
(
$toColRef
-
1
));
--
$endColRef
;
--
$toColRef
;
}
while
(
$startColRef
<=
$endColRef
);
}
else
{
// For delete, we shuffle from beginning to end to avoid overwriting
$startColID
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$startCol
-
1
);
$toColID
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$startCol
+
$pNumCols
-
1
);
$endColID
=
PHPExcel_Cell
::
stringFromColumnIndex
(
$rangeEnd
[
0
]);
do
{
$autoFilter
->
shiftColumn
(
$startColID
,
$toColID
);
++
$startColID
;
++
$toColID
;
}
while
(
$startColID
!=
$endColID
);
}
}
}
}
$pSheet
->
setAutoFilter
(
$this
->
updateCellReference
(
$autoFilterRange
,
$pBefore
,
$pNumCols
,
$pNumRows
)
);
}
// Update worksheet: freeze pane
if
(
$pSheet
->
getFreezePane
()
!=
''
)
{
$pSheet
->
freezePane
(
$this
->
updateCellReference
(
$pSheet
->
getFreezePane
(),
$pBefore
,
$pNumCols
,
$pNumRows
)
);
}
// Page setup
if
(
$pSheet
->
getPageSetup
()
->
isPrintAreaSet
())
{
$pSheet
->
getPageSetup
()
->
setPrintArea
(
$this
->
updateCellReference
(
$pSheet
->
getPageSetup
()
->
getPrintArea
(),
$pBefore
,
$pNumCols
,
$pNumRows
)
);
}
// Update worksheet: drawings
$aDrawings
=
$pSheet
->
getDrawingCollection
();
foreach
(
$aDrawings
as
$objDrawing
)
{
$newReference
=
$this
->
updateCellReference
(
$objDrawing
->
getCoordinates
(),
$pBefore
,
$pNumCols
,
$pNumRows
);
if
(
$objDrawing
->
getCoordinates
()
!=
$newReference
)
{
$objDrawing
->
setCoordinates
(
$newReference
);
}
}
// Update workbook: named ranges
if
(
count
(
$pSheet
->
getParent
()
->
getNamedRanges
())
>
0
)
{
foreach
(
$pSheet
->
getParent
()
->
getNamedRanges
()
as
$namedRange
)
{
if
(
$namedRange
->
getWorksheet
()
->
getHashCode
()
==
$pSheet
->
getHashCode
())
{
$namedRange
->
setRange
(
$this
->
updateCellReference
(
$namedRange
->
getRange
(),
$pBefore
,
$pNumCols
,
$pNumRows
)
);
}
}
}
// Garbage collect
$pSheet
->
garbageCollect
();
}
/**
* Update references within formulas
*
* @param string $pFormula Formula to update
* @param int $pBefore Insert before this one
* @param int $pNumCols Number of columns to insert
* @param int $pNumRows Number of rows to insert
* @param string $sheetName Worksheet name/title
* @return string Updated formula
* @throws PHPExcel_Exception
*/
public
function
updateFormulaReferences
(
$pFormula
=
''
,
$pBefore
=
'A1'
,
$pNumCols
=
0
,
$pNumRows
=
0
,
$sheetName
=
''
)
{
// Update cell references in the formula
$formulaBlocks
=
explode
(
'"'
,
$pFormula
);
$i
=
false
;
foreach
(
$formulaBlocks
as
&
$formulaBlock
)
{
// Ignore blocks that were enclosed in quotes (alternating entries in the $formulaBlocks array after the explode)
if
(
$i
=
!
$i
)
{
$adjustCount
=
0
;
$newCellTokens
=
$cellTokens
=
array
();
// Search for row ranges (e.g. 'Sheet1'!3:5 or 3:5) with or without $ absolutes (e.g. $3:5)
$matchCount
=
preg_match_all
(
'/'
.
self
::
REFHELPER_REGEXP_ROWRANGE
.
'/i'
,
' '
.
$formulaBlock
.
' '
,
$matches
,
PREG_SET_ORDER
);
if
(
$matchCount
>
0
)
{
foreach
(
$matches
as
$match
)
{
$fromString
=
(
$match
[
2
]
>
''
)
?
$match
[
2
]
.
'!'
:
''
;
$fromString
.
=
$match
[
3
]
.
':'
.
$match
[
4
];
$modified3
=
substr
(
$this
->
updateCellReference
(
'$A'
.
$match
[
3
],
$pBefore
,
$pNumCols
,
$pNumRows
),
2
);
$modified4
=
substr
(
$this
->
updateCellReference
(
'$A'
.
$match
[
4
],
$pBefore
,
$pNumCols
,
$pNumRows
),
2
);
if
(
$match
[
3
]
.
':'
.
$match
[
4
]
!==
$modified3
.
':'
.
$modified4
)
{
if
((
$match
[
2
]
==
''
)
||
(
trim
(
$match
[
2
],
"'"
)
==
$sheetName
))
{
$toString
=
(
$match
[
2
]
>
''
)
?
$match
[
2
]
.
'!'
:
''
;
$toString
.
=
$modified3
.
':'
.
$modified4
;
// Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
$column
=
100000
;
$row
=
10000000
+
trim
(
$match
[
3
],
'$'
);
$cellIndex
=
$column
.
$row
;
$newCellTokens
[
$cellIndex
]
=
preg_quote
(
$toString
);
$cellTokens
[
$cellIndex
]
=
'/(?<!\d\$\!)'
.
preg_quote
(
$fromString
)
.
'(?!\d)/i'
;
++
$adjustCount
;
}
}
}
}
// Search for column ranges (e.g. 'Sheet1'!C:E or C:E) with or without $ absolutes (e.g. $C:E)
$matchCount
=
preg_match_all
(
'/'
.
self
::
REFHELPER_REGEXP_COLRANGE
.
'/i'
,
' '
.
$formulaBlock
.
' '
,
$matches
,
PREG_SET_ORDER
);
if
(
$matchCount
>
0
)
{
foreach
(
$matches
as
$match
)
{
$fromString
=
(
$match
[
2
]
>
''
)
?
$match
[
2
]
.
'!'
:
''
;
$fromString
.
=
$match
[
3
]
.
':'
.
$match
[
4
];
$modified3
=
substr
(
$this
->
updateCellReference
(
$match
[
3
]
.
'$1'
,
$pBefore
,
$pNumCols
,
$pNumRows
),
0
,
-
2
);
$modified4
=
substr
(
$this
->
updateCellReference
(
$match
[
4
]
.
'$1'
,
$pBefore
,
$pNumCols
,
$pNumRows
),
0
,
-
2
);
if
(
$match
[
3
]
.
':'
.
$match
[
4
]
!==
$modified3
.
':'
.
$modified4
)
{
if
((
$match
[
2
]
==
''
)
||
(
trim
(
$match
[
2
],
"'"
)
==
$sheetName
))
{
$toString
=
(
$match
[
2
]
>
''
)
?
$match
[
2
]
.
'!'
:
''
;
$toString
.
=
$modified3
.
':'
.
$modified4
;
// Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
$column
=
PHPExcel_Cell
::
columnIndexFromString
(
trim
(
$match
[
3
],
'$'
))
+
100000
;
$row
=
10000000
;
$cellIndex
=
$column
.
$row
;
$newCellTokens
[
$cellIndex
]
=
preg_quote
(
$toString
);
$cellTokens
[
$cellIndex
]
=
'/(?<![A-Z\$\!])'
.
preg_quote
(
$fromString
)
.
'(?![A-Z])/i'
;
++
$adjustCount
;
}
}
}
}
// Search for cell ranges (e.g. 'Sheet1'!A3:C5 or A3:C5) with or without $ absolutes (e.g. $A1:C$5)
$matchCount
=
preg_match_all
(
'/'
.
self
::
REFHELPER_REGEXP_CELLRANGE
.
'/i'
,
' '
.
$formulaBlock
.
' '
,
$matches
,
PREG_SET_ORDER
);
if
(
$matchCount
>
0
)
{
foreach
(
$matches
as
$match
)
{
$fromString
=
(
$match
[
2
]
>
''
)
?
$match
[
2
]
.
'!'
:
''
;
$fromString
.
=
$match
[
3
]
.
':'
.
$match
[
4
];
$modified3
=
$this
->
updateCellReference
(
$match
[
3
],
$pBefore
,
$pNumCols
,
$pNumRows
);
$modified4
=
$this
->
updateCellReference
(
$match
[
4
],
$pBefore
,
$pNumCols
,
$pNumRows
);
if
(
$match
[
3
]
.
$match
[
4
]
!==
$modified3
.
$modified4
)
{
if
((
$match
[
2
]
==
''
)
||
(
trim
(
$match
[
2
],
"'"
)
==
$sheetName
))
{
$toString
=
(
$match
[
2
]
>
''
)
?
$match
[
2
]
.
'!'
:
''
;
$toString
.
=
$modified3
.
':'
.
$modified4
;
list
(
$column
,
$row
)
=
PHPExcel_Cell
::
coordinateFromString
(
$match
[
3
]);
// Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
$column
=
PHPExcel_Cell
::
columnIndexFromString
(
trim
(
$column
,
'$'
))
+
100000
;
$row
=
trim
(
$row
,
'$'
)
+
10000000
;
$cellIndex
=
$column
.
$row
;
$newCellTokens
[
$cellIndex
]
=
preg_quote
(
$toString
);
$cellTokens
[
$cellIndex
]
=
'/(?<![A-Z]\$\!)'
.
preg_quote
(
$fromString
)
.
'(?!\d)/i'
;
++
$adjustCount
;
}
}
}
}
// Search for cell references (e.g. 'Sheet1'!A3 or C5) with or without $ absolutes (e.g. $A1 or C$5)
$matchCount
=
preg_match_all
(
'/'
.
self
::
REFHELPER_REGEXP_CELLREF
.
'/i'
,
' '
.
$formulaBlock
.
' '
,
$matches
,
PREG_SET_ORDER
);
if
(
$matchCount
>
0
)
{
foreach
(
$matches
as
$match
)
{
$fromString
=
(
$match
[
2
]
>
''
)
?
$match
[
2
]
.
'!'
:
''
;
$fromString
.
=
$match
[
3
];
$modified3
=
$this
->
updateCellReference
(
$match
[
3
],
$pBefore
,
$pNumCols
,
$pNumRows
);
if
(
$match
[
3
]
!==
$modified3
)
{
if
((
$match
[
2
]
==
''
)
||
(
trim
(
$match
[
2
],
"'"
)
==
$sheetName
))
{
$toString
=
(
$match
[
2
]
>
''
)
?
$match
[
2
]
.
'!'
:
''
;
$toString
.
=
$modified3
;
list
(
$column
,
$row
)
=
PHPExcel_Cell
::
coordinateFromString
(
$match
[
3
]);
// Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more
$column
=
PHPExcel_Cell
::
columnIndexFromString
(
trim
(
$column
,
'$'
))
+
100000
;
$row
=
trim
(
$row
,
'$'
)
+
10000000
;
$cellIndex
=
$row
.
$column
;
$newCellTokens
[
$cellIndex
]
=
preg_quote
(
$toString
);
$cellTokens
[
$cellIndex
]
=
'/(?<![A-Z\$\!])'
.
preg_quote
(
$fromString
)
.
'(?!\d)/i'
;
++
$adjustCount
;
}
}
}
}
if
(
$adjustCount
>
0
)
{
if
(
$pNumCols
>
0
||
$pNumRows
>
0
)
{
krsort
(
$cellTokens
);
krsort
(
$newCellTokens
);
}
else
{
ksort
(
$cellTokens
);
ksort
(
$newCellTokens
);
}
// Update cell references in the formula
$formulaBlock
=
str_replace
(
'\\'
,
''
,
preg_replace
(
$cellTokens
,
$newCellTokens
,
$formulaBlock
));
}
}
}
unset
(
$formulaBlock
);
// Then rebuild the formula string
return
implode
(
'"'
,
$formulaBlocks
);
}
/**
* Update cell reference
*
* @param string $pCellRange Cell range
* @param int $pBefore Insert before this one
* @param int $pNumCols Number of columns to increment
* @param int $pNumRows Number of rows to increment
* @return string Updated cell range
* @throws PHPExcel_Exception
*/
public
function
updateCellReference
(
$pCellRange
=
'A1'
,
$pBefore
=
'A1'
,
$pNumCols
=
0
,
$pNumRows
=
0
)
{
// Is it in another worksheet? Will not have to update anything.
if
(
strpos
(
$pCellRange
,
"!"
)
!==
false
)
{
return
$pCellRange
;
// Is it a range or a single cell?
}
elseif
(
strpos
(
$pCellRange
,
':'
)
===
false
&&
strpos
(
$pCellRange
,
','
)
===
false
)
{
// Single cell
return
$this
->
_updateSingleCellReference
(
$pCellRange
,
$pBefore
,
$pNumCols
,
$pNumRows
);
}
elseif
(
strpos
(
$pCellRange
,
':'
)
!==
false
||
strpos
(
$pCellRange
,
','
)
!==
false
)
{
// Range
return
$this
->
_updateCellRange
(
$pCellRange
,
$pBefore
,
$pNumCols
,
$pNumRows
);
}
else
{
// Return original
return
$pCellRange
;
}
}
/**
* Update named formulas (i.e. containing worksheet references / named ranges)
*
* @param PHPExcel $pPhpExcel Object to update
* @param string $oldName Old name (name to replace)
* @param string $newName New name
*/
public
function
updateNamedFormulas
(
PHPExcel
$pPhpExcel
,
$oldName
=
''
,
$newName
=
''
)
{
if
(
$oldName
==
''
)
{
return
;
}
foreach
(
$pPhpExcel
->
getWorksheetIterator
()
as
$sheet
)
{
foreach
(
$sheet
->
getCellCollection
(
false
)
as
$cellID
)
{
$cell
=
$sheet
->
getCell
(
$cellID
);
if
((
$cell
!==
NULL
)
&&
(
$cell
->
getDataType
()
==
PHPExcel_Cell_DataType
::
TYPE_FORMULA
))
{
$formula
=
$cell
->
getValue
();
if
(
strpos
(
$formula
,
$oldName
)
!==
false
)
{
$formula
=
str_replace
(
"'"
.
$oldName
.
"'!"
,
"'"
.
$newName
.
"'!"
,
$formula
);
$formula
=
str_replace
(
$oldName
.
"!"
,
$newName
.
"!"
,
$formula
);
$cell
->
setValueExplicit
(
$formula
,
PHPExcel_Cell_DataType
::
TYPE_FORMULA
);
}
}
}
}
}
/**
* Update cell range
*
* @param string $pCellRange Cell range (e.g. 'B2:D4', 'B:C' or '2:3')
* @param int $pBefore Insert before this one
* @param int $pNumCols Number of columns to increment
* @param int $pNumRows Number of rows to increment
* @return string Updated cell range
* @throws PHPExcel_Exception
*/
private
function
_updateCellRange
(
$pCellRange
=
'A1:A1'
,
$pBefore
=
'A1'
,
$pNumCols
=
0
,
$pNumRows
=
0
)
{
if
(
strpos
(
$pCellRange
,
':'
)
!==
false
||
strpos
(
$pCellRange
,
','
)
!==
false
)
{
// Update range
$range
=
PHPExcel_Cell
::
splitRange
(
$pCellRange
);
$ic
=
count
(
$range
);
for
(
$i
=
0
;
$i
<
$ic
;
++
$i
)
{
$jc
=
count
(
$range
[
$i
]);
for
(
$j
=
0
;
$j
<
$jc
;
++
$j
)
{
if
(
ctype_alpha
(
$range
[
$i
][
$j
]))
{
$r
=
PHPExcel_Cell
::
coordinateFromString
(
$this
->
_updateSingleCellReference
(
$range
[
$i
][
$j
]
.
'1'
,
$pBefore
,
$pNumCols
,
$pNumRows
));
$range
[
$i
][
$j
]
=
$r
[
0
];
}
elseif
(
ctype_digit
(
$range
[
$i
][
$j
]))
{
$r
=
PHPExcel_Cell
::
coordinateFromString
(
$this
->
_updateSingleCellReference
(
'A'
.
$range
[
$i
][
$j
],
$pBefore
,
$pNumCols
,
$pNumRows
));
$range
[
$i
][
$j
]
=
$r
[
1
];
}
else
{
$range
[
$i
][
$j
]
=
$this
->
_updateSingleCellReference
(
$range
[
$i
][
$j
],
$pBefore
,
$pNumCols
,
$pNumRows
);
}
}
}
// Recreate range string
return
PHPExcel_Cell
::
buildRange
(
$range
);
}
else
{
throw
new
PHPExcel_Exception
(
"Only cell ranges may be passed to this method."
);
}
}
/**
* Update single cell reference
*
* @param string $pCellReference Single cell reference
* @param int $pBefore Insert before this one
* @param int $pNumCols Number of columns to increment
* @param int $pNumRows Number of rows to increment
* @return string Updated cell reference
* @throws PHPExcel_Exception
*/
private
function
_updateSingleCellReference
(
$pCellReference
=
'A1'
,
$pBefore
=
'A1'
,
$pNumCols
=
0
,
$pNumRows
=
0
)
{
if
(
strpos
(
$pCellReference
,
':'
)
===
false
&&
strpos
(
$pCellReference
,
','
)
===
false
)
{
// Get coordinates of $pBefore
list
(
$beforeColumn
,
$beforeRow
)
=
PHPExcel_Cell
::
coordinateFromString
(
$pBefore
);
// Get coordinates of $pCellReference
list
(
$newColumn
,
$newRow
)
=
PHPExcel_Cell
::
coordinateFromString
(
$pCellReference
);
// Verify which parts should be updated
$updateColumn
=
((
$newColumn
{
0
}
!=
'$'
)
&&
(
$beforeColumn
{
0
}
!=
'$'
)
&&
PHPExcel_Cell
::
columnIndexFromString
(
$newColumn
)
>=
PHPExcel_Cell
::
columnIndexFromString
(
$beforeColumn
));
$updateRow
=
((
$newRow
{
0
}
!=
'$'
)
&&
(
$beforeRow
{
0
}
!=
'$'
)
&&
$newRow
>=
$beforeRow
);
// Create new column reference
if
(
$updateColumn
)
{
$newColumn
=
PHPExcel_Cell
::
stringFromColumnIndex
(
PHPExcel_Cell
::
columnIndexFromString
(
$newColumn
)
-
1
+
$pNumCols
);
}
// Create new row reference
if
(
$updateRow
)
{
$newRow
=
$newRow
+
$pNumRows
;
}
// Return new reference
return
$newColumn
.
$newRow
;
}
else
{
throw
new
PHPExcel_Exception
(
"Only single cell references may be passed to this method."
);
}
}
/**
* __clone implementation. Cloning should not be allowed in a Singleton!
*
* @throws PHPExcel_Exception
*/
public
final
function
__clone
()
{
throw
new
PHPExcel_Exception
(
"Cloning a Singleton is not allowed!"
);
}
}
lib/Classes/PHPExcel/RichText.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_RichText
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_RichText
*
* @category PHPExcel
* @package PHPExcel_RichText
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_RichText
implements
PHPExcel_IComparable
{
/**
* Rich text elements
*
* @var PHPExcel_RichText_ITextElement[]
*/
private
$_richTextElements
;
/**
* Create a new PHPExcel_RichText instance
*
* @param PHPExcel_Cell $pCell
* @throws PHPExcel_Exception
*/
public
function
__construct
(
PHPExcel_Cell
$pCell
=
null
)
{
// Initialise variables
$this
->
_richTextElements
=
array
();
// Rich-Text string attached to cell?
if
(
$pCell
!==
NULL
)
{
// Add cell text and style
if
(
$pCell
->
getValue
()
!=
""
)
{
$objRun
=
new
PHPExcel_RichText_Run
(
$pCell
->
getValue
());
$objRun
->
setFont
(
clone
$pCell
->
getParent
()
->
getStyle
(
$pCell
->
getCoordinate
())
->
getFont
());
$this
->
addText
(
$objRun
);
}
// Set parent value
$pCell
->
setValueExplicit
(
$this
,
PHPExcel_Cell_DataType
::
TYPE_STRING
);
}
}
/**
* Add text
*
* @param PHPExcel_RichText_ITextElement $pText Rich text element
* @throws PHPExcel_Exception
* @return PHPExcel_RichText
*/
public
function
addText
(
PHPExcel_RichText_ITextElement
$pText
=
null
)
{
$this
->
_richTextElements
[]
=
$pText
;
return
$this
;
}
/**
* Create text
*
* @param string $pText Text
* @return PHPExcel_RichText_TextElement
* @throws PHPExcel_Exception
*/
public
function
createText
(
$pText
=
''
)
{
$objText
=
new
PHPExcel_RichText_TextElement
(
$pText
);
$this
->
addText
(
$objText
);
return
$objText
;
}
/**
* Create text run
*
* @param string $pText Text
* @return PHPExcel_RichText_Run
* @throws PHPExcel_Exception
*/
public
function
createTextRun
(
$pText
=
''
)
{
$objText
=
new
PHPExcel_RichText_Run
(
$pText
);
$this
->
addText
(
$objText
);
return
$objText
;
}
/**
* Get plain text
*
* @return string
*/
public
function
getPlainText
()
{
// Return value
$returnValue
=
''
;
// Loop through all PHPExcel_RichText_ITextElement
foreach
(
$this
->
_richTextElements
as
$text
)
{
$returnValue
.
=
$text
->
getText
();
}
// Return
return
$returnValue
;
}
/**
* Convert to string
*
* @return string
*/
public
function
__toString
()
{
return
$this
->
getPlainText
();
}
/**
* Get Rich Text elements
*
* @return PHPExcel_RichText_ITextElement[]
*/
public
function
getRichTextElements
()
{
return
$this
->
_richTextElements
;
}
/**
* Set Rich Text elements
*
* @param PHPExcel_RichText_ITextElement[] $pElements Array of elements
* @throws PHPExcel_Exception
* @return PHPExcel_RichText
*/
public
function
setRichTextElements
(
$pElements
=
null
)
{
if
(
is_array
(
$pElements
))
{
$this
->
_richTextElements
=
$pElements
;
}
else
{
throw
new
PHPExcel_Exception
(
"Invalid PHPExcel_RichText_ITextElement[] array passed."
);
}
return
$this
;
}
/**
* Get hash code
*
* @return string Hash code
*/
public
function
getHashCode
()
{
$hashElements
=
''
;
foreach
(
$this
->
_richTextElements
as
$element
)
{
$hashElements
.
=
$element
->
getHashCode
();
}
return
md5
(
$hashElements
.
__CLASS__
);
}
/**
* Implement PHP __clone to create a deep clone, not just a shallow copy.
*/
public
function
__clone
()
{
$vars
=
get_object_vars
(
$this
);
foreach
(
$vars
as
$key
=>
$value
)
{
if
(
is_object
(
$value
))
{
$this
->
$key
=
clone
$value
;
}
else
{
$this
->
$key
=
$value
;
}
}
}
}
lib/Classes/PHPExcel/RichText/ITextElement.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_RichText
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_RichText_ITextElement
*
* @category PHPExcel
* @package PHPExcel_RichText
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
interface
PHPExcel_RichText_ITextElement
{
/**
* Get text
*
* @return string Text
*/
public
function
getText
();
/**
* Set text
*
* @param $pText string Text
* @return PHPExcel_RichText_ITextElement
*/
public
function
setText
(
$pText
=
''
);
/**
* Get font
*
* @return PHPExcel_Style_Font
*/
public
function
getFont
();
/**
* Get hash code
*
* @return string Hash code
*/
public
function
getHashCode
();
}
lib/Classes/PHPExcel/RichText/Run.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_RichText
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_RichText_Run
*
* @category PHPExcel
* @package PHPExcel_RichText
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_RichText_Run
extends
PHPExcel_RichText_TextElement
implements
PHPExcel_RichText_ITextElement
{
/**
* Font
*
* @var PHPExcel_Style_Font
*/
private
$_font
;
/**
* Create a new PHPExcel_RichText_Run instance
*
* @param string $pText Text
*/
public
function
__construct
(
$pText
=
''
)
{
// Initialise variables
$this
->
setText
(
$pText
);
$this
->
_font
=
new
PHPExcel_Style_Font
();
}
/**
* Get font
*
* @return PHPExcel_Style_Font
*/
public
function
getFont
()
{
return
$this
->
_font
;
}
/**
* Set font
*
* @param PHPExcel_Style_Font $pFont Font
* @throws PHPExcel_Exception
* @return PHPExcel_RichText_ITextElement
*/
public
function
setFont
(
PHPExcel_Style_Font
$pFont
=
null
)
{
$this
->
_font
=
$pFont
;
return
$this
;
}
/**
* Get hash code
*
* @return string Hash code
*/
public
function
getHashCode
()
{
return
md5
(
$this
->
getText
()
.
$this
->
_font
->
getHashCode
()
.
__CLASS__
);
}
/**
* Implement PHP __clone to create a deep clone, not just a shallow copy.
*/
public
function
__clone
()
{
$vars
=
get_object_vars
(
$this
);
foreach
(
$vars
as
$key
=>
$value
)
{
if
(
is_object
(
$value
))
{
$this
->
$key
=
clone
$value
;
}
else
{
$this
->
$key
=
$value
;
}
}
}
}
lib/Classes/PHPExcel/RichText/TextElement.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_RichText
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_RichText_TextElement
*
* @category PHPExcel
* @package PHPExcel_RichText
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_RichText_TextElement
implements
PHPExcel_RichText_ITextElement
{
/**
* Text
*
* @var string
*/
private
$_text
;
/**
* Create a new PHPExcel_RichText_TextElement instance
*
* @param string $pText Text
*/
public
function
__construct
(
$pText
=
''
)
{
// Initialise variables
$this
->
_text
=
$pText
;
}
/**
* Get text
*
* @return string Text
*/
public
function
getText
()
{
return
$this
->
_text
;
}
/**
* Set text
*
* @param $pText string Text
* @return PHPExcel_RichText_ITextElement
*/
public
function
setText
(
$pText
=
''
)
{
$this
->
_text
=
$pText
;
return
$this
;
}
/**
* Get font
*
* @return PHPExcel_Style_Font
*/
public
function
getFont
()
{
return
null
;
}
/**
* Get hash code
*
* @return string Hash code
*/
public
function
getHashCode
()
{
return
md5
(
$this
->
_text
.
__CLASS__
);
}
/**
* Implement PHP __clone to create a deep clone, not just a shallow copy.
*/
public
function
__clone
()
{
$vars
=
get_object_vars
(
$this
);
foreach
(
$vars
as
$key
=>
$value
)
{
if
(
is_object
(
$value
))
{
$this
->
$key
=
clone
$value
;
}
else
{
$this
->
$key
=
$value
;
}
}
}
}
lib/Classes/PHPExcel/Settings.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Settings
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/** PHPExcel root directory */
if
(
!
defined
(
'PHPEXCEL_ROOT'
))
{
/**
* @ignore
*/
define
(
'PHPEXCEL_ROOT'
,
dirname
(
__FILE__
)
.
'/../'
);
require
(
PHPEXCEL_ROOT
.
'PHPExcel/Autoloader.php'
);
}
class
PHPExcel_Settings
{
/** constants */
/** Available Zip library classes */
const
PCLZIP
=
'PHPExcel_Shared_ZipArchive'
;
const
ZIPARCHIVE
=
'ZipArchive'
;
/** Optional Chart Rendering libraries */
const
CHART_RENDERER_JPGRAPH
=
'jpgraph'
;
/** Optional PDF Rendering libraries */
const
PDF_RENDERER_TCPDF
=
'tcPDF'
;
const
PDF_RENDERER_DOMPDF
=
'DomPDF'
;
const
PDF_RENDERER_MPDF
=
'mPDF'
;
private
static
$_chartRenderers
=
array
(
self
::
CHART_RENDERER_JPGRAPH
,
);
private
static
$_pdfRenderers
=
array
(
self
::
PDF_RENDERER_TCPDF
,
self
::
PDF_RENDERER_DOMPDF
,
self
::
PDF_RENDERER_MPDF
,
);
/**
* Name of the class used for Zip file management
* e.g.
* ZipArchive
*
* @var string
*/
private
static
$_zipClass
=
self
::
ZIPARCHIVE
;
/**
* Name of the external Library used for rendering charts
* e.g.
* jpgraph
*
* @var string
*/
private
static
$_chartRendererName
=
NULL
;
/**
* Directory Path to the external Library used for rendering charts
*
* @var string
*/
private
static
$_chartRendererPath
=
NULL
;
/**
* Name of the external Library used for rendering PDF files
* e.g.
* mPDF
*
* @var string
*/
private
static
$_pdfRendererName
=
NULL
;
/**
* Directory Path to the external Library used for rendering PDF files
*
* @var string
*/
private
static
$_pdfRendererPath
=
NULL
;
/**
* Default options for libxml loader
*
* @var int
*/
private
static
$_libXmlLoaderOptions
=
null
;
/**
* Set the Zip handler Class that PHPExcel should use for Zip file management (PCLZip or ZipArchive)
*
* @param string $zipClass The Zip handler class that PHPExcel should use for Zip file management
* e.g. PHPExcel_Settings::PCLZip or PHPExcel_Settings::ZipArchive
* @return boolean Success or failure
*/
public
static
function
setZipClass
(
$zipClass
)
{
if
((
$zipClass
===
self
::
PCLZIP
)
||
(
$zipClass
===
self
::
ZIPARCHIVE
))
{
self
::
$_zipClass
=
$zipClass
;
return
TRUE
;
}
return
FALSE
;
}
// function setZipClass()
/**
* Return the name of the Zip handler Class that PHPExcel is configured to use (PCLZip or ZipArchive)
* or Zip file management
*
* @return string Name of the Zip handler Class that PHPExcel is configured to use
* for Zip file management
* e.g. PHPExcel_Settings::PCLZip or PHPExcel_Settings::ZipArchive
*/
public
static
function
getZipClass
()
{
return
self
::
$_zipClass
;
}
// function getZipClass()
/**
* Return the name of the method that is currently configured for cell cacheing
*
* @return string Name of the cacheing method
*/
public
static
function
getCacheStorageMethod
()
{
return
PHPExcel_CachedObjectStorageFactory
::
getCacheStorageMethod
();
}
// function getCacheStorageMethod()
/**
* Return the name of the class that is currently being used for cell cacheing
*
* @return string Name of the class currently being used for cacheing
*/
public
static
function
getCacheStorageClass
()
{
return
PHPExcel_CachedObjectStorageFactory
::
getCacheStorageClass
();
}
// function getCacheStorageClass()
/**
* Set the method that should be used for cell cacheing
*
* @param string $method Name of the cacheing method
* @param array $arguments Optional configuration arguments for the cacheing method
* @return boolean Success or failure
*/
public
static
function
setCacheStorageMethod
(
$method
=
PHPExcel_CachedObjectStorageFactory
::
cache_in_memory
,
$arguments
=
array
()
)
{
return
PHPExcel_CachedObjectStorageFactory
::
initialize
(
$method
,
$arguments
);
}
// function setCacheStorageMethod()
/**
* Set the locale code to use for formula translations and any special formatting
*
* @param string $locale The locale code to use (e.g. "fr" or "pt_br" or "en_uk")
* @return boolean Success or failure
*/
public
static
function
setLocale
(
$locale
=
'en_us'
)
{
return
PHPExcel_Calculation
::
getInstance
()
->
setLocale
(
$locale
);
}
// function setLocale()
/**
* Set details of the external library that PHPExcel should use for rendering charts
*
* @param string $libraryName Internal reference name of the library
* e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH
* @param string $libraryBaseDir Directory path to the library's base folder
*
* @return boolean Success or failure
*/
public
static
function
setChartRenderer
(
$libraryName
,
$libraryBaseDir
)
{
if
(
!
self
::
setChartRendererName
(
$libraryName
))
return
FALSE
;
return
self
::
setChartRendererPath
(
$libraryBaseDir
);
}
// function setChartRenderer()
/**
* Identify to PHPExcel the external library to use for rendering charts
*
* @param string $libraryName Internal reference name of the library
* e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH
*
* @return boolean Success or failure
*/
public
static
function
setChartRendererName
(
$libraryName
)
{
if
(
!
in_array
(
$libraryName
,
self
::
$_chartRenderers
))
{
return
FALSE
;
}
self
::
$_chartRendererName
=
$libraryName
;
return
TRUE
;
}
// function setChartRendererName()
/**
* Tell PHPExcel where to find the external library to use for rendering charts
*
* @param string $libraryBaseDir Directory path to the library's base folder
* @return boolean Success or failure
*/
public
static
function
setChartRendererPath
(
$libraryBaseDir
)
{
if
((
file_exists
(
$libraryBaseDir
)
===
false
)
||
(
is_readable
(
$libraryBaseDir
)
===
false
))
{
return
FALSE
;
}
self
::
$_chartRendererPath
=
$libraryBaseDir
;
return
TRUE
;
}
// function setChartRendererPath()
/**
* Return the Chart Rendering Library that PHPExcel is currently configured to use (e.g. jpgraph)
*
* @return string|NULL Internal reference name of the Chart Rendering Library that PHPExcel is
* currently configured to use
* e.g. PHPExcel_Settings::CHART_RENDERER_JPGRAPH
*/
public
static
function
getChartRendererName
()
{
return
self
::
$_chartRendererName
;
}
// function getChartRendererName()
/**
* Return the directory path to the Chart Rendering Library that PHPExcel is currently configured to use
*
* @return string|NULL Directory Path to the Chart Rendering Library that PHPExcel is
* currently configured to use
*/
public
static
function
getChartRendererPath
()
{
return
self
::
$_chartRendererPath
;
}
// function getChartRendererPath()
/**
* Set details of the external library that PHPExcel should use for rendering PDF files
*
* @param string $libraryName Internal reference name of the library
* e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF,
* PHPExcel_Settings::PDF_RENDERER_DOMPDF
* or PHPExcel_Settings::PDF_RENDERER_MPDF
* @param string $libraryBaseDir Directory path to the library's base folder
*
* @return boolean Success or failure
*/
public
static
function
setPdfRenderer
(
$libraryName
,
$libraryBaseDir
)
{
if
(
!
self
::
setPdfRendererName
(
$libraryName
))
return
FALSE
;
return
self
::
setPdfRendererPath
(
$libraryBaseDir
);
}
// function setPdfRenderer()
/**
* Identify to PHPExcel the external library to use for rendering PDF files
*
* @param string $libraryName Internal reference name of the library
* e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF,
* PHPExcel_Settings::PDF_RENDERER_DOMPDF
* or PHPExcel_Settings::PDF_RENDERER_MPDF
*
* @return boolean Success or failure
*/
public
static
function
setPdfRendererName
(
$libraryName
)
{
if
(
!
in_array
(
$libraryName
,
self
::
$_pdfRenderers
))
{
return
FALSE
;
}
self
::
$_pdfRendererName
=
$libraryName
;
return
TRUE
;
}
// function setPdfRendererName()
/**
* Tell PHPExcel where to find the external library to use for rendering PDF files
*
* @param string $libraryBaseDir Directory path to the library's base folder
* @return boolean Success or failure
*/
public
static
function
setPdfRendererPath
(
$libraryBaseDir
)
{
if
((
file_exists
(
$libraryBaseDir
)
===
false
)
||
(
is_readable
(
$libraryBaseDir
)
===
false
))
{
return
FALSE
;
}
self
::
$_pdfRendererPath
=
$libraryBaseDir
;
return
TRUE
;
}
// function setPdfRendererPath()
/**
* Return the PDF Rendering Library that PHPExcel is currently configured to use (e.g. dompdf)
*
* @return string|NULL Internal reference name of the PDF Rendering Library that PHPExcel is
* currently configured to use
* e.g. PHPExcel_Settings::PDF_RENDERER_TCPDF,
* PHPExcel_Settings::PDF_RENDERER_DOMPDF
* or PHPExcel_Settings::PDF_RENDERER_MPDF
*/
public
static
function
getPdfRendererName
()
{
return
self
::
$_pdfRendererName
;
}
// function getPdfRendererName()
/**
* Return the directory path to the PDF Rendering Library that PHPExcel is currently configured to use
*
* @return string|NULL Directory Path to the PDF Rendering Library that PHPExcel is
* currently configured to use
*/
public
static
function
getPdfRendererPath
()
{
return
self
::
$_pdfRendererPath
;
}
// function getPdfRendererPath()
/**
* Set default options for libxml loader
*
* @param int $options Default options for libxml loader
*/
public
static
function
setLibXmlLoaderOptions
(
$options
=
null
)
{
if
(
is_null
(
$options
))
{
$options
=
LIBXML_DTDLOAD
|
LIBXML_DTDATTR
;
}
@
libxml_disable_entity_loader
(
$options
==
(
LIBXML_DTDLOAD
|
LIBXML_DTDATTR
));
self
::
$_libXmlLoaderOptions
=
$options
;
}
// function setLibXmlLoaderOptions
/**
* Get default options for libxml loader.
* Defaults to LIBXML_DTDLOAD | LIBXML_DTDATTR when not set explicitly.
*
* @return int Default options for libxml loader
*/
public
static
function
getLibXmlLoaderOptions
()
{
if
(
is_null
(
self
::
$_libXmlLoaderOptions
))
{
self
::
setLibXmlLoaderOptions
(
LIBXML_DTDLOAD
|
LIBXML_DTDATTR
);
}
@
libxml_disable_entity_loader
(
$options
==
(
LIBXML_DTDLOAD
|
LIBXML_DTDATTR
));
return
self
::
$_libXmlLoaderOptions
;
}
// function getLibXmlLoaderOptions
}
lib/Classes/PHPExcel/Shared/CodePage.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Shared
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_Shared_CodePage
*
* @category PHPExcel
* @package PHPExcel_Shared
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Shared_CodePage
{
/**
* Convert Microsoft Code Page Identifier to Code Page Name which iconv
* and mbstring understands
*
* @param integer $codePage Microsoft Code Page Indentifier
* @return string Code Page Name
* @throws PHPExcel_Exception
*/
public
static
function
NumberToName
(
$codePage
=
1252
)
{
switch
(
$codePage
)
{
case
367
:
return
'ASCII'
;
break
;
// ASCII
case
437
:
return
'CP437'
;
break
;
// OEM US
case
720
:
throw
new
PHPExcel_Exception
(
'Code page 720 not supported.'
);
break
;
// OEM Arabic
case
737
:
return
'CP737'
;
break
;
// OEM Greek
case
775
:
return
'CP775'
;
break
;
// OEM Baltic
case
850
:
return
'CP850'
;
break
;
// OEM Latin I
case
852
:
return
'CP852'
;
break
;
// OEM Latin II (Central European)
case
855
:
return
'CP855'
;
break
;
// OEM Cyrillic
case
857
:
return
'CP857'
;
break
;
// OEM Turkish
case
858
:
return
'CP858'
;
break
;
// OEM Multilingual Latin I with Euro
case
860
:
return
'CP860'
;
break
;
// OEM Portugese
case
861
:
return
'CP861'
;
break
;
// OEM Icelandic
case
862
:
return
'CP862'
;
break
;
// OEM Hebrew
case
863
:
return
'CP863'
;
break
;
// OEM Canadian (French)
case
864
:
return
'CP864'
;
break
;
// OEM Arabic
case
865
:
return
'CP865'
;
break
;
// OEM Nordic
case
866
:
return
'CP866'
;
break
;
// OEM Cyrillic (Russian)
case
869
:
return
'CP869'
;
break
;
// OEM Greek (Modern)
case
874
:
return
'CP874'
;
break
;
// ANSI Thai
case
932
:
return
'CP932'
;
break
;
// ANSI Japanese Shift-JIS
case
936
:
return
'CP936'
;
break
;
// ANSI Chinese Simplified GBK
case
949
:
return
'CP949'
;
break
;
// ANSI Korean (Wansung)
case
950
:
return
'CP950'
;
break
;
// ANSI Chinese Traditional BIG5
case
1200
:
return
'UTF-16LE'
;
break
;
// UTF-16 (BIFF8)
case
1250
:
return
'CP1250'
;
break
;
// ANSI Latin II (Central European)
case
1251
:
return
'CP1251'
;
break
;
// ANSI Cyrillic
case
0
:
// CodePage is not always correctly set when the xls file was saved by Apple's Numbers program
case
1252
:
return
'CP1252'
;
break
;
// ANSI Latin I (BIFF4-BIFF7)
case
1253
:
return
'CP1253'
;
break
;
// ANSI Greek
case
1254
:
return
'CP1254'
;
break
;
// ANSI Turkish
case
1255
:
return
'CP1255'
;
break
;
// ANSI Hebrew
case
1256
:
return
'CP1256'
;
break
;
// ANSI Arabic
case
1257
:
return
'CP1257'
;
break
;
// ANSI Baltic
case
1258
:
return
'CP1258'
;
break
;
// ANSI Vietnamese
case
1361
:
return
'CP1361'
;
break
;
// ANSI Korean (Johab)
case
10000
:
return
'MAC'
;
break
;
// Apple Roman
case
10006
:
return
'MACGREEK'
;
break
;
// Macintosh Greek
case
10007
:
return
'MACCYRILLIC'
;
break
;
// Macintosh Cyrillic
case
10008
:
return
'CP936'
;
break
;
// Macintosh - Simplified Chinese (GB 2312)
case
10029
:
return
'MACCENTRALEUROPE'
;
break
;
// Macintosh Central Europe
case
10079
:
return
'MACICELAND'
;
break
;
// Macintosh Icelandic
case
10081
:
return
'MACTURKISH'
;
break
;
// Macintosh Turkish
case
32768
:
return
'MAC'
;
break
;
// Apple Roman
case
32769
:
throw
new
PHPExcel_Exception
(
'Code page 32769 not supported.'
);
break
;
// ANSI Latin I (BIFF2-BIFF3)
case
65000
:
return
'UTF-7'
;
break
;
// Unicode (UTF-7)
case
65001
:
return
'UTF-8'
;
break
;
// Unicode (UTF-8)
}
throw
new
PHPExcel_Exception
(
'Unknown codepage: '
.
$codePage
);
}
}
lib/Classes/PHPExcel/Shared/Date.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Shared
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_Shared_Date
*
* @category PHPExcel
* @package PHPExcel_Shared
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Shared_Date
{
/** constants */
const
CALENDAR_WINDOWS_1900
=
1900
;
// Base date of 1st Jan 1900 = 1.0
const
CALENDAR_MAC_1904
=
1904
;
// Base date of 2nd Jan 1904 = 1.0
/*
* Names of the months of the year, indexed by shortname
* Planned usage for locale settings
*
* @public
* @var string[]
*/
public
static
$_monthNames
=
array
(
'Jan'
=>
'January'
,
'Feb'
=>
'February'
,
'Mar'
=>
'March'
,
'Apr'
=>
'April'
,
'May'
=>
'May'
,
'Jun'
=>
'June'
,
'Jul'
=>
'July'
,
'Aug'
=>
'August'
,
'Sep'
=>
'September'
,
'Oct'
=>
'October'
,
'Nov'
=>
'November'
,
'Dec'
=>
'December'
,
);
/*
* Names of the months of the year, indexed by shortname
* Planned usage for locale settings
*
* @public
* @var string[]
*/
public
static
$_numberSuffixes
=
array
(
'st'
,
'nd'
,
'rd'
,
'th'
,
);
/*
* Base calendar year to use for calculations
*
* @private
* @var int
*/
protected
static
$_excelBaseDate
=
self
::
CALENDAR_WINDOWS_1900
;
/**
* Set the Excel calendar (Windows 1900 or Mac 1904)
*
* @param integer $baseDate Excel base date (1900 or 1904)
* @return boolean Success or failure
*/
public
static
function
setExcelCalendar
(
$baseDate
)
{
if
((
$baseDate
==
self
::
CALENDAR_WINDOWS_1900
)
||
(
$baseDate
==
self
::
CALENDAR_MAC_1904
))
{
self
::
$_excelBaseDate
=
$baseDate
;
return
TRUE
;
}
return
FALSE
;
}
// function setExcelCalendar()
/**
* Return the Excel calendar (Windows 1900 or Mac 1904)
*
* @return integer Excel base date (1900 or 1904)
*/
public
static
function
getExcelCalendar
()
{
return
self
::
$_excelBaseDate
;
}
// function getExcelCalendar()
/**
* Convert a date from Excel to PHP
*
* @param long $dateValue Excel date/time value
* @param boolean $adjustToTimezone Flag indicating whether $dateValue should be treated as
* a UST timestamp, or adjusted to UST
* @param string $timezone The timezone for finding the adjustment from UST
* @return long PHP serialized date/time
*/
public
static
function
ExcelToPHP
(
$dateValue
=
0
,
$adjustToTimezone
=
FALSE
,
$timezone
=
NULL
)
{
if
(
self
::
$_excelBaseDate
==
self
::
CALENDAR_WINDOWS_1900
)
{
$my_excelBaseDate
=
25569
;
// Adjust for the spurious 29-Feb-1900 (Day 60)
if
(
$dateValue
<
60
)
{
--
$my_excelBaseDate
;
}
}
else
{
$my_excelBaseDate
=
24107
;
}
// Perform conversion
if
(
$dateValue
>=
1
)
{
$utcDays
=
$dateValue
-
$my_excelBaseDate
;
$returnValue
=
round
(
$utcDays
*
86400
);
if
((
$returnValue
<=
PHP_INT_MAX
)
&&
(
$returnValue
>=
-
PHP_INT_MAX
))
{
$returnValue
=
(
integer
)
$returnValue
;
}
}
else
{
$hours
=
round
(
$dateValue
*
24
);
$mins
=
round
(
$dateValue
*
1440
)
-
round
(
$hours
*
60
);
$secs
=
round
(
$dateValue
*
86400
)
-
round
(
$hours
*
3600
)
-
round
(
$mins
*
60
);
$returnValue
=
(
integer
)
gmmktime
(
$hours
,
$mins
,
$secs
);
}
$timezoneAdjustment
=
(
$adjustToTimezone
)
?
PHPExcel_Shared_TimeZone
::
getTimezoneAdjustment
(
$timezone
,
$returnValue
)
:
0
;
// Return
return
$returnValue
+
$timezoneAdjustment
;
}
// function ExcelToPHP()
/**
* Convert a date from Excel to a PHP Date/Time object
*
* @param integer $dateValue Excel date/time value
* @return integer PHP date/time object
*/
public
static
function
ExcelToPHPObject
(
$dateValue
=
0
)
{
$dateTime
=
self
::
ExcelToPHP
(
$dateValue
);
$days
=
floor
(
$dateTime
/
86400
);
$time
=
round
(((
$dateTime
/
86400
)
-
$days
)
*
86400
);
$hours
=
round
(
$time
/
3600
);
$minutes
=
round
(
$time
/
60
)
-
(
$hours
*
60
);
$seconds
=
round
(
$time
)
-
(
$hours
*
3600
)
-
(
$minutes
*
60
);
$dateObj
=
date_create
(
'1-Jan-1970+'
.
$days
.
' days'
);
$dateObj
->
setTime
(
$hours
,
$minutes
,
$seconds
);
return
$dateObj
;
}
// function ExcelToPHPObject()
/**
* Convert a date from PHP to Excel
*
* @param mixed $dateValue PHP serialized date/time or date object
* @param boolean $adjustToTimezone Flag indicating whether $dateValue should be treated as
* a UST timestamp, or adjusted to UST
* @param string $timezone The timezone for finding the adjustment from UST
* @return mixed Excel date/time value
* or boolean FALSE on failure
*/
public
static
function
PHPToExcel
(
$dateValue
=
0
,
$adjustToTimezone
=
FALSE
,
$timezone
=
NULL
)
{
$saveTimeZone
=
date_default_timezone_get
();
date_default_timezone_set
(
'UTC'
);
$retValue
=
FALSE
;
if
((
is_object
(
$dateValue
))
&&
(
$dateValue
instanceof
DateTime
))
{
$retValue
=
self
::
FormattedPHPToExcel
(
$dateValue
->
format
(
'Y'
),
$dateValue
->
format
(
'm'
),
$dateValue
->
format
(
'd'
),
$dateValue
->
format
(
'H'
),
$dateValue
->
format
(
'i'
),
$dateValue
->
format
(
's'
)
);
}
elseif
(
is_numeric
(
$dateValue
))
{
$retValue
=
self
::
FormattedPHPToExcel
(
date
(
'Y'
,
$dateValue
),
date
(
'm'
,
$dateValue
),
date
(
'd'
,
$dateValue
),
date
(
'H'
,
$dateValue
),
date
(
'i'
,
$dateValue
),
date
(
's'
,
$dateValue
)
);
}
date_default_timezone_set
(
$saveTimeZone
);
return
$retValue
;
}
// function PHPToExcel()
/**
* FormattedPHPToExcel
*
* @param long $year
* @param long $month
* @param long $day
* @param long $hours
* @param long $minutes
* @param long $seconds
* @return long Excel date/time value
*/
public
static
function
FormattedPHPToExcel
(
$year
,
$month
,
$day
,
$hours
=
0
,
$minutes
=
0
,
$seconds
=
0
)
{
if
(
self
::
$_excelBaseDate
==
self
::
CALENDAR_WINDOWS_1900
)
{
//
// Fudge factor for the erroneous fact that the year 1900 is treated as a Leap Year in MS Excel
// This affects every date following 28th February 1900
//
$excel1900isLeapYear
=
TRUE
;
if
((
$year
==
1900
)
&&
(
$month
<=
2
))
{
$excel1900isLeapYear
=
FALSE
;
}
$my_excelBaseDate
=
2415020
;
}
else
{
$my_excelBaseDate
=
2416481
;
$excel1900isLeapYear
=
FALSE
;
}
// Julian base date Adjustment
if
(
$month
>
2
)
{
$month
-=
3
;
}
else
{
$month
+=
9
;
--
$year
;
}
// Calculate the Julian Date, then subtract the Excel base date (JD 2415020 = 31-Dec-1899 Giving Excel Date of 0)
$century
=
substr
(
$year
,
0
,
2
);
$decade
=
substr
(
$year
,
2
,
2
);
$excelDate
=
floor
((
146097
*
$century
)
/
4
)
+
floor
((
1461
*
$decade
)
/
4
)
+
floor
((
153
*
$month
+
2
)
/
5
)
+
$day
+
1721119
-
$my_excelBaseDate
+
$excel1900isLeapYear
;
$excelTime
=
((
$hours
*
3600
)
+
(
$minutes
*
60
)
+
$seconds
)
/
86400
;
return
(
float
)
$excelDate
+
$excelTime
;
}
// function FormattedPHPToExcel()
/**
* Is a given cell a date/time?
*
* @param PHPExcel_Cell $pCell
* @return boolean
*/
public
static
function
isDateTime
(
PHPExcel_Cell
$pCell
)
{
return
self
::
isDateTimeFormat
(
$pCell
->
getWorksheet
()
->
getStyle
(
$pCell
->
getCoordinate
()
)
->
getNumberFormat
()
);
}
// function isDateTime()
/**
* Is a given number format a date/time?
*
* @param PHPExcel_Style_NumberFormat $pFormat
* @return boolean
*/
public
static
function
isDateTimeFormat
(
PHPExcel_Style_NumberFormat
$pFormat
)
{
return
self
::
isDateTimeFormatCode
(
$pFormat
->
getFormatCode
());
}
// function isDateTimeFormat()
private
static
$possibleDateFormatCharacters
=
'eymdHs'
;
/**
* Is a given number format code a date/time?
*
* @param string $pFormatCode
* @return boolean
*/
public
static
function
isDateTimeFormatCode
(
$pFormatCode
=
''
)
{
if
(
strtolower
(
$pFormatCode
)
===
strtolower
(
PHPExcel_Style_NumberFormat
::
FORMAT_GENERAL
))
// "General" contains an epoch letter 'e', so we trap for it explicitly here (case-insensitive check)
return
FALSE
;
if
(
preg_match
(
'/[0#]E[+-]0/i'
,
$pFormatCode
))
// Scientific format
return
FALSE
;
// Switch on formatcode
switch
(
$pFormatCode
)
{
// Explicitly defined date formats
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_YYYYMMDD
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_YYYYMMDD2
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_DDMMYYYY
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_DMYSLASH
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_DMYMINUS
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_DMMINUS
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_MYMINUS
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_DATETIME
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_TIME1
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_TIME2
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_TIME3
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_TIME4
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_TIME5
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_TIME6
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_TIME7
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_TIME8
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_YYYYMMDDSLASH
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_XLSX14
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_XLSX15
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_XLSX16
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_XLSX17
:
case
PHPExcel_Style_NumberFormat
::
FORMAT_DATE_XLSX22
:
return
TRUE
;
}
// Typically number, currency or accounting (or occasionally fraction) formats
if
((
substr
(
$pFormatCode
,
0
,
1
)
==
'_'
)
||
(
substr
(
$pFormatCode
,
0
,
2
)
==
'0 '
))
{
return
FALSE
;
}
// Try checking for any of the date formatting characters that don't appear within square braces
if
(
preg_match
(
'/(^|\])[^\[]*['
.
self
::
$possibleDateFormatCharacters
.
']/i'
,
$pFormatCode
))
{
// We might also have a format mask containing quoted strings...
// we don't want to test for any of our characters within the quoted blocks
if
(
strpos
(
$pFormatCode
,
'"'
)
!==
FALSE
)
{
$segMatcher
=
FALSE
;
foreach
(
explode
(
'"'
,
$pFormatCode
)
as
$subVal
)
{
// Only test in alternate array entries (the non-quoted blocks)
if
((
$segMatcher
=
!
$segMatcher
)
&&
(
preg_match
(
'/(^|\])[^\[]*['
.
self
::
$possibleDateFormatCharacters
.
']/i'
,
$subVal
)))
{
return
TRUE
;
}
}
return
FALSE
;
}
return
TRUE
;
}
// No date...
return
FALSE
;
}
// function isDateTimeFormatCode()
/**
* Convert a date/time string to Excel time
*
* @param string $dateValue Examples: '2009-12-31', '2009-12-31 15:59', '2009-12-31 15:59:10'
* @return float|FALSE Excel date/time serial value
*/
public
static
function
stringToExcel
(
$dateValue
=
''
)
{
if
(
strlen
(
$dateValue
)
<
2
)
return
FALSE
;
if
(
!
preg_match
(
'/^(\d{1,4}[ \.\/\-][A-Z]{3,9}([ \.\/\-]\d{1,4})?|[A-Z]{3,9}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?|\d{1,4}[ \.\/\-]\d{1,4}([ \.\/\-]\d{1,4})?)( \d{1,2}:\d{1,2}(:\d{1,2})?)?$/iu'
,
$dateValue
))
return
FALSE
;
$dateValueNew
=
PHPExcel_Calculation_DateTime
::
DATEVALUE
(
$dateValue
);
if
(
$dateValueNew
===
PHPExcel_Calculation_Functions
::
VALUE
())
{
return
FALSE
;
}
else
{
if
(
strpos
(
$dateValue
,
':'
)
!==
FALSE
)
{
$timeValue
=
PHPExcel_Calculation_DateTime
::
TIMEVALUE
(
$dateValue
);
if
(
$timeValue
===
PHPExcel_Calculation_Functions
::
VALUE
())
{
return
FALSE
;
}
$dateValueNew
+=
$timeValue
;
}
return
$dateValueNew
;
}
}
public
static
function
monthStringToNumber
(
$month
)
{
$monthIndex
=
1
;
foreach
(
self
::
$_monthNames
as
$shortMonthName
=>
$longMonthName
)
{
if
((
$month
===
$longMonthName
)
||
(
$month
===
$shortMonthName
))
{
return
$monthIndex
;
}
++
$monthIndex
;
}
return
$month
;
}
public
static
function
dayStringToNumber
(
$day
)
{
$strippedDayValue
=
(
str_replace
(
self
::
$_numberSuffixes
,
''
,
$day
));
if
(
is_numeric
(
$strippedDayValue
))
{
return
$strippedDayValue
;
}
return
$day
;
}
}
lib/Classes/PHPExcel/Shared/Drawing.php
0 → 100644
View file @
9f4f2745
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2014 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Shared
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version 1.8.0, 2014-03-02
*/
/**
* PHPExcel_Shared_Drawing
*
* @category PHPExcel
* @package PHPExcel_Shared
* @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class
PHPExcel_Shared_Drawing
{
/**
* Convert pixels to EMU
*
* @param int $pValue Value in pixels
* @return int Value in EMU
*/
public
static
function
pixelsToEMU
(
$pValue
=
0
)
{
return
round
(
$pValue
*
9525
);
}
/**
* Convert EMU to pixels
*
* @param int $pValue Value in EMU
* @return int Value in pixels
*/
public
static
function
EMUToPixels
(
$pValue
=
0
)
{
if
(
$pValue
!=
0
)
{
return
round
(
$pValue
/
9525
);
}
else
{
return
0
;
}
}
/**
* Convert pixels to column width. Exact algorithm not known.
* By inspection of a real Excel file using Calibri 11, one finds 1000px ~ 142.85546875
* This gives a conversion factor of 7. Also, we assume that pixels and font size are proportional.
*
* @param int $pValue Value in pixels
* @param PHPExcel_Style_Font $pDefaultFont Default font of the workbook
* @return int Value in cell dimension
*/
public
static
function
pixelsToCellDimension
(
$pValue
=
0
,
PHPExcel_Style_Font
$pDefaultFont
)
{
// Font name and size
$name
=
$pDefaultFont
->
getName
();
$size
=
$pDefaultFont
->
getSize
();
if
(
isset
(
PHPExcel_Shared_Font
::
$defaultColumnWidths
[
$name
][
$size
]))
{
// Exact width can be determined
$colWidth
=
$pValue
*
PHPExcel_Shared_Font
::
$defaultColumnWidths
[
$name
][
$size
][
'width'
]
/
PHPExcel_Shared_Font
::
$defaultColumnWidths
[
$name
][
$size
][
'px'
];
}
else
{
// We don't have data for this particular font and size, use approximation by
// extrapolating from Calibri 11
$colWidth
=
$pValue
*
11
*
PHPExcel_Shared_Font
::
$defaultColumnWidths
[
'Calibri'
][
11
][
'width'
]
/
PHPExcel_Shared_Font
::
$defaultColumnWidths
[
'Calibri'
][
11
][
'px'
]
/
$size
;
}
return
$colWidth
;
}
/**
* Convert column width from (intrinsic) Excel units to pixels
*
* @param float $pValue Value in cell dimension
* @param PHPExcel_Style_Font $pDefaultFont Default font of the workbook
* @return int Value in pixels
*/
public
static
function
cellDimensionToPixels
(
$pValue
=
0
,
PHPExcel_Style_Font
$pDefaultFont
)
{
// Font name and size
$name
=
$pDefaultFont
->
getName
();
$size
=
$pDefaultFont
->
getSize
();
if
(
isset
(
PHPExcel_Shared_Font
::
$defaultColumnWidths
[
$name
][
$size
]))
{
// Exact width can be determined
$colWidth
=
$pValue
*
PHPExcel_Shared_Font
::
$defaultColumnWidths
[
$name
][
$size
][
'px'
]
/
PHPExcel_Shared_Font
::
$defaultColumnWidths
[
$name
][
$size
][
'width'
];
}
else
{
// We don't have data for this particular font and size, use approximation by
// extrapolating from Calibri 11
$colWidth
=
$pValue
*
$size
*
PHPExcel_Shared_Font
::
$defaultColumnWidths
[
'Calibri'
][
11
][
'px'
]
/
PHPExcel_Shared_Font
::
$defaultColumnWidths
[
'Calibri'
][
11
][
'width'
]
/
11
;
}
// Round pixels to closest integer
$colWidth
=
(
int
)
round
(
$colWidth
);
return
$colWidth
;
}
/**
* Convert pixels to points
*
* @param int $pValue Value in pixels
* @return int Value in points
*/
public
static
function
pixelsToPoints
(
$pValue
=
0
)
{
return
$pValue
*
0.67777777
;
}
/**
* Convert points to pixels
*
* @param int $pValue Value in points
* @return int Value in pixels
*/
public
static
function
pointsToPixels
(
$pValue
=
0
)
{
if
(
$pValue
!=
0
)
{
return
(
int
)
ceil
(
$pValue
*
1.333333333
);
}
else
{
return
0
;
}
}
/**
* Convert degrees to angle
*
* @param int $pValue Degrees
* @return int Angle
*/
public
static
function
degreesToAngle
(
$pValue
=
0
)
{
return
(
int
)
round
(
$pValue
*
60000
);
}
/**
* Convert angle to degrees
*
* @param int $pValue Angle
* @return int Degrees
*/
public
static
function
angleToDegrees
(
$pValue
=
0
)
{
if
(
$pValue
!=
0
)
{
return
round
(
$pValue
/
60000
);
}
else
{
return
0
;
}
}
/**
* Create a new image from file. By alexander at alexauto dot nl
*
* @link http://www.php.net/manual/en/function.imagecreatefromwbmp.php#86214
* @param string $filename Path to Windows DIB (BMP) image
* @return resource
*/
public
static
function
imagecreatefrombmp
(
$p_sFile
)
{
// Load the image into a string
$file
=
fopen
(
$p_sFile
,
"rb"
);
$read
=
fread
(
$file
,
10
);
while
(
!
feof
(
$file
)
&&
(
$read
<>
""
))
$read
.
=
fread
(
$file
,
1024
);
$temp
=
unpack
(
"H*"
,
$read
);
$hex
=
$temp
[
1
];
$header
=
substr
(
$hex
,
0
,
108
);
// Process the header
// Structure: http://www.fastgraph.com/help/bmp_header_format.html
if
(
substr
(
$header
,
0
,
4
)
==
"424d"
)
{
// Cut it in parts of 2 bytes
$header_parts
=
str_split
(
$header
,
2
);
// Get the width 4 bytes
$width
=
hexdec
(
$header_parts
[
19
]
.
$header_parts
[
18
]);
// Get the height 4 bytes
$height
=
hexdec
(
$header_parts
[
23
]
.
$header_parts
[
22
]);
// Unset the header params
unset
(
$header_parts
);
}
// Define starting X and Y
$x
=
0
;
$y
=
1
;
// Create newimage
$image
=
imagecreatetruecolor
(
$width
,
$height
);
// Grab the body from the image
$body
=
substr
(
$hex
,
108
);
// Calculate if padding at the end-line is needed
// Divided by two to keep overview.
// 1 byte = 2 HEX-chars
$body_size
=
(
strlen
(
$body
)
/
2
);
$header_size
=
(
$width
*
$height
);
// Use end-line padding? Only when needed
$usePadding
=
(
$body_size
>
(
$header_size
*
3
)
+
4
);
// Using a for-loop with index-calculation instaid of str_split to avoid large memory consumption
// Calculate the next DWORD-position in the body
for
(
$i
=
0
;
$i
<
$body_size
;
$i
+=
3
)
{
// Calculate line-ending and padding
if
(
$x
>=
$width
)
{
// If padding needed, ignore image-padding
// Shift i to the ending of the current 32-bit-block
if
(
$usePadding
)
$i
+=
$width
%
4
;
// Reset horizontal position
$x
=
0
;
// Raise the height-position (bottom-up)
$y
++
;
// Reached the image-height? Break the for-loop
if
(
$y
>
$height
)
break
;
}
// Calculation of the RGB-pixel (defined as BGR in image-data)
// Define $i_pos as absolute position in the body
$i_pos
=
$i
*
2
;
$r
=
hexdec
(
$body
[
$i_pos
+
4
]
.
$body
[
$i_pos
+
5
]);
$g
=
hexdec
(
$body
[
$i_pos
+
2
]
.
$body
[
$i_pos
+
3
]);
$b
=
hexdec
(
$body
[
$i_pos
]
.
$body
[
$i_pos
+
1
]);
// Calculate and draw the pixel
$color
=
imagecolorallocate
(
$image
,
$r
,
$g
,
$b
);
imagesetpixel
(
$image
,
$x
,
$height
-
$y
,
$color
);
// Raise the horizontal position
$x
++
;
}
// Unset the body / free the memory
unset
(
$body
);
// Return image-object
return
$image
;
}
}
Prev
1
…
7
8
9
10
11
12
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment