Чтение XLS (Excel 97-2003) в FastExcelReader

Источник: 4.5.0 · dd0d48d

На этой странице

FastExcelReader читает устаревшие файлы .xls (BIFF8, формат Excel 97-2003) тем же API, что и XLSX. Значения, даты, стили ячеек, текст формул и изображения возвращаются в точно такой же форме, поэтому код, написанный под XLSX, работает без изменений.

Содержание

  1. Открытие файла
  2. API не отличается
  3. Память и скорость
  4. Что поддерживается
  5. Ограничения
  6. Отличия от XLSX

Открытие файла

Excel::open() выбирает ридер по сигнатуре файла, поэтому ничего специального не требуется:

php
use avadim\FastExcelReader\Excel;

$excel = Excel::open(__DIR__ . '/files/report.xls');
$rows = $excel->readRows();

Расширение файла не учитывается — только первые байты. На практике это важно: .xls очень часто носят файлы, которые на самом деле являются XLSX, HTML или CSV.

Если нужно указать формат явно или отклонить всё, что не является файлом устаревшего формата:

php
$excel = Excel::openXls($file);      // бросит исключение, если это не XLS

if (Excel::isXls($file)) {
    // ...
}

API не отличается

Всё, что описано в остальных руководствах, применимо и к XLS:

php
$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 возвращает сгенерированное имя. Байты изображения, ячейка привязки и имя файла при этом идентичны.

Смотрите также

FastExcelReader 4.5.0 · Поиск по текущей библиотеке и версии.

Загрузка поиска…

Не удалось загрузить поиск. Попробуйте ещё раз.

Ничего не найдено. Попробуйте другое слово или имя метода.