PHPExcel – чтение данных из таблиц MS Office Excel средствами PHP
Однажды мне понадобилось считать данные из табицы MS Office Excel, и вставить эти данные в генерируемые HTML страницы. Для этого пришлось писать скрипт, который бы был автономным, и не зависил от предустановленных расширений на сервере. Покопавшись в сети я обнаружил удобнейшую библиотеку для работы с файлами MS Office Excel - PHPExcel.
Данная библиотека полностью автономна и независима от других библиотек, позволяет считывать ячейки таблицы построчно, проходясь по ним циклом. Используя это я написал простенький скрипт который считывает данные каждой строки и заносит их в отдельный массив, то есть каждая строчка это отдельный массив формируемый на каждой отдельной итерации. Далее все эти массивы заносятся в общий массив и доступны по числовому индексу.
Вот как это выглядит:
- <?php
- function getXLS($xls){
- include_once 'Classes/PHPExcel/IOFactory.php';
- $objPHPExcel = PHPExcel_IOFactory::load($xls);
- $objPHPExcel->setActiveSheetIndex(0);
- $aSheet = $objPHPExcel->getActiveSheet();
- //этот массив будет содержать массивы содержащие в себе значения ячеек каждой строки
- //получим итератор строки и пройдемся по нему циклом
- foreach($aSheet->getRowIterator() as $row){
- //получим итератор ячеек текущей строки
- $cellIterator = $row->getCellIterator();
- //пройдемся циклом по ячейкам строки
- //этот массив будет содержать значения каждой отдельной строки
- foreach($cellIterator as $cell){
- //заносим значения ячеек одной строки в отдельный массив
- }
- //заносим массив со значениями ячеек отдельной строки в "общий массв строк"
- }
- return $array;
- }
- $xlsData = getXLS('xls/xls.xls'); //извлеаем данные из XLS
- ?>
Для начала вам необходимо скачать библиотеку PHPExcel и разместить в нужной директории, затем вызвать функцию getXLS() передав ей в качестве параметра путь к xls файлу, который необходимо прочесть. Функция подключит библиотеку, сформирует массив и вернет его как результат своей работы.
- <?php
- include_once 'Classes/PHPExcel/IOFactory.php';
- ?>
В моем случае было необходимо считать файл с такой структурой ячеек:

Обработав этот файл функция сформирует массив следующего вида:
- <?php
- //выведет такой массив:
- Array (
- ...
- )
- ?>
Такая структура данных очень удобна для обработки и доступа.
PS. И не забудьте подписатся на ленту новостей RSS

