Чтение XLS (Excel 97-2003) в FastExcelReader
На этой странице
FastExcelReader читает устаревшие файлы .xls (BIFF8, формат Excel 97-2003) тем же API, что и XLSX.
Значения, даты, стили ячеек, текст формул и изображения возвращаются в точно такой же форме, поэтому
код, написанный под XLSX, работает без изменений.
Содержание
Открытие файла
Excel::open() выбирает ридер по сигнатуре файла, поэтому ничего специального не требуется:
use avadim\FastExcelReader\Excel;
$excel = Excel::open(__DIR__ . '/files/report.xls');
$rows = $excel->readRows();
Расширение файла не учитывается — только первые байты. На практике это важно: .xls очень часто
носят файлы, которые на самом деле являются XLSX, HTML или CSV.
Если нужно указать формат явно или отклонить всё, что не является файлом устаревшего формата:
$excel = Excel::openXls($file); // бросит исключение, если это не XLS
if (Excel::isXls($file)) {
// ...
}
API не отличается
Всё, что описано в остальных руководствах, применимо и к XLS:
$excel = Excel::open('report.xls');
$excel->readRows(true, Excel::KEYS_ONE_BASED);
$excel->sheet()->setReadArea('B2:D100')->readRows();
$excel->selectSheet('Summary')->readCells();
foreach ($excel->sheet()->nextRow() as $rowNum => $row) {
// ...
}
Области чтения, режимы ключей, withHeader(), генератор строк, форматирование дат, чтение стилей и
извлечение изображений реализованы один раз и общие для обоих форматов.
Память и скорость
XLS подходит для потокового чтения даже лучше, чем XLSX. Файл BIFF — это плоская последовательность записей, поэтому лист обходится за один проход вперёд, и в памяти находится одна запись. Два следствия:
- Обход строк через
nextRow()расходует постоянный объём памяти независимо от размера листа. - К листам обращение идёт переходом сразу на их смещение, поэтому открытие файла и чтение одного листа не затрагивают остальные.
Таблица размещения контейнера хранится компактной бинарной строкой, а не PHP-массивом, поэтому постоянные накладные расходы остаются небольшими даже для очень крупных файлов.
Что поддерживается
- Несколько листов, включая скрытые и «очень скрытые»
- Все типы ячеек — текст, числа, логические значения, значения ошибок, пустые ячейки
- Автоопределение дат по числовым форматам и тот же API форматирования дат, что у XLSX
- Стили ячеек: шрифты, заливки, рамки, выравнивание, числовые форматы, цвета палитры
- Объединённые ячейки, размеры листа, ширины столбцов, высоты строк
- Текст формул, включая общие формулы
- Встроенные изображения
Ограничения
- Только BIFF8. Файлы, записанные Excel 5.0/95 (BIFF5/BIFF7), отклоняются с понятным сообщением. Пересохраните их как Excel 97-2003 или как XLSX.
- Зашифрованные файлы не поддерживаются и отклоняются, а не читаются как мусор.
- Диаграммы, макролисты и диалоговые листы пропускаются — данных ячеек они не содержат.
- Текст формул восстанавливается по мере возможности. Формулы с токенами, которые декомпилятор не
умеет отображать — трёхмерные ссылки между листами, именованные диапазоны, формулы массива, вызовы
надстроек — возвращают
nullв качестве текста. При этом кэшированный результат такой формулы доступен всегда как значение ячейки, поэтому на чтение данных это не влияет. - Сам формат ограничен 65 536 строками и 256 столбцами на лист.
Отличия от XLSX
Это свойства форматов, а не ридера:
- Числовые форматы перенумеровываются записывающим приложением. Ячейка, отображающая
General, может нести встроенный идентификатор формата0в XLSX и пользовательский, например164, в XLS. Шаблон и итоговый тип значения одинаковы; отличается толькоformat-num-id. - Неформатированные серийные даты. При
dateFormatter(null)XLSX-ридер возвращает литеральный текст, как он записан в XML, например'30681.222951388889'(строку). В XLS хранился только двоичный double, поэтому возвращается число с плавающей точкой. Числовые значения совпадают, но исходных цифр текста в файле просто нет. - Имена изображений. XLSX сохраняет имя фигуры, заданное приложением (
Рисунок 4); XLS возвращает сгенерированное имя. Байты изображения, ячейка привязки и имя файла при этом идентичны.