array(),"row"=>array(),"marker"=>"");//Массив с данными public static $dataFromExcel = array(); public static $allNumExist = false;//Устанавливается в true если для всех элементов массива сопоставлений задан корректный элемент num public static $allcolNameExist = false;//Устанавливается в true если для всех элементов массива сопоставлений задан корректный элемент allcolNameExist public static $JSONDataFile = false;//Если переменная установлена и в методы этого класса save и load не передан параметр имени файла, то будет производиться попытка загрузки файла указанного в этой переменной public static function excelColByNum($num=false) { if (($num !== false) and (($num=($num*1)) > 0)) { $result = ""; while ($num > 36) { $digit = floor($num / 36); $result .= chr(64+$digit); $num -= $digit*36; } $result .= chr(64+$num); return $result; } return false; } public static function setMappingData($data=false) {//принимает массив вида array(array("num"=>0/*Порядковый номер столбца в эксель таблице*/,"code"=>"codeNameInResultArray"/*название ключа для массива возвращаемого при получении результата*/,"colName"=>"Имя столбца в эксель таблице"),) self::$data = array("headers"=>array(),"row"=>array(),"marker"=>"");//Обнуляем массив с данными self::$allNumExist = false; self::$allcolNameExist = false; if (($data !== false) and is_array($data)) { $dataToInit = array(); self::$allNumExist = true; self::$allcolNameExist = true; foreach ($data as $one) { if (!(isset($one["code"]) and ($one["code"].""))) { echo "Ошибка инициализации разбора Excel файла: ключ массива code обязательно требуется указать."; exit; } if (!(isset($one["num"]) and myint($one["num"],true) and ($one["num"] > 0)) and !(isset($one["colName"]) and ($one["colName"].""))) { echo "Ошибка инициализации разбора Excel файла: требуется указать или ключ массива num или colName."; exit; } $item = array(); if (isset($one["num"])) { $item["num"] = $one["num"]; } else {self::$allNumExist = false;} $item["code"] = $one["code"]; if (isset($one["colName"])) { $item["colName"] = $one["colName"]; } else {self::$allcolNameExist = false;} $item["realNum"] = false; self::$data["headers"][] = $item; } if (count(self::$data["headers"])) { return true; } else { echo "Не было установлено ни одного правила сопоставления столбцов в эксель файле"; exit; } } return false; } public static function readExcelFile($fileAddress=false) {//Принимает имя файла не сервере или полный адрес self::$dataFromExcel = array();//Обнуляем информацию if ($fileAddress !== false) { try{ $xls = PHPExcel_IOFactory::load($fileAddress); $xls->setActiveSheetIndex(0); $sheet = $xls->getActiveSheet(); $continue = true; $maxX = 10;$maxY = 10; $maxXreal = 1;$maxYreal = 1; $reLine = false; do { $re = false; $x = 1;$y = 1; while ($continue) { if ((($elementText = ($sheet->getCell(self::excelColByNum($x).$y)."")) != "") and 1) { if ($x > $maxXreal) {/*echo "[1-$x]";*/$maxXreal = $x;$maxX = $x + 10;if ($y > 1) {$re = true;$reLine = $y - 1;}} if ($y > $maxYreal) {/*echo "[2-$x]";*/$maxYreal = $y;$maxY = $y + 10;} // if ($x > ($maxX-10)) {echo "[3-$x]";$maxX = $x + 10;}//$maxX = $x + 10; // if ($y > ($maxY-10)) {echo "[4-$x]";$maxY = $y + 10;}//$maxY = $y + 10; // var_dump($sheet->getCell(self::excelColByNum($x).$y)."");//$sheet->getCell } //var_dump($x);var_dump($y); $x++; if (($re === false) and ($y == $reLine)) {$continue = false;} elseif (($x > $maxX) and ($y > $maxY)) {$continue = false;} elseif ($x > $maxX) {$y++;$x=1;} } } while ($re); //echo "E"; //var_dump($maxXreal);var_dump($maxYreal); $excelDataAr = array(); for ($y=1;$y<=$maxYreal;$y++) { for ($x=1;$x<=$maxXreal;$x++) { if (!isset($excelDataAr[$y-1])) {$excelDataAr[$y-1] = array();} $excelDataAr[$y-1][$x-1] = $sheet->getCell(self::excelColByNum($x).$y).""; } } // var_dump($excelDataAr);exit; // $excelDataAr = $sheet->toArray();echo 7; if (is_array($excelDataAr) and ($count = count($excelDataAr))) {//Возможно в проверке на массив нет необходимости // for ($i=1;$i<$count;$i++) { // $excelDataAr[$i][0] = $sheet->getCell("A".($i+1))->getHyperlink()->getUrl(); //echo "";var_dump($url);echo "\n"; // } // echo "eee:";var_dump($sheet->getCell("A".(1))->getValue()); //var_dump($excelDataAr[1]); self::$dataFromExcel = $excelDataAr; return true; } echo "Не удалось получить данные из Excel файла."; exit; } catch (Exception $ex) { echo "Сработало исключение при попытке чтения эксель файла."; if (strpos($ex->getMessage(),"File does not exist")) { echo "Файл с эксель таблицей не был найден."; } else {echo "Убедитесь что файл загружен полностью и является файлом Excel.";} exit; } return $xls; } return false; } public static function convert() { if (is_array(self::$dataFromExcel) and is_array(self::$data) and isset(self::$data["headers"]) and isset(self::$data["row"]) and is_array(self::$data["headers"]) and is_array(self::$data["row"])) { self::$data["row"] = array();//Обнуляем массив с данными(в котором уже переконвертированные данные) if (!count(self::$data["headers"])) { echo "Не были установлены правила сопоставления"; exit; } if (!count(self::$dataFromExcel)) { echo "Не было получено данных из эксель файла для конвертации"; exit; } if (!self::$mappingByColName and !self::$allNumExist) { echo "Ошибка! При сопоставлении по номеру поля в настройках мапинга элемент с ключем num должен быть заполнен у всех элеменов"; exit; } $dataInExcelAr = array();//В этом массиве будут храниться данные из файла эксель без строки заголовков $hearesInExcelAr = false;//Если у эксель файла должна быть строка с заголовками то в переменной будет храниться массив заголовков if (self::$firstRowAreColNames) { if (count(self::$dataFromExcel) == 1) { echo "В Excel файле нет строк с данными кроме строки с заголовками"; exit; } if (!(isset(self::$dataFromExcel[0])and is_array(self::$dataFromExcel[0]))) { echo "Ошибка структуры данных в массиве заголовков полученных из файла эксель или массив не существует."; exit; } $hearesInExcelAr = self::$dataFromExcel[0];//Получили массив заголовков файла эксель //[НАЧАЛО]Определение номеров столбцов $colNamesTmp = array(); foreach (self::$data["headers"] as $key => $one) { if (($keyTmp = array_search($one["colName"],$hearesInExcelAr)) !== false) { self::$data["headers"][$key]["realNum"] = $keyTmp; } } //[КОНЕЦ]Определение номеров столбцов $dataInExcelAr = self::$dataFromExcel; self::$dataFromExcel = array();//Обнуляем массив для конвертации с данными полученными из файла эксель unset($dataInExcelAr[0]);//В данном случаи элемент массива с ключем 0 является заголовками, поэтому его необходимо удалить из массива с данными if (self::$checkColNames) {//Если требуется проверить сответствие номера столбца и названия переданного в настройках мапинга и указанного в эксель файле foreach (self::$data["headers"] as $one) { if (!(isset($one["num"]) and myint($one["num"],true) and ($one["num"] >= 0) and isset($one["code"]) and ($one["code"]."") and isset($one["colName"]) and ($one["colName"].""))) { echo "Ошибка структуры данных в массиве для мапинга."; exit; } if (!(isset($hearesInExcelAr[$one["num"]]))) { echo "Ошибка. В файле эксель отсутствует столбец с номером " . $one["num"] . " который указан в настройках мапинга."; exit; } if (!($hearesInExcelAr[$one["num"]]."")) { echo "Ошибка. В файле эксель не заполнено имя столбца с номером " . $one["num"] . " который указан в настройках мапинга."; exit; } if (($hearesInExcelAr[$one["num"]]."") != ($one["colName"]."")) { echo "Ошибка. Не соответствует имя столбца в файле эксель(" . $hearesInExcelAr[$one["num"]] . ") и настройках мапинга(" . $one["colName"] . "), номер столбца " . $one["num"] . " который указан в настройках мапинга."; exit; } } } } else { $dataInExcelAr = self::$dataFromExcel; self::$dataFromExcel = array();//Обнуляем массив для конвертации с данными полученными из файла эксель } foreach ($dataInExcelAr as $line => $one) { if (!is_array($one)) { echo "Ошибка при разборе данных полученных из Excel файла. Данные у элемента массива с ключем $line не являются массивом"; exit; } $tmpItemData = array(); foreach (self::$data["headers"] as $oneRule) { if (self::$mappingByColName) {//Если сопоставление требуется производить по имени столбца $tmpItemData[] = $one[$oneRule["realNum"]]; } else {//Иначе сопоставление проводится по номеру столбца if (!(isset($oneRule["num"]) and myint($oneRule["num"],true) and ($oneRule["num"] >= 0) and isset($oneRule["code"]) and ($oneRule["code"].""))) { echo "Ошибка структуры данных в массиве для мапинга."; exit; } $tmpItemData[] = $one[$oneRule["num"]]; } } self::$data["row"][] = $tmpItemData; } self::$data["marker"] = md5("dcba".microtime(true)."abcd") . "--" . date("d-m-Y_H:i:s",time());//Создаём маркер загруженного файла return true; } return false; } public static function save($filename=false) { if ($filename===false) {$filename = self::$JSONDataFile;} if (($filename !== false) and is_array(self::$data) and isset(self::$data["headers"]) and is_array(self::$data["headers"]) and count(self::$data["headers"]) and isset(self::$data["row"]) and is_array(self::$data["row"]) and count(self::$data["row"]) and isset(self::$data["marker"]) and self::$data["marker"]) { if (!$fp = fopen($filename,"w")) { echo "Не удалось открыть файл $filename на запись при сохранении. Установите необходимые права доступа для файла."; exit; } fwrite($fp,json_encode(self::$data)); return true; } return false; } public static function load($filename=false) { if ($filename===false) {$filename = self::$JSONDataFile;} if ($filename !== false) { $fileData = @file_get_contents($filename); if ($fileData === false) { echo "Ошибка. Не удалось получить данные из файла $fileData. Возможно файл не существует или не достаточно прав для чтения."; exit; } if (is_null($fileData = json_decode($fileData,true))) { echo "Ошибка парсинга JSON данных при разборе файла $filename."; exit; } if (!(is_array($fileData) and isset($fileData["headers"]) and is_array($fileData["headers"]) and isset($fileData["row"]) and is_array($fileData["row"]) and isset($fileData["marker"]) and ($fileData["marker"].""))) { echo "Ошибка. Неверная структура данных полученная после декодинга JSON данных из файла $filename."; exit; } if (!count($fileData["headers"])) { echo "Ошибка. Отсутствуют названия полей после декодинга JSON данных из файла $filename."; exit; } //[НАЧАЛО]Проверяем у всех элементов массива headers наличие элемента с ключем code и не пустым его значением foreach ($fileData["headers"] as $key => $one) { if (!(isset($one["code"]) and ($one["code"].""))) { echo "Ошибка. У элемента массива headers с ключем $key отсутствует или пустой обязательный элемент с ключем code"; exit; } } //[КОНЕЦ]Проверяем у всех элементов массива headers наличие элемента с ключем code и не пустым его значением $totalOfFields = count($fileData["headers"]);//Количество полей //[НАЧАЛО]Проверка соответствия количества полей количеству элементов в каждой строчке данных foreach ($fileData["row"] as $key => $one) { if (!is_array($one)) { echo "Ошибка. Элемент массива данных после декодинга JSON данных из файла $filename к ключем $key не является массивом."; exit; } if (count($one) != $totalOfFields) { echo "Ошибка. Количество элементов(" . count($one) . ") массива данных после декодинга JSON данных из файла $filename не соответствует количеству полей в массиве headers($totalOfFields). "; exit; } } self::$data = $fileData; return true; } return false; } public static function get($code=false,$num=false) { if ($code !== false and $num !== false) { if (is_array(self::$data) and isset(self::$data["headers"]) and is_array(self::$data["headers"]) and count(self::$data["headers"]) and isset(self::$data["row"]) and (self::$data["row"]) and count (self::$data["row"]) and isset(self::$data["marker"]) and (self::$data["marker"]."")) { if (isset(self::$data["row"][$num]) and is_array(self::$data["row"][$num])) { $numInRow = false;//В этой переменной будет сохранён номер поля который необходимо получить из строки данных foreach (self::$data["headers"] as $key => $one) { if ($code == $one["code"]) { $numInRow = $key; break; } } if (($numInRow !== false) and isset(self::$data["row"][$num][$numInRow])) { return self::$data["row"][$num][$numInRow]; } } } } return false; } }