![]() |
|
Чтение данных из OpenOffice Calc в v8 | ☑ | ||
---|---|---|---|---|
0
Никулин Леонид
26.02.14
✎
12:38
|
Здравствуйте!
Есть задача из файла OpenOffice Calc считать данные и записать их в таблицу значений. Нашел несколько статей с кусками кода как это делается. Но запустить все это добро не хватает ума. Мой мозг слишком слаб с COMОбъектами:( Ниже покажу заготовку с кодом. Подправьте, пожалуйста Спасибо! |
|||
1
Никулин Леонид
26.02.14
✎
12:41
|
Процедура ЗагрузитьПрайс()
ПутьКПрайсу = "D:\Задачи\0225_Чтение_автомобилей_из_файла_Excel\sample.xls"; Попытка ServiceManager = Новый ComОбъект("com.sun.star.ServiceManager"); МетодЗагрузки = "ОО"; Исключение Сообщить("Отсутствует приложение для загрузки файла"); КонецПопытки; Если МетодЗагрузки = "ОО" Тогда scr = Новый ComОбъект("MSScriptControl.ScriptControl"); scr.language = "javascript"; scr.eval("MassivParametrov = new Array()"); MassivParametrov = scr.eval("MassivParametrov"); scr.AddObject("OpenOffice", ServiceManager); scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); scr.eval("MassivParametrov[0].Name='Hidden'"); scr.eval("MassivParametrov[0].Value=true"); Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop"); URL = ConvertToURL(ПутьКПрайсу); Doc = Desktop.LoadComponentFromURL(URL, "_blank", 0, MassivParametrov); Doc.lockControllers(); Doc.addActionLock(); Sheets = Doc.GetSheets();; Документ = Sheets.GetByIndex(0); ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Артикул"); ТЗ.Колонки.Добавить( "Цена"); Дальше = 1; ТекСтрокаДок = НачальнаяСтрока; // тут ругается. Говорит, что не знает что такое НачальнаяСтрока Пока Дальше = 1 Цикл Проверка = СокрЛП(""+Документ.getCellByPosition(0, ТекСтрокаДок).getString()); Если ПустаяСтрока(Проверка) Тогда Прервать; КонецЕсли; Артикул = СокрЛП(""+Документ.getCellByPosition(КолонкаАртикула-1, ТекСтрокаДок).getString()); // не знает что такое КолонкаАртикула Попытка Цена = Число(СокрЛП(""+Документ.getCellByPosition(КолонкаЦены-1 , ТекСтрокаДок).getString())); // не знает что такое КолонкаЦены Исключение Цена = 0; КонецПопытки; Если (НЕ ПустаяСтрока(СокрЛП(Артикул))) и (НЕ Цена = 0) Тогда НоваяСтрока = ТЗ.Добавить(); НоваяСтрока.Артикул = Артикул; НоваяСтрока.Цена = Цена; КонецЕсли; Состояние("Обрабатываем - "+ТекСтрокаДок); ТекСтрокаДок = ТекСтрокаДок+1; КонецЦикла; Если ТЗ.Количество() > 0 Тогда Док = Документы.УстановкаЦенНоменклатуры.СоздатьДокумент(); Док.Дата = ДатаУстановкиЦен; // не знает что такое ДатаУстановкиЦен ДобавитьТипЦен = Док.ТипыЦен.Добавить(); ДобавитьТипЦен.ТипЦен = ТипЦены; Для Каждого ТекСтрока из ТЗ Цикл Номенклатура = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", ТекСтрока.Артикул); Если НЕ Номенклатура.Пустая() Тогда НоваяСтрока = Док.Товары.Добавить(); НоваяСтрока.Номенклатура = Номенклатура; НоваяСтрока.ТипЦен = ТипЦены; НоваяСтрока.Цена = ТекСтрока.Цена; НоваяСтрока.Валюта = Валюта; НоваяСтрока.ЕдиницаИзмерения = Номенклатура.ЕдиницаХраненияОстатков; КонецЕсли; КонецЦикла; Если Док.Товары.Количество() > 0 Тогда Док.Записать(); КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры функция ConvertToURL(FileName) ИмяФайла = СтрЗаменить(FileName," ","%20" ); ИмяФайла = СтрЗаменить(ИмяФайла,"\","/"); Возврат "file:/" + "/localhost/" + ИмяФайла; Конецфункции |
|||
2
Никулин Леонид
26.02.14
✎
12:44
|
Буду рад чудотворным комментариям
|
|||
3
Naumov
26.02.14
✎
12:44
|
Ну присвой начальной строке номер информативной строки в твоем шаблоне эксель-файла.
Если не знаешь, то ставь 1 |
|||
4
Никулин Леонид
26.02.14
✎
12:48
|
Добавил
НачальнаяСтрока = 1; ТекСтрокаДок = НачальнаяСтрока; А что придумать с колонкойЦены, КолонкойНоменклатуры? Их где брать? |
|||
5
Naumov
26.02.14
✎
12:49
|
(4) Посмотри в шаблоне их номера и поставь
|
|||
6
Никулин Леонид
26.02.14
✎
12:52
|
В моем xls есть колонки "A" "B" "C". Как это правильно нужно написать в коде?
|
|||
7
Naumov
26.02.14
✎
12:52
|
А, В,С это 1,2,3.
|
|||
8
Никулин Леонид
26.02.14
✎
12:53
|
ок. спс сейчас попробую...
|
|||
9
Никулин Леонид
26.02.14
✎
13:01
|
А самый нижний кусок мне вообще не нужен. Там документ создается. Я его убрал. вот что получилось:
|
|||
10
Никулин Леонид
26.02.14
✎
13:01
|
Процедура ЗагрузитьПрайс()
ПутьКПрайсу = "D:\Задачи\0225_Чтение_автомобилей_из_файла_Excel\sample.xls"; Попытка ServiceManager = Новый ComОбъект("com.sun.star.ServiceManager"); МетодЗагрузки = "ОО"; Исключение Сообщить("Отсутствует приложение для загрузки файла"); КонецПопытки; Если МетодЗагрузки = "ОО" Тогда scr = Новый ComОбъект("MSScriptControl.ScriptControl"); scr.language = "javascript"; scr.eval("MassivParametrov = new Array()"); MassivParametrov = scr.eval("MassivParametrov"); scr.AddObject("OpenOffice", ServiceManager); scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); scr.eval("MassivParametrov[0].Name='Hidden'"); scr.eval("MassivParametrov[0].Value=true"); Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop"); URL = ConvertToURL(ПутьКПрайсу); Doc = Desktop.LoadComponentFromURL(URL, "_blank", 0, MassivParametrov); // вот тут спотыкается. Говорит, что нет такого метода Doc.lockControllers(); Doc.addActionLock(); Sheets = Doc.GetSheets();; Документ = Sheets.GetByIndex(0); ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("Артикул"); ТЗ.Колонки.Добавить( "Цена"); Дальше = 1; НачальнаяСтрока = 1; ТекСтрокаДок = НачальнаяСтрока; // тут ругается. Говорит, что не знает что такое НачальнаяСтрока Пока Дальше = 1 Цикл Проверка = СокрЛП(""+Документ.getCellByPosition(0, ТекСтрокаДок).getString()); Если ПустаяСтрока(Проверка) Тогда Прервать; КонецЕсли; //Артикул = СокрЛП(""+Документ.getCellByPosition(КолонкаАртикула-1, ТекСтрокаДок).getString()); // не знает что такое КолонкаАртикула Артикул = СокрЛП(""+Документ.getCellByPosition(1-1, ТекСтрокаДок).getString()); // не знает что такое КолонкаАртикула Попытка //Цена = Число(СокрЛП(""+Документ.getCellByPosition(КолонкаЦены-1 , ТекСтрокаДок).getString())); // не знает что такое КолонкаЦены Цена = Число(СокрЛП(""+Документ.getCellByPosition(2-1 , ТекСтрокаДок).getString())); // не знает что такое КолонкаЦены Исключение Цена = 0; КонецПопытки; Если (НЕ ПустаяСтрока(СокрЛП(Артикул))) и (НЕ Цена = 0) Тогда НоваяСтрока = ТЗ.Добавить(); НоваяСтрока.Артикул = Артикул; НоваяСтрока.Цена = Цена; КонецЕсли; Состояние("Обрабатываем - "+ТекСтрокаДок); ТекСтрокаДок = ТекСтрокаДок+1; КонецЦикла; КонецЕсли; КонецПроцедуры функция ConvertToURL(FileName) ИмяФайла = СтрЗаменить(FileName," ","%20" ); ИмяФайла = СтрЗаменить(ИмяФайла,"\","/"); Возврат "file:/" + "/localhost/" + ИмяФайла; Конецфункции |
|||
11
Naumov
26.02.14
✎
13:03
|
и?
|
|||
12
Никулин Леонид
26.02.14
✎
13:07
|
блин. синтаксических ошибок нет, но при исполнении спотыкается на строчке
Doc = Desktop.LoadComponentFromURL(URL, "_blank", 0, MassivParametrov); переделал на Doc = Desktop.LoadComponentFromURL(ПутьКПрайсу, "_blank", 0, MassivParametrov); не помогло:( |
|||
13
Никулин Леонид
26.02.14
✎
13:08
|
Подскажите, а могу ли в синтакс помощнике почитать о методах ком объектов?
|
|||
14
Naumov
26.02.14
✎
13:08
|
с самим методом чтения через ОО ничего не могу сказать, таким макаром не делал никогда.
в давние времена компонента была какая-то. ее использовал. |
|||
15
Никулин Леонид
26.02.14
✎
17:43
|
Гуру скорее всего скажут что это г*вн*код, но тем не менее вот что получилось и работает. Может кому пригодится
Попытка ServiceManager = Новый ComОбъект("com.sun.star.ServiceManager"); МетодЗагрузки = "ОО"; Исключение Сообщить("Отсутствует приложение для загрузки файла"); КонецПопытки; Если МетодЗагрузки = "ОО" Тогда scr = Новый ComОбъект("MSScriptControl.ScriptControl"); scr.language = "javascript"; scr.eval("MassivParametrov = new Array()"); MassivParametrov = scr.eval("MassivParametrov"); scr.AddObject("OpenOffice", ServiceManager); scr.eval("MassivParametrov[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); scr.eval("MassivParametrov[0].Name='Hidden'"); scr.eval("MassivParametrov[0].Value=true"); Desktop = ServiceManager.CreateInstance("com.sun.star.frame.Desktop"); Doc = Desktop.LoadComponentFromURL("file:///"+ИмяФайла, "_blank", 0, MassivParametrov); Doc.lockControllers(); //Doc.addActionLock(); блокировка документа калк Sheets = Doc.GetSheets();; Документ = Sheets.GetByIndex(0); ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить("ГосНомер"); ЕстьДанные = Истина; НачальнаяСтрока = 1; ТекСтрокаДок = НачальнаяСтрока; Пока ЕстьДанные Цикл ГосНомер = СокрЛП(""+Документ.getCellByPosition(1-1, ТекСтрокаДок).getString()); Если (НЕ ПустаяСтрока(СокрЛП(ГосНомер))) Тогда НоваяСтрока = ТЗ.Добавить(); НоваяСтрока.ГосНомер = ГосНомер; ТекСтрокаДок = ТекСтрокаДок + 1; Иначе ЕстьДанные = Ложь; КонецЕсли; КонецЦикла; КонецЕсли; |
|||
16
z80a
26.02.14
✎
17:55
|
(0)
// Подключаемся к OO Попытка ServiceManager = Новый COMОбъект("com.sun.star.ServiceManager"); Desktop = ServiceManager.createInstance("com.sun.star.frame.Desktop"); Исключение ОбщегоНазначения.СообщитьОбОшибке("Ошибка при подключении к LibreOffice!"); Возврат Ложь; КонецПопытки; // Создаем массив для передачи параметров Параметры = Новый COMSafeArray("VT_DISPATCH", 1); // Если надо скроем Если Скрыть Тогда Параметры.SetValue(0, СвойствоЗначение(ServiceManager, "Hidden", Истина)); КонецЕсли; КаталогОтчета = СтрЗаменить(ПутьКФайлу, "\", "/"); // Загрузка документа Документ = Desktop.LoadComponentFromURL("file://localhost/" + КаталогОтчета, "_blank", 0, Параметры); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |