Файлы Excel: книга — это ZIP с XML, а в PDF таблиц нет вовсе
Что на самом деле внутри XLSX, почему извлечение таблицы из PDF — это догадка, а не извлечение, и какие ячейки становятся числами. Конвертируйте в браузере.
Кратко
- Тип
- Документы
- Расширения
- .xlsx
- MIME-тип
- application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
- Другие названия
- XLSX, Microsoft Excel, spreadsheet
Файл .xlsx — это ZIP-архив с XML, устроенный так же, как .docx, описанный на странице о Word, и появившийся в рамках того же перехода на Office Open XML в 2007 году. Переименуйте его в .zip — и найдёте часть книги со списком листов, по одной части на каждый лист с ячейками, часть со стилями и файлы связей, которые всё это соединяют. Поскольку это XML в ZIP, книгу можно записать без всякого кода Microsoft, что этот сайт и делает: пять XML-частей формируются напрямую, а не через добавленную в сборку библиотеку электронных таблиц. Текст ячеек записывается встроенными строками, так что каждый лист самодостаточен, а пределы — собственные пределы Excel: 1 048 576 строк, 16 384 столбца, 255 листов.
Подробнее
Вся трудность — на другой стороне. В PDF нет таблиц. В нём есть фрагменты глифов, у каждого из которых своя позиция, а видимые линейки — никак не связанные с ними операции рисования: нигде в файле не записано, что ячейка существует, не говоря уже о том, какой текст ей принадлежит. Поэтому сетку приходится выводить из геометрии — именно это на самом деле делает любой инструмент для такой задачи, включая платные.
Вывод идёт в два шага. Строки определяются по общим базовым линиям — это надёжная половина, потому что именно так страница и была свёрстана. Столбцы определяются по перекрывающимся горизонтальным промежуткам, причём полоса должна повториться в нескольких строках, прежде чем её сочтут столбцом: повторяемость отличает настоящий столбец от абзаца, у которого просто есть отступ. Одни только левые края не работают — это стоит отметить, потому что это очевидная первая реализация, и она ломается на самой обычной таблице: столбец количества с выравниванием вправо со значениями 6, 96 и 240 имеет три разных левых края, каждый на цифру в стороне, так что столбец распадается и в каждой строке появляется лишняя пустая ячейка. Перекрытие справляется с выравниванием влево, вправо и по центру, не зная, с каким из них имеет дело.
Что попадает в ячейку как число, определяется намеренно консервативно: простые десятичные числа, возможно со знаком, и больше ничего. 007, 1,234, 2026-09-10, +44 20 и всё, что содержит символ валюты, остаётся ровно таким, каким было, потому что ведущий ноль, разделитель тысяч и дата — это информация, которую принудительное преобразование уничтожило бы. Знаки после запятой сохраняются, так что 48.50 приходит как 48.50, а не 48.5. Ограничения указаны на странице, а не скрыты: объединённые ячейки попадают в первый охватываемый столбец, ячейка, текст которой переносится на две строки, становится двумя строками, на каждую страницу создаётся один лист, а страница без повторяющейся структуры столбцов возвращается одним столбцом строк — и для обычного текста это честный ответ.
Конвертировать другие форматы в Excel
Вопросы и ответы: Excel
XLSX действительно ZIP-файл?
Да, точно так же, как DOCX. Переименуйте его в .zip и откройте: внутри XML-части для книги, для каждого листа, для стилей и для связей между ними.
Числа действительно будут складываться?
Да, для ячеек с простыми десятичными числами — они записываются как числа, так что СУММ и прочие функции с ними работают. Всё неоднозначное намеренно оставляется текстом, а текст не суммируется.
Почему мой номер 007 пришёл как текст?
Потому что ведущий ноль — это информация. Если сохранить его как число, он превратится в 7, и вернуть ноль будет невозможно, поэтому значения, которые лишь выглядят как числа, остаются ровно такими, какими были.
В моей таблице пропали границы столбцов. Почему?
Столбцы распознаются по промежуткам ячеек, которые перекрываются и повторяются вниз по странице. Таблица из одной-двух строк или таблица с беспорядочно расположенными ячейками не даёт алгоритму за что зацепиться и возвращается строками текста.
Работает ли это со сканированным PDF?
Нет, и он отказывается, а не гадает. Распознавание возвращает одну строку текста на каждую рамку обнаружения — этого достаточно, чтобы восстановить обычный текст, но недостаточно, чтобы восстановить сетку: рамки достаточно часто сливают соседние ячейки, чтобы результат выглядел как таблица и был неверным.
Можно ли здесь конвертировать Excel в PDF?
Не локально. Чтобы отобразить книгу так, как это делает Excel, — с разрывами страниц, областями печати, шириной столбцов, — нужен Excel или LibreOffice, а ни то ни другое не работает во вкладке браузера. Конвертации здесь идут в XLSX, а не из него.