Программа xlswift для создания свифт файла в ms excel

Обновлено: 04.07.2024

Уверенное владение Excel уже принято за норму, чем за исключение. И бизнес зачастую просто ни в каких других программах не работает с цифрами. Открыть excel-файл на телефоне в чате или гугл таблицах (тоже, кстати, отлично работает) намного проще, чем думать как запустить тетрадку jupyter notebook или целую программу на python.

(думается мне, после того как я разберусь с excel, напишу еще и про google sheets)

Ну, jupyter notebook это не та программа для телефона, скажете вы. Да, и вы правы, только наш бизнес сейчас весь на телефонах и совещаниях. Начальнику нужно быстренько взять открыть файл, сделать скрин и так далее.

И вот проходя множество курсов по анализу данных вы вряд ли найдете помимо экскурса в Python и SQL еще и Excel — все так стремительно хотят от него уйти, будто вы и так в нём хорошо работали.

Пока я училась поняла, что мало кто из студентов вообще понимает прелесть Excel. Они просто думают, что за Python будущее. Прежде чем мы действительно будем так думать, давайте разберемся с Excel.

Excel сейчас — это стандартная программа, которая ставится в комплекте Microsoft Office и есть на каждом ноутбуке (если её нет, найдется Libre, но смысл останется).

Там удобно посмотреть данные сразу, прокрутить, вставить один раз формулу и “протянуть” дальше. Построить быстренько несложные диаграммы из самостоятельно выбранных данных.

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

Excel локальный, ему не нужен выход в интернет. Вы не пытаетесь вслепую прописать колонки, а сразу видите их вместе. Быстро их фильтруете, или с помощью условного форматирования быстренько обрабатываете данные как необходимо.

Но бывает и такое, что ты сидишь и думаешь “это можно сделать проще”, но, увы, не знаешь как.

Все эти “можно сделать проще” возможны с помощью макросов или power query, но это может быть слишком сложно или наоборот долго, ну, и я зачем мы владеем python? 😃

Прежде чем мы перейдем к конкретной задаче, расскажу, что в Python с excel-документами можно и нужно работать с помощью pandas, openpyxl, xlrd, xlutils и pyexcel.


Друзья, обращаю ваше внимание, что в тексте приведен код для тех, у кого Excel на английском языке. В части с установкой xlwings я постаралась дать скриншоты и с русской версии. Но если у вас Excel на русском языке, пожалуйста, пишите формулы в скриптах на русском :)

Объединение нескольких excel-файлов

Да, эту задачу можно решить ручками или power query, где несколько таблиц передаете в запрос и объединяете.

Например, на работе вы можете работать с ежемесячными отчётами о продажах, и с 90% вероятностью вы будете заниматься консолидацией региональных отчётов. Однажды вас попросят подготовить не только сконсолидированный отчёт, но и найти/подсчитать общее количество продаж по всем этим отчетам — и всё как можно быстрее.

Вариант номер 1, описан выше. Excel, Power Query, добавляете отчёты, объединяете, открываете, смотрите.

Вариант номер 2. Excel, несколько таблиц, переносим вкладки в один документ, создаете еще одну вкладку с шаблоном, делаете подсчёты с помощью формул. Смотрите.

А можно Вариант номер 3. Объединить все excel-файлы в python, используя библиотеку pandas (да-да, pandas).

Устанавливаем pandas используя pip или conda в терминале:


И рассмотрим вариант работы с отчетом, который сделан по одному шаблону (например, придумаем самый простеньких отчёт о продажах фруктов).

Можно заметить, что наш отчёт начинается не с первой ячейки, а только с 4-й строчки, поэтому нам понадобятся данные для импорта, начиная с этой строки (мне кажется, здорово такоё вариант учесть, потому что в работе часто такое встречается). В приведенном ниже коде мы будем использовать функции read_excel и append .

Давайте посмотрим на то, что мы сделали здесь:

  1. В первой части мы импортировали pandas , создали список со всеми url-адресами и сгенерировали пустой фрейм данных под названием merger
  2. Во второй части мы просмотрели каждый элемент списка (url-адрес) в files , чтобы прочитать каждый файл, пропустив первые три строчки ( skiprows = 3 ) и добавив его в объединенный датафрейм( merger ).
  3. В третьей части мы генерируем новый excel-файл с именем merger.xlsx , содержащий наши объединенные файлы!

Получение значений нескольких файлов

Давайте посмотрим на другой пример.

