Разработка · 6 мин чтения

Выгрузка данных из веб приложения: CSV, Excel и отчёты по расписанию

Выгрузка данных из веб приложения превращается в отдельную задачу, как только бизнес перерастает ручное копирование из админки в Excel. Бухгалтеру нужен список заказов за месяц, менеджеру - таблица лидов с фильтром по региону, а 1С ждёт файл с остатками каждую ночь. Я регулярно настраиваю такие выгрузки клиентам на Tilda, WordPress с WooCommerce и кастомных веб-сервисах, и ниже разбираю рабочие связки: когда хватает простого CSV, когда нужен Excel с форматированием и как автоматизировать отправку отчётов по расписанию, не нанимая человека, который каждое утро жмёт кнопку «Экспорт».

Зачем регулярно выгружать данные из сайта или сервиса

Чаще всего запрос звучит просто: «дайте выгрузку заказов» или «пришлите таблицу клиентов». За этим обычно стоит один из трёх сценариев. Первый - синхронизация с бухгалтерией: на проекте с интернет-магазином на WooCommerce выгрузка заказов в CSV раз в сутки кормит 1С, и бухгалтер вообще не заходит в WordPress. Второй - аналитика: маркетологу нужна выгрузка лидов с UTM-метками для сверки с рекламным кабинетом, и делать это руками из панели CRM каждую неделю никто не хочет. Третий - отчётность перед заказчиком или руководителем, когда нужен файл в Excel с готовым форматированием, а не сырые данные из базы.
Во всех трёх случаях задача одна: превратить то, что лежит в базе веб-приложения, в файл, который можно открыть без доступа к админке. Дальше разница только в формате и в том, нужен ли человек, чтобы нажать кнопку.

Экспорт в CSV: простой формат для интеграций и 1С

CSV - формат для машин, а не для людей. Он весит меньше Excel, открывается любой системой и идеально подходит для передачи данных между сервисами: 1С, Google Таблицы через импорт, скрипты на Python, другие CRM. У Tilda есть встроенная выгрузка заказов из панели «Заказы» в CSV и Excel без единой строчки кода, у WooCommerce товары и заказы выгружаются в CSV прямо из панели администратора.
Есть два момента, на которых спотыкаются почти все, кто делает такую выгрузку впервые.

  • Кодировка. Если в файле кириллица и его открывают в Excel на Windows, без BOM (byte order mark) в начале UTF-8-файла вместо текста будут кракозябры. Я всегда добавляю BOM при генерации файла на сервере.
  • Разделитель. Стандарт CSV - запятая, но Excel с русской локалью по умолчанию ждёт точку с запятой, иначе весь файл схлопывается в один столбец.

Для разовой ручной выгрузки штатного экспорта платформы обычно достаточно. Для регулярной передачи в 1С или во внешнюю систему я пишу отдельный скрипт, который формирует файл по расписанию и кладёт его туда, откуда его заберёт вторая система - на FTP, в папку на сервере или сразу шлёт вебхуком.

Критерий CSV Excel (XLSX)
Размер файла Меньше, чистый текст Больше из-за форматирования и метаданных
Формулы и стили Не поддерживает Формулы, цвета, объединение ячеек, несколько листов
Открытие сторонними системами (1С, скрипты) Читается практически любым парсером Нужна библиотека для разбора XLSX
Удобство для человека без техфона Ниже, все данные в одну строку Выше, готовая таблица с заголовками

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Выгрузка в Excel: форматирование, несколько листов и формулы

Когда файл идёт человеку, а не другой системе, CSV не спасает: заказчик открывает его и видит нечитаемую простыню. Для отчётов делаю выгрузку сразу в XLSX - с закреплённой шапкой, автоматической шириной колонок и, если нужно, отдельным листом со сводкой поверх листа с сырыми данными.
На Python это обычно pandas с движком openpyxl, на PHP - PhpSpreadsheet, если веб-приложение на Laravel или WordPress. Пример на Python, который тянет данные из базы и кладёт их на отдельный лист с понятным названием:

import pandas as pd

df = pd.read_sql(
    "SELECT id, email, total, created_at FROM orders WHERE created_at >= %s",
    conn,
    params=[start_date],
)

with pd.ExcelWriter("report.xlsx", engine="openpyxl") as writer:
    df.to_excel(writer, sheet_name="Заказы", index=False)

