Что на самом деле хранит ячейка
В ячейке таблицы хранятся две отдельные вещи: значение и числовой формат. Значение 0.15 может отображаться как 15%, 0.15, £0.15 или 15.00%, и ни один из этих вариантов не меняет само значение ни на йоту. Это самый полезный факт о таблицах, и именно поэтому «Excel в CSV» предлагает выбрать между «Как отображаются в Excel» и «Исходные числа, даты ISO», а не угадывает. Первый вариант записывает ровно тот текст, что на экране, — 15/03/2024, 1,234.50, 12%: так делает «Сохранить как» в самом Excel, и этого ждёт человек, читающий CSV. Второй записывает простые числа и даты ISO — этого ждёт база данных или скрипт. Выберите не тот вариант, и импорт сломается так, будто данные повреждены.
Даты — это числа, которые притворяются датами. В ячейке с датой хранится порядковый номер дня, а точка отсчёта зависит от файла: книги из Excel для Windows считают от 1900 года, книги из старого Excel для Mac — от 1904-го, и между ними 1462 дня. Система 1900 года ещё и странная: она считает, что 29 февраля 1900 года существовало, — ошибка, унаследованная от Lotus 1-2-3 и сохранённая с тех пор ради совместимости. Здешние инструменты читают флаг точки отсчёта в каждой книге и воспроизводят этот несуществующий високосный день ровно там, где он должен быть, поэтому конвертированная здесь дата совпадает с тем, что показывает Excel, а не сдвигается на четыре года и один день.
Формула и её результат хранятся рядом. Книга содержит текст формулы и последнее вычисленное значение. При конвертации из книги в книгу — «ODS в XLSX», «XLS в XLSX», «XLSX в ODS» — переносятся сами формулы, переведённые между двумя наборами функций, поэтому лист по-прежнему пересчитывается при правке; те немногие функции, что есть только с одной стороны, показывают #NAME?, пока вы их не замените. Всё, что покидает мир таблиц, — CSV, JSON, XML — получает только вычисленный результат, потому что ни в одном из этих форматов нет понятия формулы.
CSV не может передать большую часть книги, и притворяться, что может, — значит терять данные. В нём нет листов, поэтому каждый лист становится отдельным файлом (а если нужны все — ZIP-архивом). В нём нет типов ячеек, поэтому каждое поле — текст, пока кто-то не попробует угадать тип. В нём нет форматов, формул, диаграмм, изображений, цветов и ширины столбцов. Объединённые ячейки приходится так или иначе разрешать: значение в первой ячейке или повтор во всём диапазоне. И CSV не записывает ни свой разделитель, ни десятичный знак, ни кодировку — поэтому европейский файл с точкой с запятой и запятыми в дробях попадает в американском Excel в один столбец, а текст с диакритикой превращается в кракозябры, если файл не начинается с метки порядка байтов (BOM).
Настоящий вред наносит текст, похожий на число. Открывая CSV, Excel угадывает тип для каждой ячейки отдельно: почтовый индекс 01234 теряет ноль, 16-значный номер заказа превращается в 1.23457E+15 без возможности восстановления, а название гена SEPT2 становится датой — проблема настолько серьёзная, что генетики переименовали свои гены. «CSV в Excel» решает один раз для каждого столбца, по всем его значениям, и конвертирует, только если с этим согласен весь столбец; всё, что начинается с нулей, и любое целое число, слишком длинное, чтобы число JavaScript хранило его точно, остаётся текстом. «JSON в CSV» так же бережно работает в обратную сторону и копирует 64-битные идентификаторы цифра в цифру там, где большинство конвертеров их округляет.
JSON и XML тоже теряют кое-что своё. В JSON вообще нет типа «дата», поэтому даты передаются текстом, и принимающий код должен знать, что перед ним. XML с данными несёт только значения — без форматирования, диаграмм и изображений: именно это и нужно для импорта, но не то, что вам нужно, если смысл был в том, чтобы сохранить книгу целиком.
Когда браузер действительно не подходит
Семь из этих инструментов никуда не отправляют ваш файл: «Excel в CSV», «CSV в Excel», «CSV в JSON», «JSON в CSV», «XML в Excel», «Excel в XML» и «PDF в Excel». Ничего не сохраняется — а это важно, когда в файле зарплатная ведомость или список клиентов. Четыре работают иначе: «Excel в PDF», «ODS в XLSX», «XLS в XLSX» и «XLSX в ODS» передают файл на наш сервер, потому что сверстать печатную страницу или перенести между форматами шрифты, цвета, условное форматирование и диаграммы веб-страница по-настоящему не может. Эти файлы передаются по зашифрованному соединению, конвертируются и удаляются, как только скачивание готово. Если сервер недоступен, каждый из них переключается на собственный конвертер, который сохраняет значения, формулы, числовые форматы, объединённые ячейки и ширину столбцов, но не шрифты, цвета и диаграммы, — и сообщает вам об этом.
Размер. Инструменты, работающие в браузере, держат всю таблицу в памяти, так что предел — объём памяти вашей вкладки: десятки мегабайт — без проблем, больше сотни — тяжело, многогигабайтная выгрузка — безнадёжно. Конвертеры книг принимают до 50 MB на файл, а «Excel в PDF» — до 40 MB, и оба сообщают об этом до конвертации, а не после. Лист Excel сам по себе заканчивается на 1 048 576 строках — это ограничение формата, а не наше; «CSV в Excel» продолжает на дополнительных листах с повтором заголовка, а не обрезает ваши данные молча.
Настоящая работа с данными. Конвертер — не база данных. Объединить две таблицы, убрать дубликаты, агрегировать, отфильтровать десять миллионов строк или разобрать грязную выгрузку — задачи для инструментов, созданных для этого, и бесплатные из них очень хороши: csvkit для быстрой правки CSV в командной строке, Miller — то же самое для JSON и CSV вместе, qsv — для скорости на огромных файлах, DuckDB — чтобы выполнять настоящий SQL прямо над файлом CSV или Parquet, pandas — если вы уже работаете в Python.
Макросы и всё исполняемое. VBA нельзя перенести в .xlsx — там для него просто нет места, — и в .ods он тоже не переносится, потому что LibreOffice выполняет лишь часть VBA, и различия проявились бы как неверные числа, а не как ошибки. Если книга зависит от макросов, храните оригинал рядом с конвертированной копией. С защищённых паролем файлов пароль нужно сначала снять в программе, которая его установила.
Автоматизация. Эти инструменты работают, когда человек нажимает кнопку. Конвертация ночной выгрузки — работа для командной строки: LibreOffice в режиме headless справляется со всеми форматами с этой страницы.
Как выбрать между похожими инструментами
Excel в CSV или Excel в XML. Оба читают книгу и записывают плоский файл данных, а выбор определяет место назначения. CSV — для таблиц, баз данных и всего, что просит «загрузите CSV». XML — для импорта и интеграций с заданными именами элементов: вы задаёте имена корня и строки, заголовки становятся именами элементов, а значения выводятся простыми числами и датами ISO. «Excel в XML» умеет также записывать XML Spreadsheet 2003 — а это совсем другое: формат, который Excel снова открывает как книгу, на случай, когда система просит «Excel XML», а не ваш собственный XML с данными.
CSV в Excel или CSV в JSON. Тот же парсер, то же определение типов по столбцам, разный результат. «CSV в Excel» создаёт .xlsx с настоящими датами и числами, которые можно суммировать и сортировать, и закреплённой строкой заголовков с фильтрами — для людей. «CSV в JSON» создаёт массив объектов, массив массивов, объект с ключами или JSON Lines — для кода. Если нужно и то и другое, конвертируйте в Excel для людей и в JSON для конвейера данных: результаты совпадут, потому что типы столбцов определялись одинаково.
XML в Excel или Excel в XML. Это не просто противоположные направления. «XML в Excel» сначала должен найти таблицу: он ищет элементы, повторяющиеся под одним родителем, — каждый <book> в каталоге, каждый <item> в RSS-ленте, — оценивает каждую группу и оставляет остальные в одном клике, а затем разворачивает атрибуты и вложенные элементы в столбцы, названные по пути. «Excel в XML» ничего искать не нужно: ваши строки уже и есть записи.
XLS в XLSX или CSV в Excel. Оба дают на выходе современную книгу. «XLS в XLSX» обновляет настоящий двоичный файл Excel 97–2003 и сохраняет всё, что в нём есть, — листы, формулы, форматирование, диаграммы. «CSV в Excel» строит книгу из простого текста, в котором ничего этого никогда не было. Пересекаются они в неприятном промежуточном случае: многие веб-сервисы выгружают HTML-таблицу или XML-файл и называют его .xls. «XLS в XLSX» распознаёт, чем такие файлы являются на самом деле, и сохраняет настоящую книгу.
PDF в Excel или Excel в PDF. Противоположные направления, и надёжно только одно из них. «Excel в PDF» — задача вёрстки: книга уже знает свою область печати, разрывы страниц и форматирование, и конвертер их отрисовывает. «PDF в Excel» — трудное направление, потому что PDF записывает, где был нарисован каждый символ, и ничего не знает о том, к какой ячейке он относился, — столбцы восстанавливаются по положению. Он хорошо работает с чистыми таблицами с линиями сетки, требует доработки там, где ячейки объединены или текст переносится на несколько строк, воссоздаёт значения, но не форматирование и не формулы, и помещает каждую страницу PDF на отдельный лист. Если исходная книга ещё существует, попросите её.
«ODS в XLSX» или «Excel в CSV» для файла .ods. «Excel в CSV» спокойно открывает .ods и отдаёт значения. «ODS в XLSX» сохраняет книгу книгой — с формулами, форматированием и диаграммами. Используйте конвертер, когда кому-то нужно работать в файле, и путь через CSV, когда системе нужны из него числа.