Иногда нужно взять таблицу из Excel и вставить на страницу сайта. В 2018 году я сделал для этого конвертер: копируешь ячейки, вставляешь в поле, получаешь HTML.
Теперь он умеет больше: кроме HTML выдаёт Markdown, CSV, JSON, массив PHP и список Python. А заодно я нашёл в старой версии ошибку, которая ломала таблицу на ячейках с переносами строк. О ней ниже — на неё натыкается почти любой, кто разбирает вставку из Excel сам.
Что Excel кладёт в буфер обмена
Скопированные ячейки попадают в буфер обычным текстом: внутри строки — табуляция, между строками — перевод строки. Это формат TSV (tab-separated values).
Кажется, что достаточно разбить текст по \n на строки, а строки по \t на ячейки. Так я и сделал в 2018-м.
Грабли №1: перенос строки внутри ячейки
Стоит в ячейке нажать Alt+Enter — и простой способ ломается. Excel кладёт такую ячейку в кавычках:
Товар Цена Описание
Чай 120 "Чёрный
пакетики"
Деление по переводам строк превращает её в две строки таблицы, и всё дальше съезжает. Правило у Excel такое: если в ячейке есть перевод строки, кавычка или табуляция, ячейка берётся в двойные кавычки, а кавычки внутри удваиваются (""). Значит, текст нужно читать посимвольно и помнить, внутри кавычек ты или нет. Новый конвертер так и делает.
Грабли №2: в старой версии
Старый код к тому же открывал строку тегом </td> вместо <td>, добавлял пустую строку в конце из-за хвостового перевода строки и не экранировал < и & — текст вроде <b> из ячейки становился настоящим тегом. Браузеры прощали, редакторы — не всегда. Теперь всё это исправлено.
Как сделать то же в скрипте
Если таблицы из Excel приходится разбирать регулярно, это удобнее автоматизировать. Ничего писать не нужно: формат с кавычками понимают стандартные CSV-парсеры, достаточно указать разделитель — табуляцию.
Python, без сторонних библиотек:
import csv, io
rows = list(csv.reader(io.StringIO(text, newline=""), delimiter="\t"))
Python с pandas читает прямо из буфера обмена:
import pandas as pd
df = pd.read_clipboard(sep="\t")
df.to_html("table.html", index=False) # или to_csv, to_json
PHP — в посте «Как превратить таблицу в массив».
Объединённые ячейки по-прежнему не переносятся: в буфер они попадают уже разбитыми. Лично я такие таблицы из Excel на сайт не переносил ни разу — если надо, проще добавить colspan руками.
А с вами был Доктор Лексиум.
До новых постов.