Препарирование xlsx файлов без MS Excel

28.08.17

Интеграция - Загрузка и выгрузка в Excel

Зоопарк офисных программ? WPS Office, MS Office, Open Office? В статье пойдет речь о том, как отредактировать XLSX файлы без создания COM-объектов.

Скачать исходный код

Наименование Файл Версия Размер
Пример подстановки ссылок
.epf 10,21Kb
13
.epf 10,21Kb 13 Скачать

Вступление

Маркетологи любят заморачиваться по-поводу красивых рекламных материалов. А еще они любят заморачитьвася по поводу красивого прайса! Не просто с картиночками, а с ссылочками на сайт. Чтобы сделать *ТЫК* и открылась страничка товара.
Но как мы хорошо знаем такую штуку средствами 1С не сделать. Никак не хочет 1С выгружать рабочие гиперссылки в документы в формате *.xlsx. Для редактирования *.xlsx можно воспользоваться различными офисными пакетами и  API, которые они рпедлагают.

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

ДокументЭксель = Новый COMОбъект("Excel.Application");

У нас в фирме сложилась ситуация, что у части сотрудников стоит бесплатный офисный пакет Open Office, WPS Office, а у части стоит всем хорошо известный MS Office.
Писать свои процедуры для каждого из этих зверей ой как не хочется, правда ведь? 
Если вы ответили утвердительно, то описания выхода из ситуации чуток ниже =)

Цель

Имеется файл XLSX.
В нем есть столбец(текстовый) с ссылками на сайт.
Нужно заменить текст ссылкой. Ссылки должны отображаться как "Подробнее".

Общее описание формата XLSX

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

Файлы формата XLSX представляют из себя набор XML, упакованных в ZIP-архив.

Разобрать такой файлик можно нехитрым способом:

ДиалогВыбора = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбора.Заголовок = "Открытие";
		
Если ДиалогВыбора.Выбрать() Тогда
	Путь = ДиалогВыбора.ПолноеИмяФайла;
	Идентификатор = Строка(Новый УникальныйИдентификатор);
	Зип = Новый ЧтениеZipФайла;
	Зип.Открыть(ДиалогВыбора.ПолноеИмяФайла);
	Зип.ИзвлечьВсе(КаталогВременныхФайлов()+"Price\"+Строка(Новый УникальныйИдентификатор), РежимВосстановленияПутейФайловZIP.Восстанавливать);
КонецЕсли;

Общее описание содержиться в файлике workbook.xml.

Файл SharedStrings.xml содержит в себе значение всех текстовых ячеек файла. На него установлены ссылки из файлов sheet.xml (описание листов).

В папке workshhets содеражться описание непосредственно листов нашей эксельки.
В корне папки worksheets лежат файлы, описывающие листы.

В папке _rels, лежит файл, описывающий ссылки, которые нам нужны.

Более полную информацию можно найти по адресу: тыц.

Файл /xl/worksheets/sheet.xml

В файле содержиться как описание форматирования, так и данных.

Данные содержаться в теге <sheetData>. И указываются они построчно.

Например вот так:

<row r="8" ht="29" customHeight="true">
	<c r="A8" s="2" t="e"/>
	<c r="B8" s="3" t="s">
		<v>0</v>
	</c>
	<c r="C8" s="3" t="s">
		<v>1</v>
	</c>
	<c r="D8" s="3" t="e"/>
</row>


Тег <с> содержит следующие атрибуты:

r - код ячейки
t - тип значения в ячейке

Тег <v> - значение ячейки

Если t="s", тогда <v> - индекс записи в файле SharedString.xml.

Ссылки в файле sheet.xml описывают отдельным тегом <hyperlinks>.

</hyperlinks>
	<hyperlink ref="M1" r:id="rId3"/>
	<hyperlink ref="M2" r:id="rId4"/>
	<hyperlink ref="M3" r:id="rId5"/>
	<hyperlink ref="M4" r:id="rId6"/>
</hyperlinks>

ref - это код ячейки
id - идентификтор ссылки, указанной в файле xl\worksheets/_rels/sheet1.xml

Обратите особоое внимание на указание пространства имен r (xmlns:r="http://schemas.openxmlformats.org/package/2006/relationships"). Его указывать обязательно.

Также ВАЖНО соблюдать порядок тегов. Тег <hyperlinks> должен стоять выше, чем тег <pageMargins>. 

Файл /xl/worksheets/_rels/sheet1.xml

В нем все предельное все ясно и понятно. Приведм пример:

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">   
   <Relationship TargetMode="External" Target="//infostart.ru/public/225624/" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Id="rId1"/>
</Relationships>

Файл /xl/sharedStrings.xml

В нем все предельно ясно и понятно. Приведем пример:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="3" uniqueCount="3">
	<si>
		<t>ааа</t>
	</si>
	<si>
		<t>ввввв</t>
	</si>
	<si>
		<t>//infostart.ru/public/225624/</t>
	</si>
</sst>

Каждый тег <si/> - это значение текстовой ячейки. Как писали выше ссылки на файл sharedStrings.xml осуществляются по индексу, начиная с 0.

Решение поставленной задачи

Итак мы немного ознакомились со структурой файла с разрешением xlsx.
Для решения поставленной задачи нам необходимо:

  1. отредактировать файл /xl/worksheets/sheet.xml добавив в него теги <hyperlink>;
  2. отредактировать файл /xl/worksheets/_rels/sheet1.xml добавив в него теги <Relationship>;
  3. отредактировать файл /xl/sharedStrings.xml, где мы поменяем наши ссылки вида //infostart.ru/public/edit/ на текст "Подробнее".

Данные преобразования я выполнял с помощью объекта ДокументDOM. Вы можете вопользоваться другими способами.

Но есть один неприятный нюанс!

1С не умеет корректно прописывать пространство имен в атрибутах тегов! Для обхода этой проблемы пришлось вставить вот такой костыль:

//ФайлXLSX - структура, содержащая информация о распакованном архиве
Чтение = Новый ЧтениеТекста;
Чтение.Открыть(ФайлXLSX["Путь"+ИмяДокументаDOMФайлаXLSX]);
ДанныеФайла = Чтение.Прочитать();
//При добавлении тега <hyperlinks> вместо атрибута r:id был вставлен атрибуат faileID
ДанныеФайла = СтрЗаменить(ДанныеФайла, "faileID", "r:id");
Чтение.Закрыть();

Запись = Новый ЗаписьТекста;
Запись.Открыть(ФайлXLSX["Путь"+ИмяДокументаDOMФайлаXLSX]);
Запись.Записать(ДанныеФайла);
Запись.Закрыть();

Ну и в конце мы долждны запаковать наши файлики обратно:

ЗаписьZIP = Новый ЗаписьZipФайла();
ЗаписьZIP.Открыть(ИмяВременногоФайлаАрхива);
ЗаписьZIP.Добавить(ФайлXLSX.ДиректорияФайла+"\*", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно);		
ЗаписьZIP.Записать();

P.S.

На инфостарте был ряд публикаций, в которых данные читались из файлов XLSX, используя данный метод

Excel выгрзука XML

См. также

Загрузка номенклатуры из Excel в УТ11, КА 2, ERP 2, Розница 2. Дополнительные реквизиты и сведения, характеристики, картинки, цены, остатки

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка из файлов xls, xlsx, ods, csv, mxl в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

10560 руб.

29.10.2014    211358    630    526    

446

Загрузка номенклатуры c картинками (несколько потоков одновременно) и сопутствующими данными в базу и любые документы из yml, xls, xlsx, xlsm, ods, ots, csv для УТ 10.3, УТ 11 (все), БП 3, КА 2, ERP 2, УНФ 1.6/3.0, Розница 2

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 09.04.2024, версия 9.9 - 9.10)