Скажем, нам нужно было получить итого только по Москве из каждого отчета о продажах и собрать их в список. Мы знаем, что сумма сохраняется в ячейке F5 в каждой книге.

Для этого примера мы будем использовать другую библиотеку — openpyxl . Вы можете установить её с помощью pip или conda, используя код ниже:

А теперь посмотрим код и что он выполняет:

Если вы хотите выполнить код ниже, то запускайте код после сохранения файлов, сохраните файлы по ссылкам выше на свой компьютер.

Давайте разберем это шаг за шагом, сначала мы:

  • Создаем список ( files ), который содержит ссылки на все наши файлы. В Windows мы можем нажать Shift + правой кнопкой мыши и использовать Копировать как путь (или, Copy as Path), чтобы получить путь к файлу.
  • И создаем пустой список для хранения наших значений ( values )
  • Пишем цикл, который будет выполнять нужные нам манипуляции с каждым файлом:

— с помощью метода .load_workbook() загружаем файл

— и используем атрибут .value , чтобы извлечь значение ячейки и добавить его в список values методом .append()

Применение формул в книгах

В каждом из excel-файлов у нас есть итоги по строкам, но это не общая сумма продаж. Опять же, мы можем открыть каждую книгу и добавить формулу ручками, или мы можем использовать python, чтобы сделать это для нас.

Мы снова будем использовать openpyxl . Если вам нужно установить его, сделайте это по инструкции выше.

  • В этом фрагменте кода мы снова заполняем список файлов. Цикл for открывает каждый файл и присваивает соответствующее название листа.
  • Затем мы присваиваем строку = SUM(F5: F8) ячейке F9 и используем атрибут style для назначения стиля ячейки. Больше стилей ячеек можно найти в официальной документации.

А теперь я дополню эту связку, вот таким вот открытием — автоматизировать Excel, и по сути заменить VBA (в моём понимании) можно библиотекой xlwings.

Автор xlwings говорит, что библиотека “Make Excel Fly!”. Вы можете использовать xlwings + Python для следующих задач:

  1. Автоматизируйте Excel с помощью Python, например, создавая отчеты (другой пример описала выше)
  2. Напишите макросы на Python и запустите их из Excel, нажав на кнопку
  3. Напишите пользовательские функции в Python и вызовите эти функции из Excel так же, как и любую другую функцию Excel

Попробуем установить и рассмотреть несложный первый пункт. Пункты 2 и 3 рассмотрим в следующей серии.

Существует две части для установки xlwings: библиотека Python и надстройка Excel. Давайте начнем с установки библиотеки Python через командную строку:


Затем загрузите надстройку Excel из официального репозитория xlwings на Github. Это xlwings.xlam файл на странице (если вы вдруг будете читать эту статью через год, берите последнюю версию)

Положите xlwings.xlam-файл в папку надстройки Excel, которая является:

C:\Users\xxxx\AppData\Roaming\Microsoft\AddIns

Xxxx — это ваше собственное имя пользователя на вашем компьютере.

У меня получилось так, что я могу сейчас показать как это работает в английской и в русской версии Excel.

Затем откройте Excel, Файл -> Параметры -> Надстройки (или File -> Options -> Add-ins), нажимаем кнопку “Перейти..” (Go..) выбирая Надстройки Excel (Excel Add-ins).

[Делимся наработками] Программа XLSWIFT для создания свифт файла в MS Excel

Здесь обсуждается работа и проблемы других программ, которые могут быть связаны с налоговыми программами , бухгалтерским ПО и т.д.

[Делимся наработками] Программа XLSWIFT для создания свифт файла в MS Excel

DauletAhamanov » 30 авг 2012, 18:18

Преимущества:
- количество плательщиков ограничено лишь количеством копий файла;
- автоматический расчет социальных отчислений и обязательных пенсионных взносов с применением действующих на соответствующий период размеров минимальной заработной платы;
- автоматическая проверка на наличие в картотеке сотрудников, у которых наступил пенсионный возраст (пенсионеров);
- автоматическая проверка введенного ИИН сотрудников и индивидуальных предпринимателей, а также БИН юридических лиц;
- быстрота и необходимость ввода только нужных данных;
- малый размер и общедоступность файла. Для работы потребуется всего лишь наличие Microsoft Office.
//------------------------------------------------------------------------------------------------------------------------------//
ОБЯЗАТЕЛЬНО: распакуйте файл в C:\Program Files\ABC\, должен получится C:\Program Files\ABC\XLSWIFT внутри папки PL_POR.xls, XLSWIFT.xls файл. если есть программа тогда данные скопируйте и вставьте на новый файл (пароль на все листы 123) и замените файл в папке

