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

28.08.17

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Пример подстановки ссылок
.epf 10,21Kb
17
17 Скачать (1 SM) Купить за 1 850 руб.

Вступление

Маркетологи любят заморачиваться по-поводу красивых рекламных материалов. А еще они любят заморачитьвася по поводу красивого прайса! Не просто с картиночками, а с ссылочками на сайт. Чтобы сделать *ТЫК* и открылась страничка товара.
Но как мы хорошо знаем такую штуку средствами 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

См. также

SALE! 20%

Загрузка и выгрузка в 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С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С. Забудьте о ручном вводе: загружайте документы из Excel в 1С за секунды! Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С.

6000 5100 руб.

09.11.2016    237696    1076    904    

1012

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

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

3600 руб.

12.08.2021    36428    368    68    

160

SALE! 30%

Загрузка и выгрузка в 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С и нажимаете кнопку "Распознать и загрузить".

8400 5880 руб.

04.06.2019    108279    315    173    

327

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

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

11100 руб.

29.10.2014    217487    662    527    

457

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

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

4800 руб.

23.01.2022    11402    56    0    

38

Загрузка и выгрузка в 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 1С:Розница 3.0 Платные (руб)

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

16800 руб.

20.11.2015    157280    379    378    

514
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Дмитрий74Чел 238 05.06.24 12:11 Сейчас в теме
2. Дмитрий74Чел 238 07.06.24 15:40 Сейчас в теме
Если кто будет ковыряться таким же способом в xlsx то вот совет: чтобы формулы пересчитались при открытии файла - вставьте fullCalcOnLoad = "1"в файле workbook.xml в секции calcPr.
Оставьте свое сообщение