|
Импорт данных из таблиц Excel Автоматический импорт данных на сайт из файла Excel стал возможен благодаря разработке модуля Spreadsheet_Excel_Reader, который доступен в виде открытой библиотеке для разработок на языке PHP (http://pear.php.net/package/Spreadsheet_Excel_Reader). Автор модуля взял на себя титаническую работу по обработке структуры данных этого непростого формата, поэтому нам остается в удобной объектно-ориентированной форме пользоваться его возможностями. Скрипт воспринимает только текстовые поля таблиц, а также числовые, поля даты и "сырые" данные (необработанные данные в формате файла Excel).

К сожалению, парсер воспринимает форматы таблиц от Excel95 до Excel 2003. Более старые версии могут интерпретироваться неправильно, вызывать зависание скрипта или сбой кодировки файла. Это ситуацию можно решить конвертированием в один из перечисленных форматов.
Алгоритм импорта данных
Импорт данных из таблицы состоит из двух этапов: загрузка данных из файла и последующая обработка массива с полученными данными. При этом в качестве входных параметров модуль получает файл Excel (.xls) и кодировку для отображения. Для кирилических сайтов эта кодировка обычно Windows-1251, или в формате модуля - CP1251 (CP - это "codepage", что значит "кодировка").
Подключение модуля
После того, как файл будет загружен на сервер (эту часть можно реализовать вольным образом, мы ее опустим), путь к нему - в нашем случае $importfile - необходимо передать на обработку скрипту:
require_once "Excel/reader.php"; $data = new Spreadsheet_Excel_Reader(); $data->setOutputEncoding("CP1251"); $data->read($importfile); unlink($importfile);
После этого в массиве $data окажутся загруженными данные из таблицы: листы таблицы, в них строки и ячейки.
Обработка полученных данных
Будем считать, что целью обработки данных для нас будет служить их отображение на странице. Для этого запустим цикл: переберем строки, в которых переберем столбцы. Общее число столбцов для первого листа (идентификатор 0) содержится в переменной $data->sheets[0]["numCols"], а общее число строк в $data->sheets[0]["numRows"]. В переменной $data->sheets[0]["cells"][$i][$j] содержится значение ячейки таблицы.
Итак, наш код будет выглядеть следующим образом:
echo "<table width="100%" cellpadding="2" cellspacing="2" border="1">"; for ($i=1; $i<=$data->sheets[0]["numRows"]; $i++) { echo "<tr>
"; for ($j=1; $j<=$data->sheets[0]["numCols"]; $j++) { if(isset($data->sheets[0]["cells"][$i][$j])) { $celldata=$data->sheets[0]["cells"][$i][$j]; } else { $celldata=""; } echo "<td>${celldata}</td>
"; } echo "</tr>
"; } echo "</table>";

Обратите внимание, что мы осуществляем проверку на наличие данных в ячейке. Кроме того, Вам может понадобиться проверка данных, хранящихся в ячейке. Эти сведения содержатся в переменной $data->sheets[0]["cellsInfo"][$i][$j]["type"]: "date", "number", или "unknown". Необработанное значение ячейки содержится в переменной $data->sheets[0]["cellsInfo"][$i][$j]["raw"].
|
|
|