Конвертация Excel в XML: подробное руководство с примерами кода

Зачем преобразовывать Excel в XML и когда это необходимо

Формат XML (eXtensible Markup Language) стал стандартом де-факто для обмена структурированными данными между системами. В отличие от бинарных форматов .xls или .xlsx, XML-файлы читаемы как машинами, так и людьми — их можно открыть в любом текстовом редакторе и при необходимости отредактировать вручную. Это делает конвертацию из Excel в XML востребованной в самых разных сценариях.

Типичные случаи, когда требуется такое преобразование:

  • 📦 Интеграция с корпоративными системами — многие ERP (SAP, 1C, Oracle) принимают данные именно в XML для импорта заказов, справочников или отчётности.
  • 🌐 Обмен данными с веб-сервисами — API большинства платформ (от Google Ads до Яндекс.Маркета) ожидают XML-фиды для загрузки каталогов товаров.
  • 📊 Автоматизация отчётности — когда нужно сгенерировать отчёт в универсальном формате для дальнейшей обработки скриптами на Python, PHP или JavaScript.
  • 🔄 Миграция данных — перенос информации из Excel в базы данных (MySQL, PostgreSQL) часто проще организовать через промежуточный XML.

При этом важно понимать: XML не сохраняет формулы, условное форматирование или макросы из Excel — только сырые данные и базовую структуру (строки, столбцы, имена листов). Если ваша таблица содержит сложные вычисления, их результаты будут экспортированы как статические значения.

Способ 1: Сохранение в XML из Excel (встроенная функция)

Самый простой метод — использовать встроенные возможности Microsoft Excel или LibreOffice Calc. Он подходит для однократных задач и не требует установки дополнительного ПО. Рассмотрим процесс на примере Excel 2019/2021/365:

  1. Откройте ваш файл в Excel и перейдите на лист, который нужно экспортировать.
  2. Нажмите Файл → Сохранить как.
  3. В выпадающем списке Тип файла выберите XML данные (*.xml).
  4. Укажите имя файла и нажмите Сохранить.

На этом этапе Excel может выдать предупреждение о несоответствии данных схеме XML. Это нормально — программа предлагает создать схему автоматически. Соглашаемся и ждём завершения процесса.

Имена столбцов не содержат специальных символов (/,:, *)

Нет объединённых ячеек — они нарушат структуру XML

Данные в столбцах однотипны (например, не смешаны числа и текст)

Удалены пустые строки/столбцы на краях таблицы-->

⚠️ Внимание: Встроенный экспорт XML в Excel имеет ограничение — он сохраняет только один лист за раз. Если вам нужно конвертировать несколько листов, придётся повторять процедуру для каждого или использовать макросы VBA.

Результирующий XML-файл будет иметь следующую структуру:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<Данные_листа xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<Таблица>

<Строка>

<Столбец1>Значение1</Столбец1>

<Столбец2>Значение2</Столбец2>

</Строка>

<Строка>

<Столбец1>Значение3</Столбец1>

<Столбец2>Значение4</Столбец2>

</Строка>

</Таблица>

</Данные_листа>

Способ 2: Конвертация через Power Query (для сложных таблиц)

Если ваша таблица содержит иерархические данные, повторяющиеся блоки или требует предварительной очистки, лучше использовать Power Query — инструмент ETL (Extract-Transform-Load), встроенный в Excel с версии 2016. Он позволяет:

  • 🔄 Преобразовывать"широкие" таблицы в"длинные" (и наоборот)
  • 🧹 Очищать данные от дубликатов и ошибок
  • 🔗 Объединять несколько источников в один XML

Алгоритм действий:

  1. Выделите диапазон данных и нажмите Данные → Получить данные → Из таблицы/диапазона.
  2. В открывшемся окне Power Query отредактируйте структуру (при необходимости разверните столбцы, измените типы данных).
  3. Нажмите Файл → Закрыть и загрузить → Закрыть и загрузить в....
  4. Выберите Только создать подключение, затем перейдите в Данные → Получить данные → Запустить редактор Power Query.
  5. В редакторе нажмите Файл → Экспортировать → Экспортировать в файл XML.

