gifts2017

Чтение файлов *.xlsx средствами 1С 8.2

Опубликовал Аркадий Кучер (Abadonna) в раздел Обмен - Загрузка и выгрузка в Excel

Формат файлов *.xlsx представляет собой фактически ZIP-архив, внутри которого находятся xml-файлы, что позволяет считывать значения ячеек исключительно средствами 1С 8.2

Внутри архива *.xlsx практический интерес для получения значений ячеек представляют три вида файлов:

1. workbook.xml - содержит описание рабочей книги (количество листов)

2. sharedStrings.xml - содержит строковые значения ячеек всех листов

3. Файлы sheet1.xml...sheetN.xml - значения ячеек конкретного (по номеру, независимо от названия) листа.

Почти все значения внутри файлов sheet1.xml...sheetN.xml представляют собой числа, причем для строчных значений это индекс строки из файла sharedStrings.xml, а для даты - число дней с начала XX века.

Теги   f содержат написание формулы, теги v  - значение ячейки, независимо от того было ли оно "вбито" напрямую, или это результат формулы.

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

 

14.06.12

Заодно уж добавил и docxreader

Скачать файлы

Наименование Файл Версия Размер
xlsx-reader 571
.epf 8,79Kb
15.09.14
571
.epf 8,79Kb Бесплатно
DOCX Reader.epf 169
.epf 6,87Kb
14.06.12
169
.epf 6,87Kb Бесплатно

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Антон (anton.fly7) 13.06.12 11:32
2. Аркадий Кучер (Abadonna) 13.06.12 11:38
(1) anton.fly7,
формулы без проблем, только я не посчитал нужным их сами выводить, всё равно ж, в основном, значения нужны.

<c r="B4">
<f>SUM(B1:B3)</f>
<v>10920</v>
</c>
Тег f - формула, тег v - значение. Лично меня сама формула не интересует
3. andrewks 13.06.12 14:59
ага, сам примерно такое делал, только для ods (OpenOffice) - там тоже зип-архив, а внутриях хмл, который также можно распарсить
4. qweasd qweasdzc (serega3333) 13.06.12 15:36
зачетно, для формул нужно очень
5. Сергей (Che) Коцюра (CheBurator) 13.06.12 19:54
Автор, пиши ещё!
Шёпот теней; +1 Ответить
6. Олег Шалимов (CaSH_2004) 13.06.12 20:48
Любопытно а какая скорость то чтения, есть какое-то сравнение? Например чтением через тот-же КОМ-Эксель?
7. andrewks 13.06.12 22:26
(6) по сравнению с КОМ-Эксель, думаю, на порядок
8. Ийон Тихий (cool.vlad4) 13.06.12 23:12
9. Аркадий Кучер (Abadonna) 14.06.12 05:12
(8) кхм... наверное тем, что я не мониторю все обработки :)))
В смысле, мы с Василием всегда плюсы друг-другу ставили, но никогда даже и не смотрели, что там за разработки ;)
Эту либо вообще не видел, либо в упор не помню
10. Аркадий Кучер (Abadonna) 14.06.12 05:23
(6) CaSH_2004,
Проверял на матрице 10 000 строк х 5 колонок, ровно 7 секунд на моем рабочем
(Intel® Core™2 Duo CPU E7500 2.93GHz, ОЗУ 2 ГБ)
Обработку, скорее всего, можно и оптимизировать, эта скорее как пример на данный момент.
Может, и XML будет быстрее парсить как текстовик...
11. Аркадий Кучер (Abadonna) 14.06.12 18:37
(8) cool.vlad4,
>А чем отличается от http://infostart.ru/public/19139/ ?
Посмотрел ради интереса, да абсолютно всем отличается! Код даже близко рядом не стоял, а что касается структуры архива - дык это мелкосфот придумал, а не мы с Василием.
И уж никогда бы мне в голову не пришло
МассивБукв = Новый Массив;
	МассивБукв.Добавить("A");
	МассивБукв.Добавить("B");
	МассивБукв.Добавить("C");
	МассивБукв.Добавить("D");
        .......... 
...Показать Скрыть