Последний раз редактировалось DauletAhamanov 29 янв 2013, 21:33, всего редактировалось 29 раз(а).

Эта тема в сообществах:

DauletAhamanov » 09 янв 2013, 13:42

Кемел, тоже исправил с 5-тью знаками , тоже в файле zamena.txt

DauletAhamanov » 09 янв 2013, 13:54

обновил файл. При скачивание прочитайте текст с красным выделенным.
Если до вечера какие та изменение будет обновлю еще раз.

аксиомка » 09 янв 2013, 15:22

Даулет, а можно в платежку поставить код бюджетной классификации (КБК) 901101-пенсионка,пеня пенсионки. И 902101-соц.отчисл.,пеня соц.отч.

DauletAhamanov » 09 янв 2013, 22:26

Кемел писал(а): Даулет, теперь на компьютере, в других эксел файлах, при нажатии на сохранить пишет такой текст : предупреждение о конф. инф., документ содержит макросы, элементы управления . данные пакета расшир. или веб-компоненты. Они могут включать личные сведения, которые нельзя удалить с помощью инспектора документов.
это же не страшно ?
Проверьте:
1.Открываете редактор VBA (или нажатием кнопки ALT+F11)
2.Идете в Tools-References (Меню)
3.Находите там все пункты, напротив которых красуется MISSING . Снимаете с них галочки.

DauletAhamanov » 09 янв 2013, 22:28

аксиомка писал(а): Даулет, а можно в платежку поставить код бюджетной классификации (КБК) 901101-пенсионка,пеня пенсионки. И 902101-соц.отчисл.,пеня соц.отч.
я не бухгалтер, не пойму что это такое. я программу писал с помощью Тимура, без него программа была бы сырым.

DauletAhamanov » 09 янв 2013, 22:34

Если до выходных выявите ошибки, недоработки или еще другие предложение пишите что? где? когда?, максимальным описанием (скриншот в студию ) чтобы понял, и исправил ошибку. выходных обновлю файл, и добавлю чтобы со старого файла импортировал данные.

аксиомка » 09 янв 2013, 23:44

Даулет, в самой платежке есть такой пункт КБК и его обязательно нужно указывать. Я пример скинула(красным выдено).

аксиомка » 10 янв 2013, 12:14