Встроенные функции (СУММ, ВПР и т.д.)

Power Query

Макросы VBA

Скрипты на Python/R

Другое-->

Преимущество этого метода — гибкость. Например, вы можете:

  • 📌 Транспонировать таблицу перед экспортом (менять строки и столбцы местами)
  • 🔍 Фильтровать данные по условиям (например, экспортировать только строки с суммой заказа > 1000)
  • 🔄 Объединять несколько таблиц в один XML-файл с сохранением связей
Пример кода M для Power Query при экспорте в XML

Допустим, у вас есть таблица с заказами, где нужно развернуть столбец"Товары" (содержит список через запятую) в отдельные строки. Используйте этот код в дополнительном редакторе:

let

Источник = Excel.CurrentWorkbook{[Name="Таблица1"]}[Content],

РазвёрнутыеТовары = Table.ExpandListColumn(Table.TransformColumns(Источник, {{"Товары", Splitter.SplitTextByDelimiter(",", QuoteStyle.None), let itemType = (type nullable text) meta [Serialized.TextSplitDelimiter =","] in type {itemType}}}),"Товары")

in

РазвёрнутыеТовары

Способ 3: Онлайн-конвертеры — быстро, но с рисками

Если у вас нет доступа к Excel или нужно срочно преобразовать файл, можно воспользоваться онлайн-сервисами. Популярные варианты:

  • 🌐 Zamzar — поддерживает пакетную конвертацию (до 10 файлов одновременно)
  • 📁 CloudConvert — позволяет настроить кодировку и структуру выходного XML
  • 🔄 ConvertCSV — специализируется на преобразовании табличных данных

Как правило, процесс сводится к трём шагам:

  1. Загрузите файл .xls или .xlsx на сайт (размер обычно ограничен 50–100 МБ).
  2. Выберите формат XML в качестве целевого.
  3. Скачайте готовый файл после обработки.
⚠️ Внимание: Онлайн-конвертеры не подходят для конфиденциальных данных — ваш файл временно хранится на серверах третьих лиц. Кроме того, бесплатные версии часто накладывают ограничения на размер файла или количество строк (например, не более 1000 строк в ConvertCSV без регистрации).
Сервис Макс. размер файла Ограничение на строки Поддержка нескольких листов Настройка структуры XML
Zamzar 50 МБ Нет Нет (только первый лист) Минимальная
CloudConvert 1 ГБ (с регистрацией) Нет Да Расширенная (XSLT)
ConvertCSV 10 МБ 1000 строк Нет Базовая (теги по именам столбцов)
Aspose.Cells 10 МБ Нет Да Полная (кастомизация схемы)

Для автоматизации онлайн-конвертации можно использовать API некоторых сервисов (например, CloudConvert или Aspose). Это актуально, если вам нужно интегрировать преобразование в собственный софт. Пример запроса к API CloudConvert:

curl -X POST"https://api.cloudconvert.com/v2/jobs" \

-H"Authorization: Bearer ваш_api_ключ" \

-H"Content-Type: application/json" \

-d'{

"tasks": {

"import-1": {

"operation":"import/url",

"url":"https://example.com/file.xlsx"

},

"convert-1": {

"operation":"convert",

"input": ["import-1"],

"output_format":"xml",

"engine":"office"

},

"export-1": {

"operation":"export/url",

"input": ["convert-1"]

}

}

}'

Способ 4: Скрипты на Python с использованием библиотеки pandas