Если отчёт собирается из нескольких таблиц (заказы, клиенты, остатки), я развожу их по отдельным листам одной книги, а не делаю три разных файла - так получателю не нужно переключаться между вкладками почты. Для простой доработки экспорта на Tilda, например добавить в выгрузку заказов колонку с промокодом или комментарием клиента, обычно хватает кастомного скрипта от 3 000 ₽, для интеграции с CRM или эквайрингом уже нужна связка сложнее, от 40 000 ₽.

Отчёты по расписанию: как автоматизировать выгрузку

Ручной экспорт нормально работает, пока отчёт нужен раз в месяц. Как только частота растёт до «каждое утро» или «каждый час», ручная выгрузка превращается в чью-то рутинную обязанность, а с ней рано или поздно случаются пропуски.
Есть три рабочих способа автоматизировать выгрузку.

  • Cron на сервере. Скрипт формирует файл и отправляет его по расписанию, задача ставится одной строкой вроде 0 6 * * * /usr/bin/python3 /opt/scripts/export_report.py. Подходит, когда логика простая и есть доступ к серверу.
  • n8n. Визуальный сценарий: забрать данные по API или из базы, привести в нужный формат, отправить на почту, в Telegram или в облачное хранилище. Для регулярной выгрузки отчётов по расписанию я обычно настраиваю автоматизацию в n8n, которая собирает данные, конвертирует их в CSV или Excel и рассылает получателям без ручного запуска.
  • Telegram-бот на aiogram. Когда отчёт нужен не по почте, а прямо в чат - бот по расписанию формирует файл и присылает его менеджеру или в рабочую группу. Удобно для ежедневных сводок по продажам.

Выбор между ними зависит от того, где уже живёт инфраструктура. Если есть сервер под проект - проще написать скрипт и повесить его на cron. Если инфраструктуры нет или отчёт собирает данные из нескольких разных источников (сайт, CRM, рекламный кабинет), n8n экономит время, потому что не нужно писать интеграции с нуля под каждый сервис.

Как выгружать большие объёмы без нагрузки на сайт

На одном из проектов простой SELECT * на выгрузку 50 000 строк заказов клал сайт на несколько секунд в момент запроса - база блокировала таблицу, и у живых посетителей в это время подвисала оплата. С такими объёмами прямой запрос из-под веб-приложения в рабочие часы - плохая идея.
Что помогает на практике:

  • Гонять тяжёлую выгрузку ночью или в окно низкой нагрузки, а не по требованию пользователя.
  • Выбирать данные постранично (LIMIT/OFFSET или курсор по id), а не одним запросом на всю таблицу.
  • Писать CSV потоково, строка за строкой, вместо того чтобы сначала собрать весь датасет в памяти и потом сохранить файл.
  • Если выгрузка нужна регулярно и объём растёт, читать данные с реплики базы, а не с продовой, которая обслуживает сайт.

Для веб-приложений с активным трафиком закладываю это сразу в архитектуру выгрузки, а не после первого инцидента - переделывать готовый экспорт под потоковую отдачу дороже, чем спроектировать его правильно с самого начала.

Частые вопросы

Какой формат выбрать для передачи данных в 1С?

CSV. 1С и большинство учётных систем ждут именно его, а не Excel - разбирать XLSX сложнее, и часть коробочных обменов вообще не поддерживает этот формат напрямую. Excel имеет смысл, только если файл открывает человек, а не программа.

Можно ли настроить выгрузку без доступа к серверу и коду?

Частично да, если платформа даёт штатный экспорт - как в Tilda с выгрузкой заказов из панели «Заказы» или в WooCommerce с экспортом товаров из админки. Но расписание, фильтры и автоматическая отправка получателю обычно требуют скрипта или сценария в n8n.

Что делать, если выгрузка Excel зависает или падает на большом файле?

Чаще всего дело в том, что весь файл собирается в памяти перед сохранением. Нужно писать данные построчно через потоковый режим библиотеки (у openpyxl есть write_only режим, у PhpSpreadsheet - экспорт через кэш на диск), а не держать весь датасет в объекте перед записью.

Как часто можно делать автоматическую выгрузку без риска для сайта?

Зависит от объёма данных и нагрузки на базу в конкретные часы. Небольшие выгрузки в пару тысяч строк спокойно идут раз в час, тяжёлые отчёты на десятки тысяч строк я обычно ставлю на ночное окно и с чтением из реплики, а не с боевой базы, которая держит сайт.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно