Чтение Excel-файлов средствами PHP
Если вам необходимо читать файлы Excel (.xls) средствами PHP, то библиотека PHP-ExcelReader создана специально для вас. Для работы необходима поддержка iconv или mbstring. Вот пример того, как можно оформить вывод xls-документа в HTML-таблицу с использованием этой библиотеки:
require_once ('Excel/reader.php');
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('CP1251');
$data->read('filename.xls');
echo '<table>';
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
echo '<tr>';
for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
echo '<td>'.$data->sheets[0]['cells'][$i][$j].'</td>';
}
echo '</tr>';
}
echo '</table>';
?>
Альтернативный вариант - PHP Excel PARSER. Вот что написано в файле Help_rus.txt:
Вам нужен скрипт, который может читать MS файлы Excel и сохранять данные в базе данных, HTML страницах и и т.д.? Вы хотите делать это используя PHP под Unix и Linux, но без того, чтобы использовать инструментальные средства Windows напоподобии COM? Тогда PHP Excel PARSER - для вас. Все, в чем вы будете нуждаться - это только наш excel.php и PHP сервер без установки дополнительных инструментальных средств.
В файле документации Help_rus.txt довольно подробно описано, как использовать PHP Excel PARSER. Кроме того, дистрибутив содержит примеры работы с Excel-файлом:
- PHP Excel Parser/Setup/SAMPLE/XLS2HTML/SAMPLE.PHP - вывод Excel-файла в браузер
- PHP Excel Parser/Setup/SAMPLE/xls2mysql/INDEX.PHP - запись Excel-файла в базу данных
Пример вывода Excel-файла в браузер в формате HTML:
include ("excel.php");
$exc = new ExcelFileParser ("log.txt", ABC_NO_LOG);
$res = $exc->ParseFromFile("test.xls");
switch ($res) {
case 0: break;
case 1: die ("Невозможно открыть файл");
case 2: die ("Файл, слишком маленький чтобы быть файлом Excel");
case 3: die ("Ошибка чтения заголовка файла");
case 4: die ("Ошибка чтения файла");
case 5: die ("Это - не файл Excel или файл, сохраненный в Excel < 5.0");
case 6: die ("Битый файл");
case 7: die ("В файле не найдены данные Excel");
case 8: die ("Неподдерживаемая версия файла");
default: die ("Неизвестная ошибка");
}
// цикл по рабочим листам
for( $ws_num=0; $ws_num<count($exc->worksheet['name']); $ws_num++ )
{
echo "<h3>Рабочий лист: ";
if( $exc->worksheet['unicode'][$ws_num] )
echo uc2cp1251($exc->worksheet['name'][$ws_num]);
else
echo $exc->worksheet['name'][$ws_num];
echo "</h3>\n";
$ws = $exc->worksheet['data'][$ws_num];
// если рабочий лист не пустой
if ( is_array($ws) && isset($ws['max_row']) && isset($ws['max_col']) ) {
echo "<table border=1 cellspacing=0 cellpadding=2>\n";
echo "<tr><td> </td>";
for( $j=0; $j<=$ws['max_col']; $j++ ) {
echo "<td class=index> ";
if( $j>25 ) echo chr((int)($j/26)+64);
echo chr(($j % 26) + 65)." </td>";
}
echo "</tr>\n";
// начало цикла по строкам
for( $i=0; $i<=$ws['max_row']; $i++ ) {
echo "<tr><td class=index>".($i+1)."</td>\n";
// начало цикла по столбцам
if( isset($ws['cell'][$i]) && is_array($ws['cell'][$i]) ) {
for( $j=0; $j<=$ws['max_col']; $j++ )
{
if( isset($ws['cell'][$i][$j]) ) {
// Печать данных ячейки
echo "<td>";
$data = $ws['cell'][$i][$j];
switch ($data['type'])
{
// строка
case 0:
$ind = $data['data'];
if( $exc->sst['unicode'][$ind] )
$s = uc2cp1251($exc->sst['data'][$ind]);
else
$s = $exc->sst['data'][$ind];
if( strlen(trim($s))==0 )
echo " ";
else
echo $s;
break;
//целое число
case 1:
echo (int)($data['data']);
break;
//вещественное число
case 2:
echo (float)($data['data']);
break;
// дата
case 3:
$ret = $exc->getDateArray($data['data']);
printf ("%s-%s-%s",$ret['day'], $ret['month'], $ret['year']);
break;
default:
echo " ";
break;
}
echo "</td>\n";
} else {
echo "<td> </td>\n";
}
}
} else {
// все ячейки стрки пустые
for( $j=0; $j<=$ws['max_col']; $j++ ) {
echo "<td> </td>\n";
}
}
echo "</tr>\n";
}
echo "</table>\n";
} else {
// пустой рабочий лист
echo "<p>Пустой рабочий лист</p>\n";
}
}
// конвертим в нужную кодировку
function uc2cp1251($str) {
return iconv('UNICODELITTLE','cp1251',$str);
}
?>
Ссылки по теме:
Mikhail:
а как в полевых испытаниях с кириллицей в экселевских файлах, всё нормально?
я одно время просто искал решение и в итоге пришел к тому, что (по крайней мере на момент написания скриптов для конкретной задачи) более стабильно в отношении кириллицы написалось на Perl с использованием SpreadSheet::ParseExcel.
17 Ноябрь 2008, 13:16admin:
Mikhail, я пробовал в работе оба скрипта - с кириллицей все нормально. Для PHP-ExcelReader кодировка устанавливается так
17 Ноябрь 2008, 13:56$data->setOutputEncoding(’CP1251′);
а для PHP Excel PARSER перекодировать данные для каждой ячейки
iconv(’UNICODELITTLE’, ‘cp1251′, $str);
Onwave:
Как установить PHP Excel PARSER?
22 Январь 2009, 14:07orko:
echo “tr td /td \n”;
for( $j=0; $j<=$ws['max_col']; $j++ ) {
echo “ ”;
if( $j>25 ) echo chr((int)($j/26)+64);
echo chr(($j % 26) + 65).” ”;
}
tr после цикла не закрыт.
20 Февраль 2009, 2:14admin:
orko, спасибо, исправил.
20 Февраль 2009, 14:35Dmitry Alexandrovich:
http://www.conone.ru - конвертор справочников 1С Предприятие 7.7 или таблицы Excel в PHP далее в таблицу MySQL.
11 Апрель 2009, 21:32Удачи!
Simon:
Возможно ли как-то обработать файл excel сохраненный в виде html-страницы таким же способом как это делает Spreadsheet_Excel_Reader?
23 Июнь 2009, 13:06Проблема в том, что Spreadsheet_Excel_Reader не понимает excel файл сохраненный в виде html-страницы.
Парсить html код в моей задачи не приемлемо.
admin:
Парсить html код в моей задачи не приемлемо
23 Июнь 2009, 13:56Я другого выхода не вижу - PCRE в помощь.
Петр:
Отличная библиотека, хорошо работает и понимает кириллицу.
1 Июль 2009, 10:05для нее нужна библиотеки iconv (если PHP<5) и mb_string
SPro:
Спасибо создателю.
25 Февраль 2010, 0:32Всё отлично работает.
Дай Бог тебе здоровья добрый человек!!!
Костя:
функция перекодировки не верна!
ВЕРО:
// конвертим в нужную кодировку
function uc2cp1251($str) {
return iconv(’UTF-8′,’windows-1251′,$str);
}
у меня так - работает!
17 Октябрь 2010, 23:36Александра:
Спасибо огромное. то что нужно было!
12 Январь 2011, 18:42Levik:
При работе с phpexcelreader иногда бывают проблемы с датой (+- один день).
2 Март 2011, 17:01Peter:
Парсер работает на ура!!!
14 Июнь 2011, 2:48Вот только как быть с .xlsx форматом?! Очень нужно, чтобы любой читал!!!
zZz:
Вот этот пример тоже отлично
18 Апрель 2012, 10:53http://www.ibm.com/developerworks/opensource/library/os-phpexcel/
PaLinkaPro:
Спасибо, то что надо - все работает отлично!!!!
19 Июль 2012, 16:43Константин:
Спасибо за наводку!
20 Июль 2012, 8:52