Выгрузка в Excel с использованием формата OpenXML, разбор файла sheet1.xml

21.09.18

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

Судя по количеству просмотров темы https://infostart.ru/public/900022/ решил описать структуру файла Листа excel. На полноту не претендую, опишу то, что знаю.

Итак,  сам файл с описанием содержимого листа хранится в папке ...xl\worksheets с названием sheet1.xml. сколько листов, столько файлов.

Ссылки на лист записываются в несколько файлов:

1. [Content_Types].xml

  

	к = 1;
	Для каждого стр из книга.Листы цикл
		хмл.ЗаписатьНачалоЭлемента("Override");
		хмл.ЗаписатьАтрибут("PartName", "/xl/worksheets/sheet" + строка(к) + ".xml");
		хмл.ЗаписатьАтрибут("ContentType", "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml");
		хмл.ЗаписатьКонецЭлемента();
		к=к+1;
	КонецЦикла;

2. ...\xl\workbook.xml

	к=1;
	Для каждого стр из книга.Листы цикл
		хмл.ЗаписатьНачалоЭлемента("sheet");
		хмл.ЗаписатьАтрибут("name", стр.Имя);
		хмл.ЗаписатьАтрибут("sheetId", строка(к));
		хмл.ЗаписатьАтрибут("r:id", "rId"+ строка(к));
		хмл.ЗаписатьКонецЭлемента(); // sheet
		к=к+1;
	КонецЦикла;

3. \xl\_rels\workbook.xml.rels

	к=1;
	Для каждого стр из книга.Листы цикл
		хмл.ЗаписатьНачалоЭлемента("Relationship");
		хмл.ЗаписатьАтрибут("Id", "rId"+ строка(к));
		хмл.ЗаписатьАтрибут("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet");
		хмл.ЗаписатьАтрибут("Target", "worksheets/sheet"++ строка(к) + ".xml");
		хмл.ЗаписатьКонецЭлемента(); //Relationship
		к=к+1;
	КонецЦикла;	

3. xl\worksheets\_rels - папка с файлами описание связей листов


Процедура Записать_sheet1_xml_rels(Книга, путь)
	листы = новый массив;
	Для каждого табл из  Книга.Таблицы Цикл
		Если листы.Найти(табл.Значение.лист) = неопределено Тогда
			листы.Добавить(табл.Значение.лист);
		КонецЕсли;
	КонецЦикла;
	
	Для каждого лист из Листы Цикл 
		хмл = Новый ЗаписьXML;
		хмл.ОткрытьФайл(Путь+ "\sheet"+ строка(лист+1) + ".xml.rels");
		хмл.ЗаписатьОбъявлениеXML();
		
		хмл.ЗаписатьНачалоЭлемента("Relationships");
		хмл.ЗаписатьАтрибут("xmlns","http://schemas.openxmlformats.org/package/2006/relationships");
		
		Для каждого табл из Книга.Таблицы цикл
			если  лист = табл.Значение.Лист Тогда
				хмл.ЗаписатьНачалоЭлемента("Relationship");
				хмл.ЗаписатьАтрибут("Id", "rId"+ строка(лист+1));
				хмл.ЗаписатьАтрибут("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/table");
				хмл.ЗаписатьАтрибут("Target", "../tables/table"++ строка(лист+1) + ".xml");
				хмл.ЗаписатьКонецЭлемента(); //Relationship
			КонецЕсли;
		КонецЦикла;	
		хмл.ЗаписатьКонецЭлемента(); //Relationships
		хмл.Закрыть();
	КонецЦикла;	
КонецПроцедуры

в этих файлах привязываются таблицы к листу.

 

 

Далее немного о структуре файла листа.

<dimension ref="A1:BO38"/> - это первая и последняя ячейка листа.

-<sheetViews>

_______________________________________

-<sheetViews>


-<sheetView workbookViewId="0" tabSelected="1">

<pane state="frozenSplit" activePane="bottomRight" topLeftCell="I27" ySplit="11" xSplit="2"/> Заморозка листа: колонка строка

У меня написана функция

