Commit 95c167d67377f1aeffcacc43c223ca517066e3bf
1 parent
3c4b566f
add managing with sheets to XlsxParser
Showing
2 changed files
with
101 additions
and
39 deletions
Show diff stats
vendor/yiisoft/multiparser/CsvParser.php
@@ -141,15 +141,9 @@ class CsvParser extends Parser | @@ -141,15 +141,9 @@ class CsvParser extends Parser | ||
141 | $return[] = $row; | 141 | $return[] = $row; |
142 | } | 142 | } |
143 | 143 | ||
144 | - $this->closeHandler(); | ||
145 | return $return; | 144 | return $return; |
146 | } | 145 | } |
147 | - | ||
148 | - | ||
149 | - protected function closeHandler() | ||
150 | - { | ||
151 | - $this->file = NULL; | ||
152 | - } | 146 | + |
153 | 147 | ||
154 | /** | 148 | /** |
155 | * @return array - одномерный массив результата парсинга строки | 149 | * @return array - одномерный массив результата парсинга строки |
@@ -167,7 +161,7 @@ class CsvParser extends Parser | @@ -167,7 +161,7 @@ class CsvParser extends Parser | ||
167 | if ($this->hasHeaderRow && $this->keys !== NULL) { | 161 | if ($this->hasHeaderRow && $this->keys !== NULL) { |
168 | 162 | ||
169 | if (count($this->keys) !== count($row)) { | 163 | if (count($this->keys) !== count($row)) { |
170 | - throw new \ErrorException("Ошибка парсинга файла в строке # {$this->current_line}. Не соответсвие числа ключевых колонок (заголовка) - числу колонок с данными", 0, 1, $this->file->getBasename(), $this->current_line); | 164 | + throw new \Exception("Ошибка парсинга файла в строке # {$this->current_line}. Не соответсвие числа ключевых колонок (заголовка) - числу колонок с данными", 0, 1, $this->file->getBasename(), $this->current_line); |
171 | } | 165 | } |
172 | 166 | ||
173 | $row = array_combine($this->keys, $row); | 167 | $row = array_combine($this->keys, $row); |
vendor/yiisoft/multiparser/XlsxParser.php
@@ -12,8 +12,29 @@ namespace yii\multiparser; | @@ -12,8 +12,29 @@ namespace yii\multiparser; | ||
12 | use common\components\CustomVarDamp; | 12 | use common\components\CustomVarDamp; |
13 | 13 | ||
14 | 14 | ||
15 | +/** | ||
16 | + * Class XlsxParser | ||
17 | + * @package yii\multiparser | ||
18 | + */ | ||
15 | class XlsxParser extends Parser { | 19 | class XlsxParser extends Parser { |
20 | + | ||
21 | + /** | ||
22 | + * @var string - путь куда будут распаковываться файлы, если не указанно - во временный каталог сервера | ||
23 | + */ | ||
16 | public $path_for_extract_files = ''; | 24 | public $path_for_extract_files = ''; |
25 | + /** @var bool | ||
26 | + имеет ли файл заголовок который будет установлен ключами возвращемого массива*/ | ||
27 | + public $hasHeaderRow = false; | ||
28 | + | ||
29 | + /** | ||
30 | + * @var int - если указано то считывание будет производиться с этого листа, иначе со всех листов | ||
31 | + * при чтении со всех листов - выходной массив будет иметь номера листов первыми элементами | ||
32 | + */ | ||
33 | + public $active_sheet = 0; | ||
34 | + | ||
35 | + protected $strings_arr = []; | ||
36 | + protected $sheets_arr = []; | ||
37 | + protected $result_arr = []; | ||
17 | 38 | ||
18 | public function setup() | 39 | public function setup() |
19 | { | 40 | { |
@@ -26,10 +47,15 @@ class XlsxParser extends Parser { | @@ -26,10 +47,15 @@ class XlsxParser extends Parser { | ||
26 | 47 | ||
27 | public function read() | 48 | public function read() |
28 | { | 49 | { |
29 | - //$this->extractFiles(); | ||
30 | - CustomVarDamp::dumpAndDie($this->parse()); | ||
31 | 50 | ||
32 | - // return $this->parse(); | 51 | + // $this->extractFiles(); |
52 | + | ||
53 | + $this->readSheets(); | ||
54 | + $this->readStrings(); | ||
55 | + $this->readValues(); | ||
56 | + | ||
57 | + CustomVarDamp::dumpAndDie($this->result_arr); | ||
58 | + // return $this->$result_arr; | ||
33 | } | 59 | } |
34 | 60 | ||
35 | protected function extractFiles () | 61 | protected function extractFiles () |
@@ -39,43 +65,85 @@ class XlsxParser extends Parser { | @@ -39,43 +65,85 @@ class XlsxParser extends Parser { | ||
39 | $zip->extractTo( $this->path_for_extract_files ); | 65 | $zip->extractTo( $this->path_for_extract_files ); |
40 | $zip->close(); | 66 | $zip->close(); |
41 | } else { | 67 | } else { |
42 | - throw new \Exception('Ошибка чтения xlsx файла'); | 68 | + throw new \Exception( 'Ошибка чтения xlsx файла' ); |
69 | + } | ||
70 | + } | ||
71 | + | ||
72 | + protected function readSheets () | ||
73 | + { | ||
74 | + if ( $this->active_sheet ) { | ||
75 | + $this->sheets_arr[ $this->active_sheet ] = 'Sheet' . $this->active_sheet; | ||
76 | + return; | ||
77 | + } | ||
78 | + | ||
79 | + $xml = simplexml_load_file( $this->path_for_extract_files . '/xl/workbook.xml' ); | ||
80 | + foreach ( $xml->sheets->children() as $sheet ) { | ||
81 | + $sheet_name = ''; | ||
82 | + $sheet_id = 0; | ||
83 | + $attr = $sheet->attributes(); | ||
84 | + foreach ( $attr as $name => $value ) { | ||
85 | + if ($name == 'name') | ||
86 | + $sheet_name = (string)$value; | ||
87 | + | ||
88 | + if ($name == 'sheetId') | ||
89 | + $sheet_id = $value; | ||
90 | + | ||
91 | + } | ||
92 | + if ( $sheet_name && $sheet_id ) { | ||
93 | + $this->sheets_arr[$sheet_name] = 'Sheet' . $sheet_id; | ||
94 | + } | ||
95 | +// | ||
96 | + } | ||
97 | + } | ||
98 | + | ||
99 | + protected function readStrings () | ||
100 | + { | ||
101 | + $xml = simplexml_load_file( $this->path_for_extract_files . '/xl/sharedStrings.xml' ); | ||
102 | + foreach ( $xml->children() as $item ) { | ||
103 | + $this->strings_arr[] = (string)$item->t; | ||
43 | } | 104 | } |
44 | } | 105 | } |
45 | 106 | ||
46 | - protected function parse () | 107 | + protected function readValues () |
47 | { | 108 | { |
48 | - $result = []; | ||
49 | - // while ($sheet = @readdir($this->file)) { | ||
50 | - foreach ( glob($this->path_for_extract_files . '/xl/worksheets/*.xml' ) as $sheet ) { | 109 | + //foreach ( glob($this->path_for_extract_files . '/xl/worksheets/*.xml' ) as $sheet ) { |
110 | + foreach ( $this->sheets_arr as $sheet ) { | ||
51 | //проходим по всем файлам из директории /xl/worksheets/ | 111 | //проходим по всем файлам из директории /xl/worksheets/ |
52 | //CustomVarDamp::dumpAndDie($sheet); | 112 | //CustomVarDamp::dumpAndDie($sheet); |
53 | - if ($sheet != "." && $sheet != ".." && $sheet != '_rels') { | ||
54 | - $xml = simplexml_load_file( $sheet ); | 113 | + $sheet_path = $this->path_for_extract_files . '/xl/worksheets/' . $sheet . '.xml'; |
114 | + if ( file_exists( $sheet_path ) && is_readable( $sheet_path ) ) { | ||
115 | + $xml = simplexml_load_file( $sheet_path ); | ||
55 | //по каждой строке | 116 | //по каждой строке |
56 | - $row = 0; | ||
57 | - | ||
58 | - foreach ( $xml->sheetData->row as $item ) { | ||
59 | - $result[$sheet][$row] = array(); | ||
60 | - //по каждой ячейке строки | ||
61 | - $cell = 0; | ||
62 | - foreach ( $item as $child ) { | ||
63 | - // $attr = $child->attributes(); | ||
64 | - | ||
65 | - if( isset($child->v) ) { | ||
66 | - $value = (string)$child->v; | ||
67 | - }else{ | ||
68 | - $value = false; | ||
69 | - } | ||
70 | - | ||
71 | - // $result[$sheet][$row][$cell] = isset($attr['t']) ? $sharedStringsArr[$value] : $value; | ||
72 | - $result[$sheet][$row][$cell] = $value; | ||
73 | - $cell++; | ||
74 | - } | ||
75 | - $row++; | 117 | + $current_row = 0; |
118 | + | ||
119 | + foreach ( $xml->sheetData->row as $row_values ) { | ||
120 | + $this->readRowValues( $row_values, $sheet , $current_row ); | ||
121 | + $current_row++; | ||
76 | } | 122 | } |
77 | } | 123 | } |
78 | } | 124 | } |
79 | - return $result; | 125 | + } |
126 | + | ||
127 | + protected function readRowValues ( $item, $sheet , $current_row ) | ||
128 | + { | ||
129 | + $this->result_arr[$sheet][$current_row] = array(); | ||
130 | + //по каждой ячейке строки | ||
131 | + $cell = 0; | ||
132 | + foreach ( $item as $child ) { | ||
133 | + $attr = $child->attributes(); | ||
134 | + | ||
135 | + if( isset($child->v) ) { | ||
136 | + $value = (string)$child->v; | ||
137 | + }else{ | ||
138 | + $value = false; | ||
139 | + } | ||
140 | + if ( isset( $attr['t'] ) ) { | ||
141 | + $this->result_arr[$sheet][$current_row][$cell] = $this->strings_arr[ $value ]; | ||
142 | + }else{ | ||
143 | + $this->result_arr[$sheet][$current_row][$cell] = $value; | ||
144 | + } | ||
145 | + $cell++; | ||
146 | + } | ||
147 | + | ||
80 | } | 148 | } |
81 | } | 149 | } |
82 | \ No newline at end of file | 150 | \ No newline at end of file |