Для разработчиков и аналитиков данных наиболее гибкий способ — написание скрипта на Python с библиотекой pandas. Это позволяет:

  • 🔧 Точно контролировать структуру выходного XML (например, добавлять атрибуты или вложенные теги)
  • 📈 Обрабатывать большие файлы (миллионы строк) без ограничений онлайн-сервисов
  • 🔄 Автоматизировать конвертацию по расписанию (например, ежедневный экспорт отчётов)

Установите необходимые библиотеки:

pip install pandas xmltodict

Пример скрипта для преобразования Excel в XML с кастомизацией тегов:

import pandas as pd

import xml.etree.ElementTree as ET

from xml.dom import minidom

Чтение Excel-файла

df = pd.read_excel('input.xlsx', sheet_name='Лист1')

Создание корневого элемента XML

root = ET.Element('Данные')

Добавление строк как вложенных элементов

for _, row in df.iterrows:

запись = ET.SubElement(root,'Запись')

for колонка in df.columns:

ET.SubElement(запись, колонка).text = str(row[колонка])

Преобразование в читаемый XML

xml_str = ET.tostring(root, encoding='utf-8')

pretty_xml = minidom.parseString(xml_str).toprettyxml(indent="")

Сохранение результата

with open('output.xml','w', encoding='utf-8') as f:

f.write(pretty_xml)

Для обработки нескольких листов используйте pd.ExcelFile:

xls = pd.ExcelFile('input.xlsx')

for sheet_name in xls.sheet_names:

df = pd.read_excel(xls, sheet_name=sheet_name)

# Далее логика генерации XML для каждого листа

Способ 5: Макросы VBA для автоматизации (Excel)

Если вам нужно регулярно экспортировать данные из Excel в XML с фиксированной структурой, имеет смысл написать макрос на VBA. Это избавит от рутинных действий и снизит риск ошибок.

Пример макроса для экспорта активного листа в XML:

Sub ExportToXML

Dim ws As Worksheet

Dim xmlDoc As Object

Dim rootNode As Object

Dim rowNode As Object

Dim cellNode As Object

Dim i As Long, j As Long

' Создаём XML-документ

Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")

Set rootNode = xmlDoc.createElement("Данные")

xmlDoc.appendChild rootNode

' Обрабатываем активный лист

Set ws = ActiveSheet

For i = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).Row' Пропускаем заголовок

Set rowNode = xmlDoc.createElement("Строка")

rootNode.appendChild rowNode

For j = 1 To ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column

Set cellNode = xmlDoc.createElement(ws.Cells(1, j).Value)

cellNode.Text = ws.Cells(i, j).Value

rowNode.appendChild cellNode

Next j

Next i

' Сохраняем результат

xmlDoc.Save ThisWorkbook.Path &"\output.xml"

MsgBox"Экспорт в XML завершён!", vbInformation

End Sub

Чтобы запустить макрос:

  1. Нажмите Alt + F11 для открытия редактора VBA.
  2. Вставьте код в новый модуль (Insert → Module).
  3. Закройте редактор и запустите макрос через Вид → Макросы → Выполнить.
⚠️ Внимание: Макросы VBA блокируются по умолчанию в современных версиях Excel из-за рисков безопасности. Чтобы их разрешить, перейдите в Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов и выберите Включить все макросы (не рекомендуется для общедоступных файлов!).

Распространённые ошибки и как их избежать

При конвертации Excel в XML пользователи часто сталкиваются с типичными проблемами, которые ведут к некорректным файлам или потере данных. Вот наиболее частые из них и способы их решения:

