
Экспорт HTML-таблиц в Excel — это распространенная задача в обработке данных, отчетности и автоматизации. Независимо от того, работаете ли вы с данными, полученными с веб-страниц, панелями управления или отчетами на основе HTML, преобразование таблиц в формат Excel может облегчить анализ данных и их обмен.
В этом блоге мы рассмотрим:
Экспорт простых HTML-таблиц
Работа с объединенными ячейками
Экспорт нескольких таблиц на отдельные листы
Расширенные параметры
1. Установка необходимых библиотек
Для начала установите необходимые пакеты Python:
pip install spire.xls.free beautifulsoup4
Почему эти библиотеки?
BeautifulSoup (bs4): Парсит HTML-контент и извлекает данные таблиц.
Free Spire.XLS for Python: Создает, изменяет и сохраняет Excel-файлы с форматированием.
Примечание: Бесплатная версия Spire.XLS имеет некоторые ограничения, но хорошо подходит для базовых и промежуточных операций с Excel.
2. Экспорт простой таблицы из HTML в Excel
Преобразование базовых HTML-таблиц в Excel является основой извлечения данных. Этот простой подход прекрасно подходит для простых, хорошо структурированных таблиц без объединенных ячеек или сложного форматирования.
Пошаговая реализация:
Парсинг HTML с BeautifulSoup
BeautifulSoup(html, 'html.parser') преобразует строку HTML в объект, который можно разобрать.
.find('table') находит первую таблицу в HTML.
Инициализация Excel-книги
Workbook() создает новую Excel-книгу.
Worksheets[0] получает первый лист (имя по умолчанию "Sheet1").
Процесс передачи данных
Вложенные циклы перебирают каждую строку (<tr>) и ячейку (<td>/<th>).
sheet.Range[row, col].Text записывает содержимое ячейки в Excel.
Форматирование и сохранение
AutoFitColumns() автоматически подстраивает ширину столбцов.
SaveToFile() экспортирует в формат XLSX.
Полный пример кода
from bs4 import BeautifulSoup
from spire.xls import Workbook, ExcelVersion
# Пример HTML (замените на свой HTML-контент или получите из URL/файла)
html = """
<html>
<head>
<style>
table {
border-collapse: collapse;
}
th, td {
border: 1px solid #000;
padding: 8px;
text-align: left;
}
</style>
</head>
<body>
<table>
<tr>
<th>Product ID</th>
<th>Name</th>
<th>Category</th>
<th>Price ($)</th>
<th>Stock</th>
</tr>
<tr>
<td>1001</td>
<td>Wireless Mouse</td>
<td>Electronics</td>
<td>24.99</td>
<td>150</td>
</tr>
<tr>
<td>1002</td>
<td>Mechanical Keyboard</td>
<td>Electronics</td>
<td>89.99</td>
<td>75</td>
</tr>
<tr>
<td>1003</td>
<td>Desk Lamp</td>
<td>Home</td>
<td>35.50</td>
<td>200</td>
</tr>
<tr>
<td>1004</td>
<td>Notebook</td>
<td>Office</td>
<td>12.00</td>
<td>300</td>
</tr>
</table>
</body>
</html>
"""
# Парсинг HTML и нахождение первой таблицы
soup = BeautifulSoup(html, "html.parser")
first_table = soup.find("table")
# Инициализация Spire.XLS книги
workbook = Workbook()
# Получение первого рабочего листа
sheet = workbook.Worksheets[0]
# Цикл по ячейкам в HTML-таблице и запись в Excel
for row_idx, row in enumerate(first_table.find_all("tr")):
for col_idx, cell in enumerate(row.find_all(["th", "td"])):
sheet.Range[row_idx + 1, col_idx + 1].Text = cell.get_text()
# Автоматическая подстройка ширины столбцов
sheet.AllocatedRange.AutoFitColumns()
# Сохранение в Excel
workbook.SaveToFile("HtmlTableToExcel.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

3. Экспорт таблицы с объединенными ячейками в Excel
Хотя базовые таблицы просты, объединенные ячейки требуют специальной обработки. Этот раздел основан на предыдущих знаниях для решения более сложных структур HTML-таблиц.
Как обрабатывать объединенные ячейки:
Обнаружение объединенных ячеек
Объединенные ячейки в HTML используют:
colspan="N" (горизонтальное объединение по столбцам)
rowspan="N" (вертикальное объединение по строкам).
Используйте cell.get("colspan", 1) и cell.get("rowspan", 1) для проверки на объединенные ячейки.
По умолчанию используйте 1, если атрибут отсутствует.
Применение объединения в Excel
Используйте sheet.Range[start_row, start_col, end_row, end_col].Merge() для объединения ячеек в Excel.
Пример: colspan="2" → Объединить по 2 столбца.
Пропуск объединенных ячеек
Отслеживайте объединенные ячейки в skip_cells, чтобы избежать повторной записи данных в них.
Полный пример кода
from bs4 import BeautifulSoup
from spire.xls import Workbook, ExcelVersion
# Пример HTML с объединенными ячейками (colspan/rowspan)
html = """
<table border="1">
<tr>
<th colspan="2">Merged Header</th>
<th>Normal Header</th>
</tr>
<tr>
<td rowspan="2">Merged Row</td>
<td>Cell A</td>
<td>Cell B</td>
</tr>
<tr>
<td>Cell C</td>
<td>Cell D</td>
</tr>
</table>
"""
# Парсинг HTML и нахождение первой таблицы
soup = BeautifulSoup(html, "html.parser")
table = soup.find("table")
# Инициализация Excel
workbook = Workbook()
sheet = workbook.Worksheets[0]
# Отслеживание объединенных ячеек для пропуска их позже
skip_cells = set()
# Цикл по HTML-строкам и ячейкам
for row_idx, row in enumerate(table.find_all("tr")):
col_idx = 1 # Столбцы Excel начинаются с 1
for cell in row.find_all(["th", "td"]):
# Пропуск уже объединенных ячеек
while (row_idx + 1, col_idx) in skip_cells:
col_idx += 1
# Получение значений colspan/rowspan (по умолчанию 1, если не указано)
colspan = int(cell.get("colspan", 1))
rowspan = int(cell.get("rowspan", 1))
# Запись значения ячейки в Excel
sheet.Range[row_idx + 1, col_idx].Text = cell.get_text(strip=True)
# Объединение ячеек, если colspan/rowspan > 1
if colspan > 1 or rowspan > 1:
end_row = row_idx + rowspan
end_col = col_idx + colspan - 1
sheet.Range[row_idx + 1, col_idx, end_row, end_col].Merge()
# Отметьте объединенные ячейки для пропуска
for r in range(row_idx + 1, end_row + 1):
for c in range(col_idx, end_col + 1):
if r != row_idx + 1 or c != col_idx: # Пропустить основную ячейку
skip_cells.add((r, c))
col_idx += colspan
# Автоматическая подстройка ширины столбцов
sheet.AllocatedRange.AutoFitColumns()
# Сохранение в Excel
workbook.SaveToFile("MergedCellsToExcel.xlsx", ExcelVersion.Version2016)
workbook.Dispose()

4. Экспорт нескольких таблиц на отдельные листы
Данные из реального мира часто поступают в нескольких связанных таблицах. Эта продвинутая техника организует разрозненные наборы данных в структурированную Excel-книгу.
Как работать с несколькими таблицами:
Нахождение всех таблиц
soup.find_all('table') сканирует HTML-документ и возвращает список всех элементов таблицы.
Работает с вложенными таблицами и таблицами с различными структурами.
Подготовка книги
Worksheets.Clear() удаляет пустой лист по умолчанию для чистого начала.
Выполняется только при наличии таблиц (если len(tables) > 0).
Создание организованных рабочих листов
Генерирует отдельные листы для каждой HTML-таблицы.
Автоматически нумерует листы (Таблица 1, Таблица 2).
Сохраняет оригинальную структуру таблицы и взаимосвязи данных.
Полный пример кода
from bs4 import BeautifulSoup
from spire.xls import Workbook, ExcelVersion
# Пример HTML с несколькими таблицами
html = """
<html>
<head>
<style>
table {
border-collapse: collapse;
}
th, td {
border: 1px solid #000;
padding: 8px;
text-align: left;
}
</style>
</head>
<body>
<h2>Products</h2>
<table>
<tr>
<th>Product ID</th>
<th>Name</th>
<th>Category</th>
<th>Price ($)</th>
<th>Stock</th>
</tr>
<tr>
<td>1001</td>
<td>Wireless Mouse</td>
<td>Electronics</td>
<td>24.99</td>
<td>150</td>
</tr>
</table>
<h2>Customers</h2>
<table>
<tr>
<th>Customer ID</th>
<th>Name</th>
<th>Email</th>
</tr>
<tr>
<td>2001</td>
<td>John Smith</td>
<td>john@example.com</td>
</tr>
</table>
</body>
</html>
"""
# Парсинг HTML и нахождение всех таблиц
soup = BeautifulSoup(html, "html.parser")
tables = soup.find_all("table")
# Инициализация Spire.XLS книги
workbook = Workbook()
# Удаление листа по умолчанию, если есть таблицы для обработки
if len(tables) > 0:
workbook.Worksheets.Clear()
# Цикл по каждой HTML-таблице и создание нового рабочего листа для каждой
for table_idx, table in enumerate(tables):
# Создание нового рабочего листа для каждой таблицы
sheet = workbook.Worksheets.Add(f"Table {table_idx + 1}")
# Запись данных таблицы в рабочий лист
for row_idx, row in enumerate(table.find_all("tr")):
for col_idx, cell in enumerate(row.find_all(["th", "td"])):
sheet.Range[row_idx + 1, col_idx + 1].Text = cell.get_text(strip=True)
# Автоматическая подстройка ширины столбцов для текущего листа
sheet.AllocatedRange.AutoFitColumns()
# Сохранение в Excel
workbook.SaveToFile("MultipleHtmlTablesToExcel.xlsx", ExcelVersion.Version2016)
5. Расширенные параметры
A. Получение HTML из URL
Извлечение HTML непосредственно с живых веб-страниц позволяет динамическую обработку данных. Используйте requests для динамического получения HTML:
import requests
response = requests.get("https://example.com/tables.html")
html = response.text
B. Форматирование Excel (границы, шрифты)
Профессиональное форматирование преобразует сырые данные в отформатированные отчеты. Spire.XLS предоставляет точный контроль над каждым визуальным элементом.
from spire.xls import CellStyle
style = sheet.Range[1, 1, 10, 10].Style
style.Borders.LineStyle = BorderLineStyle.Thin
style.Font.IsBold = True
6. Заключительные слова
Этот гид охватывает основные техники для экспорта HTML-таблиц в Excel с помощью Python. Независимо от того, работаете ли вы с простыми таблицами, объединенными ячейками или несколькими наборами данных, Free Spire.XLS и BeautifulSoup предоставляют надежное решение.