#php #phpexcel
#php #phpexcel
Вопрос:
Прежде всего, уточните, что я видел много тем по оптимизации чтения файла Excel, но применил некоторые из решений и не нашел того, которое мне помогло.
У меня есть система, которая в определенный момент вызывает другой php, вызывающий библиотеку excel. Эта система, что она делает, это считывает файл Excel и записывает его информацию в SQL, чтобы затем сгенерировать PDF.
index.php
<?php
....
include("read_excel.php");
....
?>
Я видел, что загрузка моего индекса занимает примерно 20 секунд, поэтому я начал распределять части своего кода, чтобы увидеть, где была проблема, и определить, что она была в файле «read_excel.php «
read_excel.php
<?php
$sql_host = "127.0.0.1";
$sql_username = "root";
$sql_password = "";
$sql_database = "payment_locations";
$mysqli = new mysqli($sql_host , $sql_username , $sql_password , $sql_database);
$mysqli->set_charset("utf8");
require_once("_library/PHPExcel/Classes/PHPExcel.php");
$fileName = '_excel/locations.xlsx';
if (!file_exists($fileName)){
?>
<script type="text/javascript">
alertify.alert("No exists file");
</script>
<?php
}else{
$objPHPExcel = PHPExcel_IOFactory::load($fileName);
$date = $objPHPExcel->getActiveSheet()->getCell('U11')->getValue();
$dateFormat = date('d/m/Y', PHPExcel_Shared_Date::ExcelToPHP($date));
// echo $dateFormat;
// $dto = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('U11')->getCalculatedValue());
// echo $dto->format('d-m-Y');
for ($i = 11; $i <= 31; $i ) {
if ((float) $objPHPExcel->getActiveSheet()->getCell('A' . $i)->getCalculatedValue() == 0) {
break;
}
$dataExcel[$i]['id_locator'] = $objPHPExcel->getActiveSheet()->getCell('A' . $i)->getCalculatedValue();
$dataExcel[$i]['payment'] = $objPHPExcel->getActiveSheet()->getCell('X' . $i)->getCalculatedValue();
$dataExcel[$i]['period_to'] = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('AC' . $i)->getCalculatedValue());
$dataExcel[$i]['period_from'] = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('AD' . $i)->getCalculatedValue());
$dataExcel[$i]['support'] = $objPHPExcel->getActiveSheet()->getCell('J' . $i)->getCalculatedValue();
$dataExcel[$i]['location'] = $objPHPExcel->getActiveSheet()->getCell('H' . $i)->getCalculatedValue();
$dataExcel[$i]['comments'] = $objPHPExcel->getActiveSheet()->getCell('AF' . $i)->getCalculatedValue();
$dataExcel[$i]['name_locator'] = $objPHPExcel->getActiveSheet()->getCell('E' . $i)->getCalculatedValue();
$dataExcel[$i]['ci_locator'] = $objPHPExcel->getActiveSheet()->getCell('F' . $i)->getCalculatedValue();
$dataExcel[$i]['tel_locator'] = $objPHPExcel->getActiveSheet()->getCell('G' . $i)->getCalculatedValue();
$dataExcel[$i]['address_locator'] = $objPHPExcel->getActiveSheet()->getCell('I' . $i)->getCalculatedValue();
}
foreach ($dataExcel as $dataRow => $value) {
$dateFormatPeriodTo = $value['period_to']->format('d/m/Y');
$dateFormatPeriodFrom = $value['period_from']->format('d/m/Y');
// var_dump($dateFormatPeriodTo);
//$dateFormatPeriodTo = date('d/m/Y', PHPExcel_Shared_Date::ExcelToPHP($value['period_to']));
$sql = "REPLACE data_locator (id_locator, payment, period_to, period_from, support, location, comments, name_locator, ci_locator, tel_locator, address_locator) VALUES ({$value['id_locator']}, {$value['payment']}, '$dateFormatPeriodTo', '$dateFormatPeriodFrom', '{$value['support']}', '{$value['location']}', '{$value['comments']}', '{$value['name_locator']}', {$value['ci_locator']}, '{$value['tel_locator']}', '{$value['address_locator']}')";
// echo $sql;
$result = $mysqli->query($sql);
}
for ($j = 42; $j <= 55; $j ) {
if ((float) $objPHPExcel->getActiveSheet()->getCell('A' . $j)->getCalculatedValue() == 0) {
break;
}
$dataExcelTwo[$j]['id_locator'] = $objPHPExcel->getActiveSheet()->getCell('A' . $j)->getCalculatedValue();
$dataExcelTwo[$j]['payment'] = $objPHPExcel->getActiveSheet()->getCell('X' . $j)->getCalculatedValue();
$dataExcelTwo[$j]['period_to'] = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('AC' . $j)->getCalculatedValue());
$dataExcelTwo[$j]['period_from'] = PHPExcel_Shared_Date::ExcelToPHPObject($objPHPExcel->getActiveSheet()->getCell('AD' . $j)->getCalculatedValue());
$dataExcelTwo[$j]['support'] = $objPHPExcel->getActiveSheet()->getCell('J' . $j)->getCalculatedValue();
$dataExcelTwo[$j]['location'] = $objPHPExcel->getActiveSheet()->getCell('H' . $j)->getCalculatedValue();
$dataExcelTwo[$j]['comments'] = $objPHPExcel->getActiveSheet()->getCell('AF' . $j)->getCalculatedValue();
$dataExcelTwo[$j]['name_locator'] = $objPHPExcel->getActiveSheet()->getCell('E' . $j)->getCalculatedValue();
$dataExcelTwo[$j]['ci_locator'] = $objPHPExcel->getActiveSheet()->getCell('F' . $j)->getCalculatedValue();
$dataExcelTwo[$j]['tel_locator'] = $objPHPExcel->getActiveSheet()->getCell('G' . $j)->getCalculatedValue();
$dataExcelTwo[$j]['address_locator'] = $objPHPExcel->getActiveSheet()->getCell('I' . $j)->getCalculatedValue();
}
foreach ($dataExcelTwo as $dataRow => $value) {
$dateFormatPeriodTo = $value['period_to']->format('d/m/Y');
$dateFormatPeriodFrom = $value['period_from']->format('d/m/Y');
// var_dump($dateFormatPeriodTo);
//$dateFormatPeriodTo = date('d/m/Y', PHPExcel_Shared_Date::ExcelToPHP($value['period_to']));
$sql = "REPLACE data_locator (id_locator, payment, period_to, period_from, support, location, comments, name_locator, ci_locator, tel_locator, address_locator) VALUES ({$value['id_locator']}, {$value['payment']}, '$dateFormatPeriodTo', '$dateFormatPeriodFrom', '{$value['support']}', '{$value['location']}', '{$value['comments']}', '{$value['name_locator']}', {$value['ci_locator']}, '{$value['tel_locator']}', '{$value['address_locator']}')";
// echo $sql;
$result = $mysqli->query($sql);
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<link rel="stylesheet" href="_css/datepicker.css">
<script src="_js/alertify.min.js"></script>
<link rel="stylesheet" href="//cdn.jsdelivr.net/bootstrap/3.2.0/css/bootstrap.min.css"/>
<link rel="stylesheet" href="_css/style.css">
<link rel="stylesheet" href="_css/alertify.default.css">
<link rel="stylesheet" href="_css/alertify.core.css">
<link rel="stylesheet" href="_css/alertify.bootstrap3.css">
<link href='https://fonts.googleapis.com/css?family=Roboto:400,700,300,900' rel='stylesheet' type='text/css'>
<link rel="icon" href="_images/favicon.png" type="image/gif" sizes="16x16">
<link rel="stylesheet" href="alertify.default.css">
<link rel="stylesheet" href="alertify.core.css">
<link rel="stylesheet" href="alertify.bootstrap3.css">
</head>
</html>
После удаления почти всех блоков кода в моем прочитанном файле «read_excel.php «, Я мог видеть, что строка, которая задержала выполнение моего индекса (который вызывает read_excel.php )
$objPHPExcel = PHPExcel_IOFactory::load($fileName);
Как только я удаляю эту строку, мой индекс загружается за миллисекунды.
Итак, мой вопрос в том, является ли неправильным мой способ вызова файла Excel, который я хочу прочитать?
Размер моего Excel составляет всего 110 КБ, я не думаю, что это проблема, не так ли?
Я запускаю свое программное обеспечение на локальном сервере (wamp server 2.5) и 64-битной Windows 7. Может быть проблема?
Я видел разделы, в которых предлагается оптимизация для файлов, в которых обрабатывается много информации, но в моем случае это небольшой файл, и я использую только блоки Excel (для условий), и это, похоже, не проблема, потому что скорость загрузки моего индекса меняется, когда я удаляю строку:
$objPHPExcel = PHPExcel_IOFactory::load($fileName);
Может ли это быть версией библиотеки Excel, которую я использую?
Спасибо!
Комментарии:
1. Проверьте вкладку «сеть» в консоли и посмотрите, что происходит.
2. Для отладки или поиска оптимизации в ваших скриптах я рекомендую вам попробовать Blackfire.
3. Последняя версия PHPExcel, 1.8.1, была выпущена в 2015 году. Проект был официально признан устаревшим в 2017 году и окончательно заархивирован в 2019 году. Проект не поддерживался годами и больше не должен использоваться. Все пользователи должны перейти на его прямого преемника PhpSpreadsheet ( github.com/PHPOffice/PhpSpreadsheet ) или другой вариант.