Ошибка Причина Решение
Специальные символы (&, <, >) заменяются на &amp;, &lt; XML требует экранирования символов Используйте CDATA для текстовых полей или функции экранирования (например, xml.sax.saxutils.escape в Python)
Русские буквы отображаются как"?????" Неверная кодировка при сохранении Укажите encoding='utf-8' в скрипте или выберите UTF-8 при сохранении вручную
Пустые строки/столбцы пропали в XML Excel игнорирует пустые ячейки при экспорте Заполните пустые ячейки символом-заполнителем (например, #N/A) или обработайте их в скрипте
XML-файл не проходит валидацию по XSD-схеме Структура данных не соответствует ожидаемой Используйте инструменты вроде XML Validator (https://www.xmlvalidation.com/) для проверки и правки схемы
Числа сохраняются как текст (например,"1000" вместо 1000) Excel автоматически преобразует формат Перед экспортом приведите данные к нужному типу через =ЗНАЧЕН или в Power Query

Ещё одна типичная проблема — потеря связей между таблицами при экспорте нескольких листов. Например, если у вас есть главная таблица заказов и справочник клиентов на разных листах, в XML они превратятся в два независимых блока без ссылок. Решения:

  • 🔗 Объедините данные в одну таблицу через ВПР или Power Query перед экспортом.
  • 📌 Добавьте уникальные идентификаторы (ID) и сохраните их в XML как атрибуты: <Клиент id="123">....
  • 🔄 Используйте XSLT-преобразования после экспорта для восстановления связей.

FAQ: Ответы на частые вопросы

Можно ли конвертировать Excel в XML без потери форматирования (цвета, шрифты)?

Нет, XML сохраняет только данные и базовую структуру (строки, столбцы, имена листов). Форматирование (цвет ячеек, шрифты, границы) не переносится. Если нужно сохранить оформление, рассмотрите экспорт в PDF или HTML.

Как экспортировать в XML только выделенный диапазон, а не весь лист?

В Excel нет встроенной функции для экспорта выделенного диапазона в XML. Решения:

  1. Скопируйте диапазон на новый лист и экспортируйте его.
  2. Используйте VBA-макрос с указанием диапазона: Set ws = ActiveSheet.Range("A1:C100").
  3. В Python укажите диапазон при чтении: df = pd.read_excel('file.xlsx', sheet_name='Лист1', usecols='A:C', nrows=100).
Поддерживает ли Google Sheets экспорт в XML?

Google Sheets не имеет встроенной функции сохранения в XML, но есть обходные пути:

  1. Экспортируйте файл в CSV, затем конвертируйте CSV в XML через онлайн-сервисы или скрипты.
  2. Используйте Google Apps Script для генерации XML. Пример кода:
    function exportToXML {
    

    const sheet = SpreadsheetApp.getActiveSheet;

    const data = sheet.getDataRange.getValues;

    let xml ='<Данные>';

    data.slice(1).forEach(row => {

    xml +='<Строка>';

    row.forEach((cell, i) => {

    xml += `<${data[0][i]}>${cell}`;

    });

    xml +='';

    });

    xml +='';

    DriveApp.createFile('export.xml', xml);

    }

Как автоматизировать конвертацию Excel в XML для ежедневных отчётов?

Оптимальные решения для автоматизации:

  • 📅 Запланированные задачи в Windows: создайте .bat-файл с вызовом Python-скрипта и настройте его запуск через Планировщик заданий.
  • 🤖 Боты в Telegram/Slack: используйте библиотеку python-telegram-bot для отправки XML по команде.
  • ☁️ Облачные функции: разверните скрипт на AWS Lambda или Google Cloud Functions с триггером по времени.

Пример .bat-файла для автоматического запуска:

@echo off

cd C:\путь\к\скрипту

python excel_to_xml.py

pause

Можно ли конвертировать XML обратно в Excel после редактирования?

Да, но с нюансами:

  • В Excel: Файл → Открыть → Выбрать XML-файл (Excel предложит создать схему).
  • В Python: используйте pd.read_xml (требуется pandas>=1.3.0).
  • Онлайн: сервисы вроде ConvertCSV поддерживают обратное преобразование.

Обратите внимание: если вы вручную редактировали XML (например, добавили вложенные теги), Excel может некорректно интерпретировать структуру. В таких случаях лучше использовать XSLT для преобразования XML в"плоскую" таблицу.