Загрузка из EXCEL в 1С. com.sun.star.ServiceManager (LibreOffice/OpenOffice)

0. StepByStep 3371 25.11.12 11:52 Сейчас в теме
ПРАКТИЧЕСКОЕ ПОСОБИЕ РАЗРАБОТЧИКА: Метод "LO CALC" (com.sun.star.ServiceManager).
Поддерживаемые типы: *.xls,*.xlsx,*.ods,*.sxc.

Перейти к публикации

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Модератор раздела artbear 03.12.12 16:10 Сейчас в теме
(0) Зачем нужны блоки-инициализаторы типа
МассивДанных = Новый COMSafeArray("VT_VARIANT", ДиапазонДанных.Columns.Count, ДиапазонДанных.Rows.Count);
МассивДанных = ДиапазонДанных.getDataArray().Выгрузить();
ведь вторая строка фактически опровергает первую. первая не нужна.
и такой код встречается не один раз.
2. StepByStep 3371 03.12.12 21:47 Сейчас в теме
(1) artbear,
Спасибо. Согласен, нелогично.
3. echo77 1161 01.10.13 12:00 Сейчас в теме
LibreOffice.Calc 4.0 стоит.
Не работает :-/
Произошла исключительная ситуация ([automation bridge] ): com.sun.star.lang.IllegalArgumentException: URL seems to be an unsupported one.
5. StepByStep 3371 30.01.14 13:17 Сейчас в теме
(3) echo77,
Есть более новая версия 4.1.4.
4. pinachet 28.01.14 10:34 Сейчас в теме
Можете подсказать как это реализовать? Не могу понять что с кодом делать)
6. StepByStep 3371 30.01.14 13:18 Сейчас в теме
(4) pinachet,
Практически лучше смотреть в
"Импорт из EXCEL в 1С /3+1 метод/, DBF, MXL":
http://infostart.ru/public/120961
7. SeiOkami 1531 17.02.14 11:15 Сейчас в теме
В файлах XLSX у меня колонки с датой воспринимались как число. Оказалось, что в XLSX дата может хранится в еще формате ячейки 5036. Если кто напорется, то необходимо просто в строку

ИЛИ ФорматЯчейки = 119 ИЛИ ФорматЯчейки = 120 ИЛИ ФорматЯчейки = 121) Тогда


Добавить еще проверку и на этот формат. Выходит:

ИЛИ ФорматЯчейки = 119 ИЛИ ФорматЯчейки = 120 ИЛИ ФорматЯчейки = 121 ИЛИ ФорматЯчейки = 5036) Тогда
StepByStep; +1 Ответить
8. StepByStep 3371 18.02.14 12:34 Сейчас в теме
(7) SeiOkami,
СПАСИБО. Добавил.
9. StepByStep 3371 27.08.14 23:42 Сейчас в теме
27.08.2014. Новая редакция с возможностью загрузки изображений.
10. StepByStep 3371 18.04.15 20:48 Сейчас в теме
11. eden 08.02.16 12:45 Сейчас в теме
При обработке документа с 1000 строк и таким же количеством картинок (прайс лист) метод "ПрочитатьКартинку_LOCALC" отрабатывает слишком долго.
Для оптимизации можно получить адреса всех картинок одним проходом и в дальнейшем не перебирать все картинки, а находить из таблицы значений:
Функция ПолучитьТаблицуИзображений(Знач Sheet, НачальнаяСтрока, МассивДанных, КонечнаяКолонка)
	
    Если Sheet.Drawpage.getCount() = 0 Тогда
        Возврат Неопределено;
	КонецЕсли;
	
	ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10,0));
	ТипСтрока = Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(250, ДопустимаяДлина.Переменная));
	ТаблицаКоординатЯчеек = Новый ТаблицаЗначений;
	ТаблицаКоординатЯчеек.Колонки.Добавить("НомерКолонки", ТипЧисло);
	ТаблицаКоординатЯчеек.Колонки.Добавить("НомерСтроки", ТипЧисло);
	ТаблицаКоординатЯчеек.Колонки.Добавить("X", ТипЧисло);
	ТаблицаКоординатЯчеек.Колонки.Добавить("Y", ТипЧисло);
	ТаблицаКоординатЯчеек.Колонки.Добавить("W", ТипЧисло);
	ТаблицаКоординатЯчеек.Колонки.Добавить("H", ТипЧисло);
	
	ТаблицаКоординатКартинок = Новый ТаблицаЗначений;
	ТаблицаКоординатКартинок.Колонки.Добавить("ИД", ТипЧисло);
	ТаблицаКоординатКартинок.Колонки.Добавить("X", ТипЧисло);
	ТаблицаКоординатКартинок.Колонки.Добавить("Y", ТипЧисло);
	   
	нСтрокаТФ = НачальнаяСтрока;
	Для Каждого МассивЗначений ИЗ МассивДанных Цикл
		
		нСтрокаТФ = нСтрокаТФ + 1;
		Для нКолонкаТФ = 0 ПО КонечнаяКолонка Цикл
			
			Cell = Sheet.getCellByPosition(нКолонкаТФ, нСтрокаТФ-1);
			Строка = ТаблицаКоординатЯчеек.Добавить();
			Строка.НомерКолонки = нКолонкаТФ;
			Строка.НомерСтроки = нСтрокаТФ;
			Строка.X = Cell.Position.X;
			Строка.Y = Cell.Position.Y;
			Строка.W = Cell.Size.Width;
			Строка.H = Cell.Size.Height;

		КонецЦикла;
	КонецЦикла;
	
    Для ит = 0 ПО Sheet.Drawpage.getCount()-1 Цикл
        
        Попытка
            
            GraphicObject = Sheet.Drawpage.getByIndex(ит);
			
			Строка = ТаблицаКоординатКартинок.Добавить();
			Строка.ИД = ит;
			Строка.X = GraphicObject.Position.X;
			Строка.Y = GraphicObject.Position.Y;
            
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;
        
    КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
	|	ТЗ.НомерКолонки,
	|	ТЗ.НомерСтроки,
	|	ТЗ.X КАК X,
	|	ТЗ.Y КАК Y,
	|	ТЗ.W + ТЗ.X КАК W,
	|	ТЗ.H + ТЗ.Y КАК H
	|ПОМЕСТИТЬ ТаблицаКоординатЯчеек
	|ИЗ
	|	&ТаблицаКоординатЯчеек КАК ТЗ
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	X,
	|	Y,
	|	W,
	|	H
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ТЗ.ИД,
	|	ТЗ.X КАК X,
	|	ТЗ.Y КАК Y
	|ПОМЕСТИТЬ ТаблицаКоординатКартинок
	|ИЗ
	|	&ТаблицаКоординатКартинок КАК ТЗ
	|
	|ИНДЕКСИРОВАТЬ ПО
	|	X,
	|	Y
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	ТаблицаКоординатКартинок.ИД,
	|	ТаблицаКоординатЯчеек.НомерКолонки,
	|	ТаблицаКоординатЯчеек.НомерСтроки
	|ИЗ
	|	ТаблицаКоординатКартинок КАК ТаблицаКоординатКартинок
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаКоординатЯчеек КАК ТаблицаКоординатЯчеек
	|		ПО ТаблицаКоординатКартинок.X >= ТаблицаКоординатЯчеек.X
	|			И ТаблицаКоординатКартинок.X < ТаблицаКоординатЯчеек.W
	|			И ТаблицаКоординатКартинок.Y >= ТаблицаКоординатЯчеек.Y
	|			И ТаблицаКоординатКартинок.Y < ТаблицаКоординатЯчеек.H";
	Запрос.УстановитьПараметр("ТаблицаКоординатЯчеек", ТаблицаКоординатЯчеек);
	Запрос.УстановитьПараметр("ТаблицаКоординатКартинок", ТаблицаКоординатКартинок);
	Результат = Запрос.Выполнить().Выгрузить();
    
    Возврат Результат;
	
