3c4b566f
Mihail
add XlsxParser
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?php
/**
* Created by PhpStorm.
* User: Tsurkanov
* Date: 21.10.2015
* Time: 15:44
*/
namespace yii\multiparser;
use common\components\CustomVarDamp;
|
95c167d6
Mihail
add managing with...
|
15
16
17
18
|
/**
* Class XlsxParser
* @package yii\multiparser
*/
|
3c4b566f
Mihail
add XlsxParser
|
19
|
class XlsxParser extends Parser {
|
95c167d6
Mihail
add managing with...
|
20
21
22
23
|
/**
* @var string - путь куда будут распаковываться файлы, если не указанно - во временный каталог сервера
*/
|
3c4b566f
Mihail
add XlsxParser
|
24
|
public $path_for_extract_files = '';
|
95c167d6
Mihail
add managing with...
|
25
26
27
28
29
30
31
32
33
34
35
36
37
|
/** @var bool
имеет ли файл заголовок который будет установлен ключами возвращемого массива*/
public $hasHeaderRow = false;
/**
* @var int - если указано то считывание будет производиться с этого листа, иначе со всех листов
* при чтении со всех листов - выходной массив будет иметь номера листов первыми элементами
*/
public $active_sheet = 0;
protected $strings_arr = [];
protected $sheets_arr = [];
protected $result_arr = [];
|
3c4b566f
Mihail
add XlsxParser
|
38
39
40
41
42
43
44
45
46
47
48
49
|
public function setup()
{
parent::setup();
if ( $this->path_for_extract_files == '' ) {
$this->path_for_extract_files = sys_get_temp_dir();
}
}
public function read()
{
|
3c4b566f
Mihail
add XlsxParser
|
50
|
|
95c167d6
Mihail
add managing with...
|
51
52
53
54
55
56
57
58
|
// $this->extractFiles();
$this->readSheets();
$this->readStrings();
$this->readValues();
CustomVarDamp::dumpAndDie($this->result_arr);
// return $this->$result_arr;
|
3c4b566f
Mihail
add XlsxParser
|
59
60
61
62
63
64
65
66
67
|
}
protected function extractFiles ()
{
$zip = new \ZipArchive;
if ( $zip->open( $this->file->getPathname() ) === TRUE ) {
$zip->extractTo( $this->path_for_extract_files );
$zip->close();
} else {
|
95c167d6
Mihail
add managing with...
|
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
throw new \Exception( 'Ошибка чтения xlsx файла' );
}
}
protected function readSheets ()
{
if ( $this->active_sheet ) {
$this->sheets_arr[ $this->active_sheet ] = 'Sheet' . $this->active_sheet;
return;
}
$xml = simplexml_load_file( $this->path_for_extract_files . '/xl/workbook.xml' );
foreach ( $xml->sheets->children() as $sheet ) {
$sheet_name = '';
$sheet_id = 0;
$attr = $sheet->attributes();
foreach ( $attr as $name => $value ) {
if ($name == 'name')
$sheet_name = (string)$value;
if ($name == 'sheetId')
$sheet_id = $value;
}
if ( $sheet_name && $sheet_id ) {
$this->sheets_arr[$sheet_name] = 'Sheet' . $sheet_id;
}
//
}
}
protected function readStrings ()
{
$xml = simplexml_load_file( $this->path_for_extract_files . '/xl/sharedStrings.xml' );
foreach ( $xml->children() as $item ) {
$this->strings_arr[] = (string)$item->t;
|
3c4b566f
Mihail
add XlsxParser
|
104
105
106
|
}
}
|
95c167d6
Mihail
add managing with...
|
107
|
protected function readValues ()
|
3c4b566f
Mihail
add XlsxParser
|
108
|
{
|
95c167d6
Mihail
add managing with...
|
109
110
|
//foreach ( glob($this->path_for_extract_files . '/xl/worksheets/*.xml' ) as $sheet ) {
foreach ( $this->sheets_arr as $sheet ) {
|
3c4b566f
Mihail
add XlsxParser
|
111
112
|
//проходим по всем файлам из директории /xl/worksheets/
//CustomVarDamp::dumpAndDie($sheet);
|
95c167d6
Mihail
add managing with...
|
113
114
115
|
$sheet_path = $this->path_for_extract_files . '/xl/worksheets/' . $sheet . '.xml';
if ( file_exists( $sheet_path ) && is_readable( $sheet_path ) ) {
$xml = simplexml_load_file( $sheet_path );
|
3c4b566f
Mihail
add XlsxParser
|
116
|
//по каждой строке
|
95c167d6
Mihail
add managing with...
|
117
118
119
120
121
|
$current_row = 0;
foreach ( $xml->sheetData->row as $row_values ) {
$this->readRowValues( $row_values, $sheet , $current_row );
$current_row++;
|
3c4b566f
Mihail
add XlsxParser
|
122
123
124
|
}
}
}
|
95c167d6
Mihail
add managing with...
|
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
}
protected function readRowValues ( $item, $sheet , $current_row )
{
$this->result_arr[$sheet][$current_row] = array();
//по каждой ячейке строки
$cell = 0;
foreach ( $item as $child ) {
$attr = $child->attributes();
if( isset($child->v) ) {
$value = (string)$child->v;
}else{
$value = false;
}
if ( isset( $attr['t'] ) ) {
$this->result_arr[$sheet][$current_row][$cell] = $this->strings_arr[ $value ];
}else{
$this->result_arr[$sheet][$current_row][$cell] = $value;
}
$cell++;
}
|
3c4b566f
Mihail
add XlsxParser
|
148
149
|
}
}
|