Blame view

vendor/yiisoft/multiparser/XlsxParser.php 4.55 KB
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
      }
  }