КонецФункции

а в вышеуказанной функции вместо 
	//Для ит = 0 ПО Sheet.Drawpage.getCount()-1 Цикл
делать 
	НайденныеИзображения = ТаблицаИзображений.НайтиСтроки(Новый Структура("НомерСтроки, НомерКолонки", НомерСтроки, НомерКолонки));
	Для Каждого Строка ИЗ НайденныеИзображения Цикл
		
		ИТ = Строка.ИД;
Показать



P.S.: В обработке поиск изображения производится только если значение в ячейке отсутствует. Бывает же такое, когда есть и картинка и текст - эту ситуевину тоже бы как нито обрабатывать
12. enter_123 22 30.03.18 01:17 Сейчас в теме
Братцы подскажите как достучаться до таблиц документа docx из openoffice или libreoffice.
В MS Word я делаю так:
Попытка
				WordApp = Новый COMОбъект("Word.Application");
			Исключение
				Возврат Неопределено;
			КонецПопытки;
			WordApp.Visible = Ложь; 
			WordApp.Documents.Open(ПутьКФайлу + ФайлДляЗагрузки); 
			Документ = WordApp.ActiveDocument();
			Пока ЕстьЕщеТаблицы = Истина Цикл
				Попытка
					Таблица = Документ.Content.Tables(Интератор);
					Интератор = Интератор + 1;
					ЗаполнитьТаблицуИзWord(Таблица, AddTable, Контейнер);
				Исключение
					ЕстьЕщеТаблицы = Ложь;
					//Запишем ошибку в лог
					ВыполнитьЗаписьСобытия("Ошибка загрузки потока данных ", ОписаниеОшибки());
				КонецПопытки;
			КонецЦикла;
			СтруктураВыполнения.УведомлениеРезультатЗаголовок 	= "Загрузка данных успешно завершена";
			СтруктураВыполнения.УведомлениеРезультатТекст		= "Было обработано и успешно загружено: " + AddTable + " таблиц(а).";
			Документ.Close(); 
			WordApp.Quit();	

Показать
13. XiPyPg 25.04.18 22:38 Сейчас в теме
А как исключить прямое указание имени листа?? Или имя в обязательном порядке указывать надо? Пользователи то разные...
14. set5553 12.06.18 14:01 Сейчас в теме
Что выполняет Desktop.Terminate()?
Оставьте свое сообщение
Вопросы с вознаграждением