Комментарии
array_push($ite m, iconv('cp1251', 'utf-8', $cell->getCalculatedVa lue()));
но на выходе получаю билеберду... ((
Подскажите, в чем может быть проблема?
array_push($ite m, mb_convert_enco ding($cell->getCalculatedVa lue(), 'utf-8', 'cp1251'));
результат - тот же
А я подбиру кодировку, и еще страница вывода в какой кодировке?
Код был полностью из вашего примера - я просто тестировал, за исключением той строки с конвертацией кодировки, что я привел выше.
Использую Spreadsheet_Exc el_Reader
в архиве библиотека, скрипт и тестовая таблица
Array ( [0] => Array ( [0] => ������ ������ ) [1] => Array ( ) [2] => Array ( [0] => �/� [1] => ���� [2] => �.�.�. [3] => ����� [4] => ��� [5] => �������� [6] => ������ [7] => ������ [8] => ���� ���������� [9] => ����������� ) [3] => Array ( [0] => 1 [1] => 40657 [2] => ������ �.�. [3] => ��������� [4] => 75 [5] => 10 [6] => ��������� � ����� [7] => ��������� [8] => 40657 [9] => �������� �.� ) [4] => Array ( [0] => 2 [1] => 40658 [2] => ������ �.�. [3] => ��������� [4] => 75 [5] => 11 [6] => ���� ����� � ������ [7] => � ������ [8] => [9] => ) [5] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] => ) [6] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] => ) [7] => Array ( [0] => [1] => [2] => [3] => [4] => [5] => [6] => [7] => [8] => [9] => ) )
в архиве библиотека, скрипт и тестовая таблица
В index.php закомментировал перекодировку и все русские слова вывелись
foreach($cellIt erator as $cell){
//заносим значения ячеек одной строки в отдельный массив
//array_push($ite m, iconv('cp1251', 'utf-8', $cell->getCalculatedVa lue()));
array_push($ite m, $cell->getCalculatedVa lue());
}
выводит:
array(2) { [0]=> array(4) { [0]=> string(1) "1" [1]=> float(1) [2]=> string(40) "Привет, РњРёСЂ!" [3]=> string(21) "Привет, Мир!" } [1]=> array(4) { [0]=> string(1) "2" [1]=> float(2) [2]=> string(57) "Вторая строчка" [3]=> string(27) "Вторая строчка" } }
Это в примере который вы скачали? в примере все корректно выводится, попробуйте также закомментироват ь строку с перекодировкой как выше.
foreach($cellIt erator as $cell){
//заносим значения ячеек одной строки в отдельный массив
//array_push($ite m, iconv('cp1251', 'utf-8', $cell->getCalculatedVa lue()));
array_push($ite m, $cell->getCalculatedVa lue());
}
Код:
$cellIterator->setIterateOnlyExistingCells(false);Код:
$inputFileType = PHPExcel_IOFactory::identify($inputFileName); // Определяем тип$objReader = PHPExcel_IOFactory::createReader($inputFileType); // Создаем ридер$objReader->setReadDataOnly(true); // Очень сильно влияет и на память и на время, это если нужны только данные... Плюс нужно смотреть ограничения...$worksheetNames = $objReader->listWorksheetNames($inputFileName); // Читаем имена страниц// Постранично читаем данные foreach ($worksheetNames as $wsName) { $objReader->setLoadSheetsOnly($wsName); $oExcel = $objReader->load($inputFileName); $oExcel->setActiveSheetIndexByName($wsName); $aSheet = $oExcel->getActiveSheet(); foreach ($aSheet->getRowIterator() as $rowId => $row) { $cellIterator = $row->getCellIterator(); $cellIterator->setIterateOnlyExistingCells(false); foreach($cellIterator as $cellId=>$cell) { // здесь код... } }}В итоге используется всего порядка 40Мб памяти и укладывается в 30 секунд.
Спасибо большое за ваш совет, уверен он пригодится читателям!
А вот в каком файле нужно делать правки по постраничному чтению текста? =)
Спасибо
Если делать экспорт из 1с в xls, то не читаются русские символы. iconv и mb_convert_enco ding не работают.
Но если файл открыть в excel и просто сохранить все нормально читается.
Видимо 1с сохраняет в некорректной кодировке, подскажите?
Вот ссылка на файл xls http://farmasko.cravter.com.ua/2.xls
Вот ссылка на страницу вывода http://farmasko.cravter.com.ua/2.php
Так лучше (древовидная система отображения массива):
echo '';
print_r($xlsDat a);
echo '';
Заранее спасибо.
Array (
[0] => Array ( [0] => Бесплатная Помощь Юристов Онлайн [1] => 306.jpg )
echo $xlsData[0][0]; //выведет Бесплатная Помощь Юристов Онлайн
echo $xlsData[0][1]; //выведет 306.jpg
Попробовал вставить код, получил ошибку "Call to undefined method PHPExcel_Reader _Excel5::listWo rksheetNames()"
Ругается на строку: "$worksheetNames = $objReader->listWorksheetNa mes($inputFileN ame); "
Может что-то не так делаю, а где не пойму...
У кого получилось?
$aSheet->setCellValue('H9', $_POST['seawater']);
Полный код:
set_include_pat h(get_include_p ath() . PATH_SEPARATOR . './PHPExcel/Classes/');
include('PHPExcel.php');
include_once 'PHPExcel/IOFactory.php';
$objPHPExcel = PHPExcel_IOFact ory::load('NABStatics1.xls');
$objPHPExcel->setActiveSheetI ndex(0);
$aSheet = $objPHPExcel->getActiveSheet( );
$aSheet->setCellValue('H9', $_POST['seawater']);
$aSheet->setCellValue('H10', $_POST['cargomass']);
$aSheet->setCellValue('H15', $_POST['forepeak']);
$aSheet->setCellValue('H16', $_POST['wbt1prb']);
include('PHPExcel/Writer/Excel2007.php');
$objWriter = PHPExcel_IOFact ory::createWrit er($objPHPExcel , 'Excel2007');
$objWriter->setOffice2003Compatibility(t rue);
$objWriter->save('NABStatics1.xls');
Заранее спасибо)