14400 руб.

20.11.2015    151521    367    376    

503

Маркетплейсный загрузчик для 12-ти маркетплейсов в 1С:БП 3, УТ 11, КА 2, ERP, УНФ

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 Бухгалтерский учет 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы сделаете необходимые документы для Wildberries, OZON, ЯндексМаркет, Мегамаркет, Aliexpress, "Детский мир", Казань-Экспресс, "Леруа Мерлен", ЭНФАНТА (Акушерство), ЛаМода, Летуаль, "Твой дом" в документы "Отчет комиссионера (агента) о продажах" и другие, может работать в "Бухгалтерия 3", "Бухгалтерия 3 КОРП", УТ 11, УНФ, КА 2, ERP. Возможность подключить любые маркетплейсы. Анализ продаж ОЗОН. 30 дней БЕСПЛАТНОГО пользования!

1800 руб.

12.08.2021    32393    243    64    

123

SALE! 30%

Распознавание и загрузка сканов в 1С "одним нажатием": УПД, ТОРГ-12, накладные, счета, номенклатура, заказы и т.д.

Загрузка и выгрузка в Excel Документооборот и делопроизводство (СЭД) Учет документов Распознавание документов и образов Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная программа для распознавания ЛЮБЫХ СКАНОВ ИЛИ ФОТО ТОВАРНЫХ ДОКУМЕНТОВ в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML и т.д.) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

6000 5520 руб.

04.06.2019    101923    298    173    

314

SALE! 20%

Загрузка документов и номенклатуры из Excel в 1С "одним нажатием": УПД, ТОРГ-12, отчеты маркетплейсов, заказы, счета, прайсы

Загрузка и выгрузка в Excel Оптовая торговля Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

5000 4000 руб.

09.11.2016    216102    934    886    

944

Загрузка данных отчета о реализации товаров из Excel файла СберМегаМаркет

Загрузка и выгрузка в Excel Маркетплейсы Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса СберМегаМаркет для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11 и Управление нашей фирмой, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".

4800 руб.

07.06.2022    15418    82    0    

63
Оставьте свое сообщение