Испокон веков я делаю такие массивы так:
Стр="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Абушев; Den_D; +2 Ответить 1
12. Сергей Ожерельев (Поручик) 15.06.12 14:38
(11) А я бывало и так

МассивБукв = Новый Массив;
Для Код = КодСимвола("A") По КодСимвола("Z") Цикл МассивБукв.Добавить(Символ(Код)); КонецЦикла;
kare; Абушев; Den_D; brr; Abadonna; +5 Ответить
13. Евгений Сущенков (Jonny_wk) 17.06.12 18:25
14. Денис (Den_D) 21.06.12 14:31
Скоро мы все перейдем на XML общение ))
И даже между собой исключительно по родительским узлам будем общаться)))
orehova123; +1 Ответить
15. Zigfridish (Bassgood) 25.06.12 22:50
(0) Заметил, что не всегда экселевский файл читается корректно при помощи этого метода (колонки читаются не в том порядке, в котором они расположены в экселе, и некоторые значения ячеек читаются неправильно), в чем причина я понять так и не смог (заметил лишь только то, что если его содержимое скопировать в новый файл - то все читается нормально), скорее всего имеется какая то заморочка с преобразованием эксель файла в XML формат, потому что при помощи COM файл читается нормально (если интересно, то приложил этот эксель файл к сообщению). Вот такая вот загагулина.
Прикрепленные файлы:
Тестовый эксель.xlsx
16. Аркадий Кучер (Abadonna) 26.06.12 05:10
(15) Zigfridish,
я это тоже заметил, но пока особо не разбирался. Обработка абсолютно прозрачная, с комментами, может кто и найдет, где собака порылась;) Будет время - сам еще внимательно попроверяю
17. Serg Kondrasgov (SergDi) 27.06.12 11:55
(10) Abadonna, 7 секунд это круто
18. Sasha S (fillipok) 28.06.12 10:18
Спасибо за обработку))в добавку:
1. файлы OpenOffice таблицы формата .ods открываются таким же способом только естественно файл с данными xml другой))(вроде и .odt так же, но не проверял).
19. Кондрат Иванов (Konder.Djironimo) 30.06.12 09:10
Спасибо! Все было в свое время заточено под *.xls но потом с переходом на *.xlsx пришлось всех оставлять на 2003, а тут всех обрадуем ;) еще раз спасибо!
20. StronG-X (Dethmond) 03.07.12 08:54
Хорошо что стал поддерживать *.xlsx. Спасибо
21. Аркадий Кучер (Abadonna) 03.07.12 18:29
(20)Честное слово, это не я! :))))) Это мелкософт поддерживает
22. StronG-X (Dethmond) 03.07.12 21:03
(21) Abadonna, ладно, Microsoft`у тоже спасибо))
23. Василий Антонов (khaoos) 04.07.12 04:50
Классно придумано. Да и на другие статьи автора обращу внимание, интересные вещи пишет. Молодец!
24. Maximilian Alekseevich (1cmax) 05.07.12 00:21
Кстати, если в файле нет ни одной ячейки со строками
файл sharedStrings.xml не создается
и обработка валится с ошибкой.

стоит добавить проверку

Процедура ПарсингSharedStrings()
XML=Новый ЧтениеXML;
//Добавлено: maxval 03.07.2012
Имя = Объект.ВременнаяПапка+"sharedStrings.xml";
Ф = новый Файл(Имя);
Если Не ф.Существует() Тогда
Возврат;
КонецЕсли;
XML.ОткрытьФайл(Имя);
/// maxval 03.07.2012
25. Maximilian Alekseevich (1cmax) 05.07.12 00:21
реализовал все те же принципы под Управляемые формы, в.т.ч. Веб-клиент:
http://infostart.ru/public/142187/
26. Аркадий Кучер (Abadonna) 05.07.12 00:31
(24) 1cmax,
Ага, я как-то поленился проверить...
27. Maximilian Alekseevich (1cmax) 05.07.12 00:34
(15) Zigfridish, Аналогичную багу нашел.. эх.. сначала думал что для любого сервака универсальное решение. а то серваки на линуксе. там никаких ком объектов...
28. Сергей Семенов (cerg110) 13.07.12 07:23
Как раз что скинули файл для загрузки в xsls. Как будет возможность сразу скачаю. Спасибо за полезную обработку.
29. Юрий Осипов (yuraos) 28.03.13 09:06
(21) Abadonna,

Честное слово, это не я! :))))) Это мелкософт поддерживает



говорят он уже пожалел об этом
---
в следующем офисе вроде грозятся зделать бинарный закрытый формат
:)
30. Иван (Spartan) 28.03.13 18:37
(0) небольшой косячок... в блоке
	//--- находим строчные значения из файла  sharedStrings.xml
	МассивСтрок=Новый СписокЗначений;
	ПарсингSharedStrings();
	//--- находим индексы строк и прочие значения из файла \xl\worksheets\sheetN.xml

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

Визуально в табличном поле этого не видно, но при работе с получившейся таблицей могут быть неожиданности.
31. Иван (Spartan) 28.03.13 18:41
(15) А где в Вашем файле получаются неправильные значения при чтении обработкой? А то файл немаленький - визуально очень сложно заметить. Мне нужно понять, насколько это критично для моей задачи.
32. Аркадий Кучер (Abadonna) 28.03.13 18:43
(31)Блин, ну код же открытый. Мне она без надобности, к старому я не возвращаюсь;)
33. Иван (Spartan) 28.03.13 19:35
(32) Да не, вопросов нет... За код спасибо! Это я написал для тех, кто будет использовать. ;)
34. Аркадий Кучер (Abadonna) 28.03.13 19:52
(33) Spartan, я просто не заметил сгоряча, что (31) не мне :)))
35. Иван (Spartan) 29.03.13 09:41
(15),(31) Все, увидел... посмотрел сегодня на свежую голову.
P.S. Нашел в чем косяк - сейчас разбираюсь как победить. Получается неверный массив строк из файла sharedStrings.xml, если в нем присутствуют пустые строки.
36. Иван (Spartan) 29.03.13 10:45
(0),(15),(27) Как-то так, видимо:
Функция ПарсингSharedStrings()
	XML=Новый ЧтениеXML;
	//XML.ОткрытьФайл(ВременнаяПапка+"sharedStrings.xml");
	//Добавлено: maxval 03.07.2012 
	Имя = ВременнаяПапка+"sharedStrings.xml"; 
	Ф = новый Файл(Имя); 
	Если Не Ф.Существует() Тогда 
		Возврат Ложь; 
	КонецЕсли; 
	XML.ОткрытьФайл(Имя); 
	/// maxval 03.07.2012
	Пока XML.Прочитать() Цикл
		//Если XML.Имя="#text" Тогда
		//	МассивСтрок.Добавить(XML.Значение);
		//КонецЕсли;
		// Spartan - 29.03.2013 - начало
		Если XML.Имя = "t" И XML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			Если XML.Прочитать() И XML.Имя = "#text" Тогда
				МассивСтрок.Добавить(XML.Значение);
			Иначе
				МассивСтрок.Добавить("");
			КонецЕсли; 
		КонецЕсли;
		// Spartan - 29.03.2013 - конец
	КонецЦикла;
	XML.Закрыть();
	
	Возврат Истина;
КонецФункции
...Показать Скрыть
37. Алексей Лапицкий (Lapitskiy) 05.03.15 14:10
(36) Spartan, не недостаточно, когда несколько листов, неверно определяет.
38. Аня Анютка (freep777) 06.08.15 14:44
Обработка замечательная!!! Спасибо огромнющее за нее!

Только вот не пойму, на одном файле нормально работает, а на другом выдает ошибку
{Форма.Форма.Форма(80)}: Индекс находится за границами массива
ТЗ[НомерСтроки-1][НомерКолонки-1]=Значение;


Помогите, пожалуйста, разобраться.
(к сообщению прикреплены файлы - на "Книга2" - работает, а на "Книга1" - выдает ошибку)... Вроде ничем таким особым файлы не различаются??? Не могу понять...
Прикрепленные файлы:
Книга1.xlsx
Книга2.xlsx