Перейти к содержанию

Как скопировать таблицу из Excel в HTML (и в Markdown, CSV, JSON)

Иногда нужно взять таблицу из Excel и вставить на страницу сайта. В 2018 году я сделал для этого конвертер: копируешь ячейки, вставляешь в поле, получаешь HTML.

Теперь он умеет больше: кроме HTML выдаёт Markdown, CSV, JSON, массив PHP и список Python. А заодно я нашёл в старой версии ошибку, которая ломала таблицу на ячейках с переносами строк. О ней ниже — на неё натыкается почти любой, кто разбирает вставку из Excel сам.

Конвертер: lexium.ru/pechenki/konverter-tablicy-excell-v-html/ — Excel или Google Таблицы → HTML, Markdown, CSV, JSON, PHP, Python. Работает в браузере, данные никуда не отправляются.

Что 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 руками.

А с вами был Доктор Лексиум.
До новых постов.

Написать комментарий

Адрес почты не публикуется. Обязательные поля отмечены звёздочкой.

Возможно, вы не читали

Транслитерация имени файла on-line

4 октября 2017
Время от времени заказчики присылают файлы для выкладывания на сервер. Обычно это либо изображения, либо pdf, но объединяет их одно…

Онлайн-генератор robots.txt для WordPress

7 октября 2017
Простой инструмент для создания файла robots.txt для сайта на системе управления WordPress. Делает роботс по нажатию кнопки. Введите адрес…