Процедура ДобавитьЗаморозку(книга,лист, колонка, строчка)  Экспорт
	книга.листы[лист].Заморозка = "<pane xSplit="""+ Строка(колонка)+""" ySplit="""+ Строка(строчка)+""" topLeftCell="""+
	       Excel_получить_имя(колонка+1)+  Строка(строчка+1)+""" activePane=""bottomRight"" state=""frozenSplit""/>";
КонецПроцедуры

 

</sheetView>

</sheetViews>

____________________

Секция cols содержит сведения о видимости колонок, и их ширина.  аттрибуты max  и min на какие столбцы это распространяется

<col customWidth="1" width="7" max="1" min="1"/>

<col customWidth="1" width="0" max="8" min="8" hidden="1"/>

_____________________________

секция <sheetData>

Основная секция листа. В ней хранится вся информация о данных листа.

<row r="1" spans="1:67" ht="16" customHeight="1" x14ac:dyDescent="0.35">  номер строки с данными spans как я понял  67 это последняя заполненная колонка на данной строке ht -высота строки  x14ac:dyDescent="0.35" - выравнивание в ячейке.

    <row r='1' spans='1:2' x14ac:dyDescent='0.2'>
        <c r='B1' s='9' t='s'><v>0</v></c>   тут хранятся данные:"r" - ячейка, "s" - стиль(рамка,шрифт,фон, форматирование, выравнивание.....),  t='s' - значит это строка или дата  v - индекс где она хранится в файле  sharedStrings.xml
    </row>

__________

секция mergeCells

описывает объединнные ячейки <mergeCell ref="AJ7:AM7"/>

в библиотеке по работе с OpenXML сделал такую структуру листа

Функция СоздатьКнигу(КоличествоЛистов = 1) Экспорт
	Шрифты  = Новый СписокЗначений;
	шрифты.Добавить("Arial_11","<font><sz val='11'/><name val='Arial'/><family val='2'/></font>");
	
	Заливки = Новый СписокЗначений;
	стр = Заливки.Добавить("fill_none","<fill><patternFill patternType='none'/></fill>");
	стр = Заливки.Добавить("fill_gray125", "<fill><patternFill patternType='gray125'/></fill>");
	
	Рамки   = Новый СписокЗначений;
	стр = рамки.Добавить("0000","<border><left/><right/><top/><bottom/><diagonal/></border>");
	
	Таблица = Новый Структура;
	таблица.Вставить("Имя"     , "");
	таблица.Вставить("Лист"    , 0);
	таблица.Вставить("Колонки" , новый массив);
	таблица.Вставить("диапазон", "");

	
	ДанныеКниги= Новый Структура;
	ДанныеКниги.Вставить("Рамки"  , Рамки);
	ДанныеКниги.Вставить("Шрифты" , Шрифты);
	ДанныеКниги.Вставить("Заливки", Заливки);
	
	ДанныеКниги.Вставить("Листы"  , Новый массив);
	Для к = 1 По КоличествоЛистов Цикл
	     ДобавитьЛист(ДанныеКниги, "Лист" + строка(к));
	КонецЦикла;
	ДанныеКниги.Вставить("Стили"  , Новый массив);
	ДобавитьСтиль(ДанныеКниги, 0, 0, 0, 0) ;
	ДанныеКниги.Вставить("ОбъединениеЯчеек" , Новый массив);
	ДанныеКниги.Вставить("ПорядокВычислений", Новый массив);
	ДанныеКниги.Вставить("СписокСтрок", Новый Массив);
	ДанныеКниги.Вставить("Таблицы"    , новый СписокЗначений);
	Возврат ДанныеКниги;
КонецФункции

Процедура ДобавитьЛист(Книга, Имя) Экспорт
	лист  = новый Структура;
	лист.Вставить("Имя"               , Имя);
	лист.вставить("заморозка","");
	лист.вставить("Диапозон","");
	лист.Вставить("ДанныеЛиста"       , Новый массив);
	лист.Вставить("Колонки"           , Новый массив);
	лист.Вставить("ОбъединенныеЯчейки", Новый массив);
	Книга.Листы.Добавить(лист);
КонецПроцедуры

Процедура  ДобавитьСтроку(книга, лист, номКолонка, номСтрока, значение, НомерСтиля=0) Экспорт
	СписокСтрок = книга.СписокСтрок;
	номстр = строка(СтрЗаменить(номСтрока,Символы.НПП,""));
	рез =  СписокСтрок.Найти(значение);
	если рез = неопределено Тогда
		СписокСтрок.Добавить(значение);
	КонецЕсли;
	НомерСтроки_shared_Strings = СписокСтрок.Найти(значение);

	Если книга.листы[лист].ДанныеЛиста.Количество()< номСтрока или книга.листы[лист].ДанныеЛиста[номСтрока-1] = Неопределено Тогда
		книга.листы[лист].ДанныеЛиста.вставить(номСтрока-1,Новый Массив);
	Конецесли;
	
	 //проверяем есть ли колонка
    Если книга.листы[лист].ДанныеЛиста[номСтрока-1].Количество()< номКолонка или книга.листы[лист].ДанныеЛиста[номСтрока-1][номКолонка-1] = Неопределено Тогда
		книга.листы[лист].ДанныеЛиста[номСтрока-1].вставить(номКолонка-1,Новый Массив);
	Конецесли;
	
	ячейка = Новый Структура;
	ячейка.Вставить("Значение",  значение);
	ячейка.Вставить("Представление",  "<c r='"  +  Excel_получить_имя(номКолонка) + номСтрока + "' s='"+строка(НомерСтиля)+"' t='s'><v>" + Строка(НомерСтроки_shared_Strings)+"</v></c>");

	книга.листы[лист].ДанныеЛиста[номСтрока-1][номКолонка-1]= ячейка;
КонецПроцедуры


дальше надо создать файл для листа

Процедура Записать_sheet_xml(Книга,путь,НомерЛиста,  ДанныеЛиста = неопределено)
	ФайлЛиста = путь + "\xl\worksheets\sheet" + НомерЛиста + ".xml";
	хмл = Новый ЗаписьXML;
	хмл.ОткрытьФайл(ФайлЛиста);
	хмл.ЗаписатьОбъявлениеXML();
	
	хмл.ЗаписатьНачалоЭлемента("worksheet");
	хмл.ЗаписатьАтрибут("xmlns", "http://schemas.openxmlformats.org/spreadsheetml/2006/main");
	хмл.ЗаписатьАтрибут("xmlns:r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships");
	хмл.ЗаписатьАтрибут("xmlns:mc", "http://schemas.openxmlformats.org/markup-compatibility/2006");
	хмл.ЗаписатьАтрибут("mc:Ignorable","x14ac");
	хмл.ЗаписатьАтрибут("xmlns:x14ac","http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac");
	хмл.ЗаписатьНачалоЭлемента("dimension");
	//Область = ПолучитьОбласть(Лист.Количество() - 1, Лист.Колонки.Количество() - 1);
	хмл.ЗаписатьАтрибут("ref", "A1:BO15");
	хмл.ЗаписатьКонецЭлемента();//dimension
	
	хмл.ЗаписатьНачалоЭлемента("sheetViews");
	хмл.ЗаписатьНачалоЭлемента("sheetView");
	хмл.ЗаписатьАтрибут("tabSelected", "1");
	хмл.ЗаписатьАтрибут("workbookViewId", "0");
	Если  Книга.Листы[НомерЛиста-1].Заморозка <> "" Тогда
		хмл.ЗаписатьБезОбработки(Книга.Листы[НомерЛиста-1].Заморозка);
	КонецЕсли;
	хмл.ЗаписатьКонецЭлемента();//sheetView
	хмл.ЗаписатьКонецЭлемента();// sheetViews
	
	хмл.ЗаписатьНачалоЭлемента("sheetFormatPr");
	хмл.ЗаписатьАтрибут("defaultRowHeight", "15");
	хмл.ЗаписатьАтрибут("x14ac:dyDescent","0.25");
	хмл.ЗаписатьКонецЭлемента();
	Если   Книга.Листы[НомерЛиста-1].Колонки.Количество()> 0 тогда
		Записать_sheet_cols(хмл, Книга.Листы[НомерЛиста-1].Колонки);
	Конецесли;
	
	хмл.ЗаписатьНачалоЭлемента("sheetData");
	мас = Новый Массив;
	Если    Книга.Листы[НомерЛиста-1].ДанныеЛиста.Количество()> 0 тогда
		Для к = 1 По Книга.Листы[НомерЛиста-1].ДанныеЛиста.количество()  цикл
			Если Книга.Листы[НомерЛиста-1].ДанныеЛиста[к-1] <> Неопределено Тогда
				стр = "<row r='"+ СтрЗаменить(к,Символы.НПП,"") + "' spans='1:"+ Книга.Листы[НомерЛиста-1].ДанныеЛиста[к-1].количество()+"' x14ac:dyDescent='0.2'>";
			
				мас1 = новый Массив;
				Для л = 1 по Книга.Листы[НомерЛиста-1].ДанныеЛиста[к-1].количество() Цикл
					Если Книга.Листы[НомерЛиста-1].ДанныеЛиста[к-1][л-1] <> Неопределено Тогда
						мас1.Добавить(Книга.Листы[НомерЛиста-1].ДанныеЛиста[к-1][л-1].Представление);
					КонецЕсли;
				КонецЦикла;	
				мас.Добавить(стр+ СтрСоединить(мас1)+  "</row>");
				
			КонецЕсли;
		КонецЦикла;
		                                                                   
		хмл.ЗаписатьБезОбработки(СтрСоединить(мас));
	КонецЕсли;
	хмл.ЗаписатьКонецЭлемента();
	
	Если   Книга.Листы[0].ОбъединенныеЯчейки <> неопределено тогда
		Записать_merge_Cells(хмл,Книга.Листы[0].ОбъединенныеЯчейки );
	Конецесли;
	
	хмл.ЗаписатьНачалоЭлемента("pageMargins");
	хмл.ЗаписатьАтрибут("left", "0.7");
	хмл.ЗаписатьАтрибут("right", "0.7");
	хмл.ЗаписатьАтрибут("top", "0.75");
	хмл.ЗаписатьАтрибут("bottom", "0.75");
	хмл.ЗаписатьАтрибут("header", "0.3");
	хмл.ЗаписатьАтрибут("footer", "0.3");
	
	хмл.ЗаписатьКонецЭлемента();
	колтабл = 0;
	стрТаблицы = "";
	Если Книга.Таблицы.Количество()   > 0  Тогда
		
		Для каждого табл из  Книга.Таблицы Цикл
			Если табл.Значение.Лист+1 = НомерЛиста Тогда
				колтабл = колтабл+1;
				стрТаблицы = "<tablePart r:id=""rId" +  строка(Книга.Таблицы.индекс(табл)+1)+ """/>";
			КонецЕсли;
		КонецЦикла;
		
		хмл.ЗаписатьБезОбработки("<tableParts count=""" + строка(колтабл)  + """>" + стрТаблицы+"</tableParts>");
	Конецесли;
	
	хмл.ЗаписатьКонецЭлемента();
	хмл.Закрыть();
КонецПроцедуры

Библиотека получилась на 940 строк.

Ускорение по сравнению с com  в разы.

Предыдущая публикация //infostart.ru/public/900022/

обработка excel openxml библиотека

См. также

Загрузка номенклатуры из 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    211473    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    151603    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    32454    249    65    

125

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    101981    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    216238    935    886    

946

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

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

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

4800 руб.

07.06.2022    15439    82    0    

63
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. A_Max 19 24.09.18 15:00 Сейчас в теме
Поменяйте приведение числа к строке!!!
А то получите "1 000"
2. user1045404 166 24.09.18 15:10 Сейчас в теме
(1) я выгружаю по 3000 строк ошибок нет. Если про количество листов речь, то смысла не вижу.
Оставьте свое сообщение