Примеры работы с файлами эксель (excel) используя PHPExcel
Работа с XLSX ("новый" Эксель)
Общее
Есть статья по работе с новой библиотекой: Работа с XLSX через обновленную библиотеку (phpoffice/phpspreadsheet)
Страница библиотеки на packagist: phpoffice/phpexcel
Установка
Для начала нужно устанавливать composer
Затем проинструктировать пакет через консоль:
composer require phpoffice/phpexcel
Полезное:
-
Получение даты из соответствующей ячейки:
$oTMP->dEnd = PHPExcel_Shared_Date::ExcelToPHP($oTMP->dEnd); $oTMP->dEnd = date('d.m.Y', $oTMP->dEnd);
Примеры
Создание и запись в файл
Create_and_Write.php (Download)
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once('vendor/autoload.php');
$sOutFile = 'all.xlsx';
$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0)->setTitle("Отчет");
$iLine = 1;
for($i = 0; $i < 10; $i++)
{
$FL = 'A'; // First Leter
// Записываем в файл
$objPHPExcel->getActiveSheet()
->setCellValue(($FL++).$iLine, $i)
->setCellValue(($FL++).$iLine, $i*10)
;
$iLine++;
}
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save($sOutFile);
Чтение данных
for ($i = 2; $i <= $oActiveSheet->getHighestRow(); $i++)
Read.php (Download)
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'On');
require_once('vendor/autoload.php');
$sInFile = 'all.xlsx';
$oExcel = PHPExcel_IOFactory::load($sInFile);
$aRet = array();
for ($i = 2; $i <= 20; $i++) // 2 - пропускаем первую строку (Нумерация с 1)
{
$aRet[$i]['c1:'] = $oExcel->getActiveSheet()->getCell ( 'A' . $i )->getValue();
$aRet[$i]['c2:'] = $oExcel->getActiveSheet()->getCell ( 'B' . $i )->getValue();
}
echo '<pre>';
print_r($aRet);
echo '</pre>';Еще примеры:
Создаем файл, пишем в него данные, сохраняем. Стоит обратить внимание на то, что я заменил A, B, C на "фишку" :-)
/**
* Генерирует отчет со всеми пользователями и их кредитами в XLSX
* Возвращает путь до файла
*
* @return string
*/
public function exportAll2xlsx()
{
// Init
$db = JFactory::getDBO();
$sOutFile = '/_files/all.xlsx';
// PHPExcel
require_once (JPATH_ROOT.'/so/ext/PHPExcel/Classes/PHPExcel.php');
$objPHPExcel = new PHPExcel();
$objPHPExcel->setActiveSheetIndex(0)->setTitle("Отчет");
// Получение всех клиентов
$query = $db->getQuery(true);
$query->select('*')
->from('sojos_users AS a')
->where(' a.id > 772')
;
$db->setQuery($query);
$aRows = $db->loadObjectList();
$iLine = 1;
foreach($aRows as $oUser)
{
{
$FL = 'A'; // First Leter
// Записываем в файл
$objPHPExcel->getActiveSheet()
->setCellValue(($FL++).$iLine, $oUser->id)
->setCellValue(($FL++).$iLine, $oUser->last_name)
->setCellValue(($FL++).$iLine, $oUser->gc_name)
->setCellValue(($FL++).$iLine, $oUser->middle_name)
->setCellValue(($FL++).$iLine, $oUser->date_of_birth)
->setCellValue(($FL++).$iLine, $oUser->place_of_birth)
->setCellValue(($FL++).$iLine, $oUser->passport)
->setCellValue(($FL++).$iLine, $oUser->issued_by)
->setCellValue(($FL++).$iLine, $oUser->date_of_issue)
->setCellValue(($FL++).$iLine, $oUser->code_division)
;
$iLine++;
}
}
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save(JPATH_ROOT.$sOutFile);
return $sOutFile;
}
Вставляем картинку в файл и сохраняем
InsertPic.php (Download)
<?
echo '<?xml version="1.0" encoding="utf-8"?>';
?>
<!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 http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Генератор</title>
</head>
<body>
<?
$BabsPath = dirname(__FILE__);
date_default_timezone_set('Europe/London');
/** PHPExcel */
require_once $BabsPath.'/../../Lib/xls/PHPExcel.php';
$objPHPExcel = new PHPExcel();
$objPHPExcel->getActiveSheet()->setTitle("My Sheet");
$sPath = dirname(__FILE__);
$sGetFile = $sPath.'/input.xls';
$sPutFile = $sPath.'/output.xlsx';
$gdImage = imagecreatefromjpeg('pic.jpg');
// Add a drawing to the worksheetecho date('H:i:s') . " Add a drawing to the worksheet\n";
$objDrawing = new PHPExcel_Worksheet_MemoryDrawing();
$objDrawing->setName('Sample image');$objDrawing->setDescription('Sample image');
$objDrawing->setImageResource($gdImage);
$objDrawing->setRenderingFunction(PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG);
$objDrawing->setMimeType(PHPExcel_Worksheet_MemoryDrawing::MIMETYPE_DEFAULT);
$objDrawing->setHeight(150);
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save($sPutFile);
?>
<div>
<b>Работа завершена</b>
</div>
</body>
</html>
Открываем файл, перебераем все емейлы и сохраняем в базу
DoIt.php (Download)
<?
$sPath = dirname(__FILE__);
/**
* Text
*
* @param mixed $OBJ
* @return object
*/
function conv_obj_UTF_2_1251(&$OBJ)
{
if (is_object($OBJ))
{
$class_vars = get_object_vars($OBJ);
foreach ($class_vars as $name => $value)
{
if (is_string($value))
{
$val = '';
try
{
@$val = iconv("UTF-8", "windows-1251", $value);
}
catch (Exception $e)
{
echo 'Выброшено исключение: ', $e->getMessage(), "\n";
}
if ($val)
{
$OBJ->$name = $val;
// echo 'ok<hr>';
}
}
}
}
else
{
$OBJ = iconv("UTF-8", "windows-1251", $OBJ);
}
return $OBJ;
}
function changeEmailDelimeter($sText)
{
return str_replace(';', ',', $sText);
}
require_once($sPath.'/lib/PDO/classes/database.php');
require_once($sPath.'/lib/PDO/classes/table.php');
/*
$DB = c_database::init(array(
'host' => 'mysql52.1gb.ru',
'user' => 'gb_profs_mail',
'password' => '1051f5f312',
'database' => 'gb_profs_mail',
'port' => '',
'charset' => 'utf8',
'database_type' => 'mysql'
));
*/
$DB = c_database::init(array(
'host' => 'localhost',
'user' => 'root',
'password' => '',
'database' => 'db_test',
'port' => '',
'database_type' => 'mysql'
));
class tbl_items extends c_table
{
var $id = null;
var $fio = null;
var $title = null;
var $type = null;
var $district = null;
var $address = null;
var $telephone = null;
var $site = null;
var $email = null;
public function __construct()
{
global $DB;
$this->construct('jinm_somailer_recipient', 'id', $DB);
}
}
date_default_timezone_set('Europe/Moscow');
require_once ($sPath.'/lib/xls/PHPExcel.php');
$oExcel = PHPExcel_IOFactory::load($sPath . '/input/IN.xlsx');
// Brgin
define('_LastLine', 392);
for ($i=2; $i <= _LastLine; $i++) // 2 - пропускаем первую строку (Нумерация с 1)
{
$oRow = new tbl_items();
$oRow->id = 0;
$oRow->title = $oExcel->getActiveSheet()->getCell ( 'A' . $i )->getValue(); // Сокращенное наименование образовательного учреждения
$oRow->type = $oExcel->getActiveSheet()->getCell ( 'B' . $i )->getValue(); // Тип образовательного учреждения
$oRow->email = changeEmailDelimeter($oExcel->getActiveSheet()->getCell ( 'C' . $i )->getValue()); // Электронная почта
$oRow->district = $oExcel->getActiveSheet()->getCell ( 'D' . $i )->getValue(); // Район
$oRow->address = $oExcel->getActiveSheet()->getCell ( 'E' . $i )->getValue(); // Адрес Образовательного учреждения
$oRow->fio = $oExcel->getActiveSheet()->getCell ( 'F' . $i )->getValue(); // Ф.И.О.
$oRow->telephone = $oExcel->getActiveSheet()->getCell ( 'G' . $i )->getValue(); // Контактный телефон председателя ППО (моб./раб.)
$oRow->site = $oExcel->getActiveSheet()->getCell ( 'H' . $i )->getValue(); // Интернет адрес образовательного учреждения
conv_obj_UTF_2_1251($oRow);
$oRow->save();
// echo $oRow->title.'<br>';
}
?>
Ошибки
Multibyte function overloading in PHP must be disabled for string functions (2) столкнулся с ней на мастер хосте. Смена через хостинг панель не помогла, обратился в суппорт - сделали