Даулет, сегодня ходила в банк, платежка по соцотчислениям прошла(но там есть одна притензия(нет фамилии), а пенсионку не взяли.
В поле директор нужно сделать так, чтоб на против директора стояла фамилия Директора, а в строке (Обязательные пенсионные отчисления)-не нужно писать в НПФ. Про КБК сказали, что можно не писать.

Кемел » 10 янв 2013, 13:14

GRaiS » 10 янв 2013, 14:09

Вообще меня порадовал он-лайн банк Казкома. Там вообще: забил ФИО, г.р и ИИН. Все, ушло.

DauletAhamanov » 10 янв 2013, 15:21

аксиомка, когда я делал прог-у, я с перво вытаскивал с программы ГЦВП и оттуда копировал. Вообще можно редактировать Платежную пор. и т.д.
НПФ, в программе ГЦВП тоже был, "В поле директор нужно сделать так, чтоб на против директора стояла фамилия Директора" - это в свифт файле или . если свифт файле то тогда редактируется в листе "Предприятия" названия предприятии, ФИО директора, должность, и гл. бух. ABC это тестовая предпр. Вашем файле platej pensionka.xls Предприятия стоит ABC почему. или Вы оригинале забили Вашу предприятия.

аксиомка » 11 янв 2013, 01:10

На счет НПФ банк прям категорически против. Да, я забила в оригинале свое предприятие забивала, потом меняла. Мне нужно, чтоб в свифте на против директора стояла его фамилия. В листе, Предприятия,слово Генеральный, я убираю и рядом с директором пишу его ФИО, так?

DauletAhamanov » 11 янв 2013, 09:20

аксиомка, НПФ можно ручную удалить, ФИО и должность тоже можно ручную изменить в свифте
ФИО: /CHIEF/
НПФ: /ASSIGN/
"слово Генеральный директор" - это должность который выходить в плат. поруч.
В Листе "Предприятия" Руководитель - туда же (место слово директор) пишется ФИО руководителя, в свифте /CHIEF/ в этом строке.
Не знаю что за банк у Вас так просят. строка в свифт файле /ASSIGN/ не проверяется как знаю (в этом писали если прочитаете эту тему с начало до конца). Проверил в программе ГЦВП так же стоит НПФ, свифт файле не пишется должность директора, только ФИО. Последний раз редактировалось DauletAhamanov 11 янв 2013, 09:24, всего редактировалось 1 раз.

аксиомка » 11 янв 2013, 12:08

Цесна банку не нравятся такие надписи в платежках, они просят просто указывать-Обязательные Пенсионные отчисления и Социальные отчисления, без ГФСС и НПФ. Сегодня, после того как изменила все, платежки приняли.

Aigul1 » 11 янв 2013, 13:24

DauletAhamanov писал(а): 1. Скачайте архивированный файл в формате Excel Office XP/2003 с официального блога разработчика на форуме казахстанского налогоплательщика, расположенного по сетевому адресу: В разработке: Тестовая программа для создания SWIFT файла.
как скачать, че то я туплю что ли? Где-то ссылка есть или как?

timur_26_ » 12 янв 2013, 03:05

аксиомка писал(а): На счет НПФ банк прям категорически против.
Даулет, действительно, надо отредактировать (убрать НПФ и ГФСС) поле назначение платежа и привести его в соответствие с Правилами применения Государственного классификатора Республики Казахстан - единого классификатора назначения платежей, утвержденными постановлением Правления Национального Банка Республики Казахстан от 15.11.1999г. N 388.
Aigul1 писал(а): как скачать, че то я туплю что ли? Где-то ссылка есть или как? DauletAhamanov писал(а): на выходных обновлю файл , и добавлю

timur_26_ » 12 янв 2013, 03:16

GRaiS писал(а): И еще, сравниваю два файла. Один твой, второй с 1-С. С 1-С там есть РНН, после него идет ИИН, а у тебя просто ИИН, без РНН.
Примет его? список участников системы социального страхования, за которых производятся социальные отчисления по каждому физическому лицу, должен содержать: индивидуальный идентификационный номер (ИИН); регистрационный номер налогоплательщика (далее - РНН) ; фамилию, имя, отчество; дату рождения; сумму социального отчисления; период (год, месяц или месяцы) за который уплачиваются социальные отчисления.

DauletAhamanov » 12 янв 2013, 14:17

Приветствую Тимур! Посмотрел файл который Вы указали, сегодня думаю доделаю и обновлю. Проверите.

DauletAhamanov » 12 янв 2013, 18:17

Обновил файл:
1. Убрал в плат. поруч. слово НПФ и ГФСС, и из пени.
2. Теперь автоматический добавляется ИИН в плат. поруч. и реестре к пл. поручению, если у Вас КБе 19.
3. Теперь данные сотрудников хранятся в Sotrudniki.DBF(текстовом формате) файле. При каждом изменении листа "Сотрудники" автоматический пере сохраняет DBF файл.

Если в следующем файл(XLSWIFT.xls) обновиться, то тогда придется просто скопировать файл Sotrudniki.DBF, и вставить рядом XLSWIFT.xls файл, Ваши данные сотрудников обновиться. файл XLSWIFT.xls должен закрытым быть.

Последний раз редактировалось DauletAhamanov 12 янв 2013, 18:19, всего редактировалось 1 раз.

timur_26_ » 12 янв 2013, 18:26

Даулет, выдает следующую ошибку.

DauletAhamanov писал(а): Теперь данные сотрудников хранятся в Sotrudniki.DBF(текстовом формате) файле. При каждом изменении листа "Сотрудники" автоматический пере сохраняет DBF файл.
  • Тебе интересен форум? Ты хочешь участвовать и развивать его?
  • Тебе интересно в твоей профессии?
  • Тебе есть чем поделиться из твоего опыта с коллегами на форуме? Есть чем поделиться из собственного опыта, научить или рассказать?
  • Получить приглашение на форум
  • Радость общения
  • Совместное развитие

Кто сейчас на конференции

Продолжая традицию прошлых версий, новый Excel 2013 поставляется с набором из нескольких весьма примечательных COM-надстроек, заметно расширяющих возможности стандартного Excel. Подключение надстроек производится на вкладке Разработчик (Developer) кнопками Надстройки (Add-ins) и Надстройки COM (COM Add-Ins) . Некоторые из описанных ниже надстроек доступны только в полной версии Office 2013 Professional.

Inquire

Мощный инструмент диагностики и отладки. После подключения этой надстройки в интерфейсе Excel 2013 появляется новая вкладка на ленте:

2013-addins1.jpg

Надстройка умеет проводить подробный анализ ваших книг (Workbook Analysis) и выдавать подробнейший отчет по более чем трем десяткам параметров:

2013-workbook-analysis.jpg

Надстройка умеет наглядно отображать связи между книгами в виде диаграммы (команда Workbook Relationship):

2013-workbook-relationship-diagram.jpg

Также возможно создать подобную диаграмму для формульных связей между листами и между ячейками в пределах одного листа с помощью команд Worksheet Relationship и Cell Relationship:

2013-cell-relationship-diagram.jpg

Такой функционал позволяет оперативно отслеживать и исправлять нарушенные связи в формулах и наглядно представлять логику в сложных файлах.

Особого внимания заслуживает функция Compare Files. Наконец-то появился инструмент для сравнения двух файлов в Excel! Вы указываете два файла (например, оригинальная книга и ее копия после внесения правок) и наглядно видите что, где и как изменилось по сравнению с оригиналом:

2013-spreadsheet-compare.jpg

Отдельно, с помощью разных цветов, подсвечиваются изменения содержимого ячеек, формул, форматирования и т.д. В Word подобная функция есть уже с 2007 версии, а в Excel ее многим очень не хватало.

Ну, а для борьбы с любителями заливать цветом целиком все строки или столбцы в таблице пригодится функция Clean Excess Cell Formatting. Она убирает форматирования с незадействованных ячеек листа за пределами ваших таблиц, сильно уменьшая размер книги и ускоряя обработку, пересчет и сохранение тяжелых медленных файлов.

Power Pivot

2013-powerpivot-tab.jpg

Фактически, эта надстройка является Excel-подобным пользовательским интерфейсом к полноценной базе данных SQL, которая устанавливается на ваш компьютер и представляет собой мощнейший инструмент обработки огромных массивов данных, открывающийся в отдельном окне при нажатии на кнопку Управление (Manage) :

2013-powerpivot-window2.jpg

Power Pivot практически всеяден - вы можете загрузить в него информацию сразу из нескольких различных источников: текстовые файлы, базы данных, облачные интернет хранилища, другие файлы Excel или Access и т.д. - полный список включает почти двадцать вариантов и доступен через команду Получение внешних данных (Get External Data) :

2013-powerpivot-import2.jpg

Размер загружаемых таблиц не ограничен. А поскольку вся обработка происходит в оперативной памяти - скорость весьма впечатляющая. Как насчет сортировки 12 млн. строк меньше чем за секунду? Или построения сводной таблицы по такому же количеству записей меньше чем за пару секунд?

Инструменты Power Pivot позволяют связывать импортированные таблицы между собой по ключевым столбцам, фильтровать и сортировать их, выполнять над ними математические и логические операции с помощью более чем 150 функций встроенного языка DAX (вкладка Конструктор - Вставка функции). Многие инструменты этой надстройки теперь присутствуют и в стандартном Excel 2013. В частности, возможность строить сводные таблицы сразу по нескольким исходным таблицам из разных источников с помощью Data Model.

Power View

Эта надстройка попала в Excel 2013 из SharePoint, где она называлась Microsoft SQL Server 2012 Reporting Services Add-in. Ее основное назначение - представить пользователю инструменты для быстрого создания наглядных "живых" отчетов с использованием сводных таблиц и диаграмм на основе баз данных (то, что сейчас называют модным термином Business Intelligence = BI).

Вставить в книгу лист отчета Power View можно при помощи одноименной кнопки на вкладке Вставка (Insert) :

В основе отчетов Power View лежит "движок" Silverlight. Если он у вас его нет, то программа скачает и установит его сама (примерно 11 Мб).

Power View автоматически "цепляется" ко всем загруженным в оперативную память данным, включая кэш сводных таблиц и данные, импортированные ранее в надстройку Power Pivot. Вы можете добавить в отчет итоги в виде простой таблицы, сводной таблицы, разного вида диаграмм. Вот такой, например, интерактивный отчет я сделал меньше чем за 5 минут (не касаясь клавиатуры):

Впечатляет, не правда ли?

Весьма примечательно, что Power View позволяет привязывать данные из таблиц даже к географическим картам Bing:

Совершенно фантастический инструмент. В двух словах и даже статьях о нем не расскажешь - интересующихся отсылаю к соответствующим сайтам (раз, два, три). Если есть пять минут - посмотрите это видео, демонстрирующее основные возможности и приемы работы в Power View.

Apps for Office

Для Office 2013 и для Excel в частности, теперь есть свой онлайновый магазин ПО - Office Store, где пользователь может прикупить или скачать бесплатно дополнительные модули к программам пакета. Сделать это можно, используя команду Приложения для Office (Apps for Office) на вкладке Вставка (Insert) :

2013-apps-for-office1.jpg

Российского варианта магазина, правда, еще нет, так что вас перекидывает на родной штатовский магазин. Выбор достаточно велик:

2013-apps-for-office2.jpg

Так, например, на данный момент оттуда можно установить приложение для создания интерактивного календаря на листе Excel, отображения географических карт Bing, модуль онлайнового перевода, построители различных нестандартных диаграмм (водопад, гантт) и т.д. Выбранные приложения вставляются на лист Excel как отдельные объекты и легко привязываются к данным из ячеек листа. Думаю, сообщество разработчиков не заставит себя ждать и очень скоро мы увидим большое количество полезных расширений и приложений для Excel на этой платформе.

Есть в IT-отрасли задачи, которые на фоне успехов в big data, machine learning, blockchain и прочих модных течений выглядят совершенно непривлекательно, но на протяжении десятков лет не перестают быть актуальными для целой армии разработчиков. Речь пойдёт о старой как мир задаче формирования и выгрузки Excel-документов, с которой сталкивался каждый, кто когда-либо писал приложения для бизнеса.


Какие возможности построения файлов Excel существуют в принципе?

  1. VBA-макросы. В наше время по соображениям безопасности идея использовать макросы чаще всего не подходит.
  2. Автоматизация Excel внешней программой через API. Требует наличия Excel на одной машине с программой, генерирующей Excel-отчёты. Во времена, когда клиенты были толстыми и писались в виде десктопных приложений Windows, такой способ годился (хотя не отличался скоростью и надёжностью), в нынешних реалиях это с трудом достижимый случай.
  3. Генерация XML-Excel-файла напрямую. Как известно, Excel поддерживает XML-формат сохранения документа, который потенциально можно сгенерировать/модифицировать с помощью любого средства работы с XML. Этот файл можно сохранить с расширением .xls, и хотя он, строго говоря, при этом не является xls-файлом, Excel его хорошо открывает. Такой подход довольно популярен, но к недостаткам следует отнести то, что всякое решение, основанное на прямом редактировании XML-Excel-формата, является одноразовым «хаком», лишенным общности.
  4. Наконец, возможна генерация Excel-файлов с использованием open source библиотек, из которых особо известна Apache POI. Разработчики Apache POI проделали титанический труд по reverse engineering бинарных форматов документов MS Office, и продолжают на протяжении многих лет поддерживать и развивать эту библиотеку. Результат этого reverse engineering-а, например, используется в Open Office для реализации сохранения документов в форматах, совместимых с MS Office.

Но у прямого использования Apache POI есть и недостатки. Во-первых, это Java-библиотека, и если ваше приложение написано не на одном из JVM-языков, вы ей вряд ли сможете воспользоваться. Во-вторых, это низкоуровневая библиотека, работающая с такими понятиями, как «ячейка», «колонка», «шрифт». Поэтому «в лоб» написанная процедура генерации документа быстро превращается в обильную «лапшу» трудночитаемого кода, где отсутствует разделение на модель данных и представление, трудно вносить изменения и вообще — боль и стыд. И прекрасный повод делегировать задачу самому неопытному программисту – пусть ковыряется.

Но всё может быть совершенно иначе. Проект Xylophone под лицензией LGPL, построенный на базе Apache POI, основан на идее, которая имеет примерно 15-летнюю историю. В проектах, где я участвовал, он использовался в комбинации с самыми разными платформами и языками – а счёт разновидностей форм, сделанных с его помощью в самых разнообразных проектах, идёт, наверное, уже на тысячи. Это Java-проект, который может работать как в качестве утилиты командной строки, так и в качестве библиотеки (если у вас код на JVM-языке — вы можете подключить её как Maven-зависимость).

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


Шаблон документа (xls/xlsx template) выглядит примерно следующим образом:


Как правило, заготовку такого шаблона предоставляет сам заказчик. Вовлечённый заказчик с удовольствием принимает участие в создании шаблона: начиная с выбора нужной формы из «Консультанта» или придумывания собственной с нуля, и заканчивая размерами шрифтов и ширинами разделительных линий. Преимущество шаблона в том, что мелкие правки в него легко вносить уже тогда, когда отчёт полностью разработан.

Когда «оформительская» работа выполнена, разработчику остаётся

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

Если бы в форме, которую мы создаём, не было повторяющихся элементов с разным количеством (таких, как строки накладной, которых разное количество у разных накладных), то дескриптор выглядел бы следующим образом:


Здесь root – название корневого элемента нашего XML-файла с данными, а диапазон A1:Z100 – это прямоугольный диапазон ячеек из шаблона, который будет скопирован в результат. При этом, как можно видеть из предыдущей иллюстрации, подстановочные поля, значения которых заменяются на данные из XML-файла, имеют формат

(тильда, фигурная скобка, XPath-выражение относительно текущего элемента XML, закрывающая фигурная скобка).

Что делать, если в отчёте нам нужны повторяющиеся элементы? Естественным образом их можно представить в виде элементов XML-файла с данными, а помочь проитерировать по ним нужным образом помогает дескриптор. Повторение элементов в отчёте может иметь как вертикальное направление (когда мы вставляем строки накладной, например), так и горизонтальное (когда мы вставляем столбцы аналитического отчёта). При этом мы можем пользоваться вложенностью элементов XML, чтобы отразить сколь угодно глубокую вложенность повторяющихся элементов отчёта, как показано на диаграмме:


Красными квадратиками отмечены ячейки, которые будут являться левым верхним углом очередного прямоугольного фрагмента, который пристыковывает генератор отчёта.

Есть и ещё один возможный вариант повторяющихся элементов: листы в книге Excel. Возможность организовать такую итерацию тоже имеется.

Рассмотрим чуть более сложный пример. Допустим, нам надо получить сводный отчёт наподобие следующего:


Пусть диапазон лет для выгрузки выбирает пользователь, поэтому в этом отчёте динамически создаваемыми являются как строки, так и столбцы. XML-представление данных для такого отчёта может выглядеть следующим образом:

Мы вольны выбирать названия тэгов по своему вкусу, структура также может быть произвольной, но с оглядкой на простоту конвертации в отчёт. Например, выводимые на лист значения я обычно записываю в атрибуты, потому что это упрощает XPath-выражения (удобно, когда они имеют вид @имяатрибута ).

Шаблон такого отчёта будет выглядеть так (сравните XPath-выражения с именами атрибутов соответствующих тэгов):


Теперь наступает самая интересная часть: создание дескриптора. Т. к. это практически полностью динамически собираемый отчёт, дескриптор довольно сложен, на практике (когда у нас есть только «шапка» документа, его строки и «подвал») всё обычно гораздо проще. Вот какой в данном случае необходим дескриптор:

Полностью элементы дескриптора описаны в документации. Вкратце, основные элементы дескриптора означают следующее:

  • element — переход в режим чтения элемента XML-файла. Может или являться корневым элементом дескриптора, или находиться внутри iteration . С помощью атрибута name могут быть заданы разнообразные фильтры для элементов, например
    • name="foo" — элементы с именем тэга foo
    • name="*" — все элементы
    • name="tagname[@attribute='value']" — элементы с определённым именем и значением атрибута
    • name="(before)" , name="(after)" — «виртуальные» элементы, предшествующие итерации и закрывающие итерацию.
    • mode="horizontal" — режим вывода по горизонтали (по умолчанию — vertical)
    • index=0 — ограничить итерацию только самым первым встреченным элементом
    • sourcesheet —лист книги шаблона, с которого берётся диапазон вывода. Если не указывать, то применяется текущий (последний использованный) лист.
    • range – диапазон шаблона, копируемый в результирующий документ, например “A1:M10”, или “5:6”, или “C:C”. (Применение диапазонов строк типа “5:6” в режиме вывода horizontal и диапазонов столбцов типа “C:C” в режиме вывода vertical приведёт к ошибке).
    • worksheet – если определён, то в файле вывода создаётся новый лист и позиция вывода смещается в ячейку A1 этого листа. Значение этого атрибута, равное константе или XPath-выражению, подставляется в имя нового листа.

    Ну что же, настало время скачать Xylophone и запустить формирование отчёта.
    Возьмите архив с bintray или Maven Central (NB: на момент прочтения этой статьи возможно наличие более свежих версий). В папке /bin находится shell-скрипт, при запуске которого без параметров вы увидите подсказку о параметрах командной строки. Для получения результата нам надо «скормить» ксилофону все приготовленные ранее ингредиенты:


    Открываем файл report.xlsx и убеждаемся, что получилось именно то, что нам нужно:


    Так как библиотека ru.curs:xylophone доступна на Maven Central под лицензией LGPL, её можно без проблем использовать в программах на любом JVM-языке. Пожалуй, самый компактный полностью рабочий пример получается на языке Groovy, код в комментариях не нуждается:


    У класса XML2Spreadsheet есть несколько перегруженных вариантов статического метода process , но все они сводятся к передаче всё тех же «ингредиентов», необходимых для подготовки отчёта.

    Важная опция, о которой я до сих пор не упомянул — это возможность выбора между DOM и SAX парсерами на этапе разбора файла с XML-данными. Как известно, DOM-парсер загружает весь файл в память целиком, строит его объектное представление и даёт возможность обходить его содержимое произвольным образом (в том числе повторно возвращаясь в один и тот же элемент). SAX-парсер никогда не помещает файл с данными целиком в память, вместо этого обрабатывает его как «поток» элементов, не давая возможности вернуться к элементу повторно.

    Использование SAX-режима в Xylophone (через параметр командной строки -sax или установкой в true параметра useSax метода XML2Spreadsheet.process ) бывает критически полезно в случаях, когда необходимо генерировать очень большие файлы. За счёт скорости и экономичности к ресурсам SAX-парсера скорость генерации файлов возрастает многократно. Это даётся ценой некоторых небольших ограничений на дескриптор (описано в документации), но в большинстве случаев отчёты удовлетворяют этим ограничениям, поэтому я бы рекомендовал использование SAX-режима везде, где это возможно.

    Надеюсь, что способ выгрузки в Excel через Xylophone вам понравился и сэкономит много времени и нервов — как сэкономил нам.


    Надстройка Fincontrollex® ABC Analysis Tool позволяет полностью автоматизировать ABC-анализ в Microsoft Excel.

    Плагин для объединения таблиц и обобщения данных в Microsoft Excel 2000-2007. Advanced Consolidation Manager позволит вам обработать любое количество файлов за один запуск программы и может объединять данные из разных файлов в один.


    Мощный и удобный инструмент для сравнения файлов Microsoft Excel. Возможности программы: работа с файлами, таблицами или выбранным диапазоном ячеек; работа с файлами без их открытия в Microsoft Excel; внесение необходимых исправлений и изменений в документ непосредственно из отчета.


    Программа предназначена для создания связанных таблиц в формате DFS. Связанные таблицы могут быть любого направления: продавцы - продажи,
    дни - события, люди - сведения и другие.


    «EvA — Анализ Рисков» — это комплекс для анализа рисков в среде Microsoft Excel. Работая в Excel выбираете любой свой файл и практически автоматом проводите экономический анализ.


    CurrencyText.xla — функция Excel, позволяет преобразовывать числовые суммы в текстовое значение прописью.


    Fix Broken Links поможет вам обнаружить и восстановить нарушенные ссылки в связанных файлах Microsoft Excel.


    Программа MAPILab Find and Replace for Excel представляет собой расширенную и дополненную версию функции стандартного поиска и замены данных в файлах Microsoft Excel. Плагин содержит ряд существенных дополнений: одновременная работа с несколькими файлами; сохранение и загрузка поисковых запросов в качестве шаблонов для повторного использования и другие.


    Novo Forecast — самый быстрый и легкий способ расчета прогноза продаж в Excel.
    Novo Forecast работает с большими массивами данных — автоматически подберет модель прогноза из более чем 1000 комбинаций для каждого временного ряда. Рассчитает прогноз, границы прогноза, тренд, сезонность от 1-го дня до нескольких лет. Построит графики с сезонностью, моделью прогноза, границами прогноза, трендом. Сделает DashBoard для графического анализа большого массива данных. Утилита для MS Excel 2010-2013.


    Плагин предназначен для поиска и обработки дубликатов в ячейках таблиц Microsoft Excel. Основные возможности программы: поиск по строкам или столбцам; поиск по всей таблице или внутри заданного диапазона ячеек; возможность выбора типа сравнения: по значениям или по формулам.



    Starus Excel Recovery восстановит файлы электронных таблиц в форматах Microsoft Excel и OpenOffice, включая файлы со сбойных, отформатированных и заново разбитых на разделы накопителей. Режим контентного поиска считывает информацию с поверхности диска в низкоуровневом режиме, что позволяет восстанавливать файлы с проблемных устройств в самых сложных случаях.

    Читайте также: