![]() |
![]() |
![]() |
|
V7: как загрузить данные из файла Open Office Calc в 1С:7.7 | ☑ | ||
---|---|---|---|---|
0
orange777
27.11.09
✎
18:18
|
Всем привет, столкнулась с проблемой. Клиенты дали файл .xls попросили сделать обработку загрузки данных в 1С:Бухгалтерию 7.7.Сделала - приношу, а у них там опен офис стоит. есть какая-нть аналогия? Сейчас это выглядит так:
Файл=СоздатьОбъект("Excel.Application"); Файл.Application.Workbooks.Open(ИмяФайла); POLE1 =Файл.ActiveSheet.Cells(НомерСтроки,1).Value; // контрагент POLE3 =Файл.ActiveSheet.Cells(НомерСтроки,3).Value; // договор Файл.Quit(); Ну то есть нужно открыть и закрыть файл и работу с полями организовать... Никто не сталкивался? |
|||
1
smaharbA
27.11.09
✎
18:22
|
сталкивались
решение самое адекватное - купить ексель |
|||
2
Fragster
гуру
27.11.09
✎
18:25
|
(1) нафига?
(0) ищи yoksel |
|||
3
smaharbA
27.11.09
✎
18:26
|
(2) а зырить чем ?
|
|||
4
Fragster
гуру
27.11.09
✎
18:26
|
(3) а зырить - кальком
|
|||
5
Fragster
гуру
27.11.09
✎
18:27
|
(3) лучше сюда загляни: Подскажите скрипт по "пустой папке"
|
|||
6
Aswed
27.11.09
✎
18:28
|
(0) Ох страдал я такой же фигнёй на старой работе, так и плюнул, сделал всё через эксель.
|
|||
7
Fragster
гуру
27.11.09
✎
18:30
|
(6) там даже через ООо не много делать, через ёксель - еще проще
|
|||
8
also
27.11.09
✎
18:31
|
||||
9
orange777
27.11.09
✎
18:33
|
Да я вот тоже нашла пару скриптов... и думаю, пусть ёксель покупают) им дешевле выйдет))) однако проблема актуальна
|
|||
10
YauheniL
27.11.09
✎
18:34
|
(9) А OO OLE не поддерживает?
|
|||
11
also
27.11.09
✎
18:34
|
(9) Эксель и ёксель разные вещи
|
|||
12
orange777
27.11.09
✎
18:35
|
(9) мне сказали что можно ето реализовать, и создать именно OLE но я чета нигде не найду как
|
|||
13
orange777
27.11.09
✎
18:36
|
(11)поведайте нам в чем раздница?)
|
|||
14
YauheniL
27.11.09
✎
18:37
|
(12) Если знать название типа и иметь спецификацию, тогда по идее что-то вроде
Файл=СоздатьОбъект(ИмяТипаПриложенияОО); // Создание Использование -- исходя из спецификации |
|||
15
also
27.11.09
✎
18:39
|
||||
16
orange777
27.11.09
✎
18:39
|
(11) мда... до чего техника дошла... однакож лучше экселя ничего не придумали
|
|||
17
orange777
27.11.09
✎
18:42
|
вот нашла описание. если кто загонится, мож чем поможет http://triteh.ru/libooo/
буду мучиться дальше, всем спасибо |
|||
18
TigerPXN
27.11.09
✎
18:45
|
Не мое, но думаю, что такие вещи какой-то большой тайной не являются:
Попытка OpenOffice = Новый COMОбъект("com.sun.star.ServiceManager"); Исключение // Тут сообщение об ошибке и выход... КонецПопытки; scr = Новый COMОбъект("MSScriptControl.ScriptControl"); scr.language="javascript"; scr.eval("Массив=new Array()"); Массив = scr.eval("Массив"); scr.AddObject("OpenOffice", OpenOffice); scr.eval("Массив[0]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); scr.eval("Массив[0].Name='Hidden'"); scr.eval("Массив[0].Value=true"); // Только для чтения scr.eval("Массив[1]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); scr.eval("Массив[1].Name='ReadOnly'"); scr.eval("Массив[1].Value=true"); // Установка параметров фильтра табличного документа Файл = Новый Файл(ИмяФайла); Если ВРег(Файл.Расширение) = ".XLS" Или ВРег(Файл.Расширение) = ".ODS" Тогда ИначеЕсли ВРег(Файл.Расширение) = ".CSV" Или ВРег(Файл.Расширение) = ".TXT" Тогда // Фильтр текстового файла // http://doc.services.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options // Имя фильтра: // "Text - txt - csv (StarCalc)" // Параметры: // Разделитель полей = ',' // Разделитель текста = '"' // Кодировака = 0 (Системная) // Номер первой строки = 1 scr.eval("Массив[2]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); scr.eval("Массив[2].Name='FilterName'"); scr.eval("Массив[2].Value='Text - txt - csv (StarCalc)'"); scr.eval("Массив[3]=OpenOffice.Bridge_GetStruct('com.sun.star.beans.PropertyValue')"); scr.eval("Массив[3].Name='FilterOptions'"); scr.eval("Массив[3].Value='44,34,0,1'"); Иначе ОбщегоНазначения.СообщитьОбОшибке("Неизвестный тип табличного документа"); Возврат Ложь; КонецЕсли; Попытка DeskTop = OpenOffice.CreateInstance("com.sun.star.frame.Desktop"); Исключение ОбщегоНазначения.СообщитьОбОшибке( "Не удалось создать Desktop: " + ОписаниеОшибки()); ЗакрытьФайлТабличногоДокумента(DeskTop, Document); Возврат Ложь; КонецПопытки; ПутьКФайлуURL = "file:///" + СтрЗаменить(ИмяФайла, "\", "/"); Попытка Document = DeskTop.LoadComponentFromURL(ПутьКФайлуURL, "_blank", 0, Массив); Исключение ОбщегоНазначения.СообщитьОбОшибке( "Не удалось загрузить файл табличного документа: " + ОписаниеОшибки()); ЗакрытьФайлТабличногоДокумента(DeskTop, Document); Возврат Ложь; КонецПопытки; Document.lockControllers(); Document.addActionLock(); Листы = Document.getSheets(); Попытка Если Не ПустаяСтрока(ИмяЛистаТабличногоДокумента) Тогда Лист = Листы.getByName(ИмяЛистаТабличногоДокумента); Иначе Лист = Листы.getByIndex(0); КонецЕсли; Исключение ОбщегоНазначения.СообщитьОбОшибке( "Не удалось получить необходимый лист табличного документа: " + ОписаниеОшибки()); ЗакрытьФайлТабличногоДокумента(DeskTop, Document); Возврат Ложь; КонецПопытки; |
|||
19
YauheniL
27.11.09
✎
18:46
|
(17) Там же полный пример: подключаешь DLL и вперед. Помощь других программистов вряд ли будет иметь более полезный для тебя вид (ну, если только они именно твое задание не сделают)
|
|||
20
TigerPXN
27.11.09
✎
18:47
|
Ну и далее вызываем типа такого:
НекаяПеременная = Лист.getCellByPosition(1, 2).getString(); Только нужно помнить, что нумерация начинается с 0. |
|||
21
TigerPXN
27.11.09
✎
18:48
|
В конце закрываем документ:
Если Document <> Неопределено Тогда Попытка Document.unLockControllers(); Document.removeActionLock(); Document.Close(-1); Исключение ОбщегоНазначения.СообщитьОбОшибке( "Не удалось закрыть табличный документ: " + ОписаниеОшибки()); КонецПопытки; Document = Неопределено; КонецЕсли; Если DeskTop <> Неопределено Тогда DeskTop = Неопределено; КонецЕсли; |
|||
22
smaharbA
27.11.09
✎
18:48
|
(4) уверен ? ))
|
|||
23
TigerPXN
27.11.09
✎
18:48
|
Правда, тут весь код под УТ, но для 7.7 он будет мало отличаться.
|
|||
24
orange777
27.11.09
✎
18:49
|
Ребята, спасибо, но мне бы хватило расшифровки каждой функции а в конце пример использования. Эти массивы я видела, они для меня пустой звук. Как догаться ЧТО они делают и нужны ли они вообще
|
|||
25
smaharbA
27.11.09
✎
18:50
|
(18) не нужна обертка для 8.х
а для 7.7 есть "красивее" метода )) и только моя а ф т о р а |
|||
26
TigerPXN
27.11.09
✎
18:50
|
В (21) - функция ЗакрытьФайлТабличногоДокумента(DeskTop, Document)
|
|||
27
orange777
27.11.09
✎
18:51
|
процедура Сформировать();
перем xls,cel,сч; если ФС.СуществуетФайл(СокрЛП(ВыбФайл))=0 тогда предупреждение("Необходимо указать существующий файл",90); возврат; конецЕсли; // xls=СоздатьОбъект("Excel.Application"); xls=СоздатьОбъект("TOpenOffice.Bridge"); xls.WorkBooks.Open(СокрЛП(ВыбФайл)); для сч=1 по xls.WorkSheets.Count цикл сообщить(""+сч+"="+xls.WorkSheets[сч].name); конецЦикла; //сч=1 по xls.WorkSheets.Count xls.Worksheets(1).Activate(); // как и в Excel.Aplication: // 1 . к ячейке можно обращаться через объект книги xls.Cells(1,1).text="Это текст из 1С!"; // 2. а можно создав ссылку на ячейку, и затем обращаться к ней cel=xls.WorkSheets(2).Cells(1,1); cel.Value="Шифровальщица попросту забыла ряд ключевых множителей и тэгов"; // cel=xls.Cells(1,2); сообщить("В ячейке A2 содержится текст:"+cel.text); xls=0; конецПроцедуры // Сформировать(); Вот это для меня гораздо понятнее) |
|||
28
FN
27.11.09
✎
18:55
|
(27) так это денег стоит...
|
|||
29
TigerPXN
27.11.09
✎
18:58
|
(24) А там и не надо ничего понимать. Копируешь приведенные куски as is (исправляя только синтаксис для 7.7) и все работает. Там только кажется, что много понаписано, на самом деле там большая часть - параноидальные проверки всего подряд.
|
|||
30
smaharbA
27.11.09
✎
19:00
|
(29) в (18) бред полный )
|
|||
31
TigerPXN
27.11.09
✎
19:02
|
(30) Может быть. Но у меня так работает. А больше к этому коду никаких требований нет. :)
|
|||
32
smaharbA
27.11.09
✎
19:03
|
(31) притензий к этому коду до и более
|
|||
33
TigerPXN
27.11.09
✎
19:03
|
Проще за 5 минут сделать copy-paste, чем целый день разбираться, что именно там является бредом, а что - нет.
|
|||
34
TigerPXN
27.11.09
✎
19:04
|
Понятно, что такой код сильно избыточен. Ну и что с того?
|
|||
35
smaharbA
27.11.09
✎
19:07
|
(34) он не избыточен, есть красившее
|
|||
36
smaharbA
27.11.09
✎
19:08
|
а по сути - жаба задавила
|
|||
37
orange777
27.11.09
✎
19:10
|
(28)неа, бесплатный интерфейс. надо попробовать установить
|
|||
38
orange777
27.11.09
✎
19:12
|
(36) дело не в жабе) у них есть возможность купить эксель) но нафига отдавать деньги микрософту, если их могу получить я) если б, конечно ето еще и попроще было...
|
|||
39
smaharbA
27.11.09
✎
19:19
|
(38) о тебе речи нет
|
|||
40
TigerPXN
27.11.09
✎
19:22
|
(38) А что там сложного?
Все, что в (18) запихиваешь в функцию, которая получает ИмяФайла. После выполнения данного куска кода получаешь переменную Лист, с которой работаешь почти как с листом Excel (только индексы с 0, а не с 1). Тут думать не надо. Это даже вредно в данном случае )) |
|||
41
Alexor
27.11.09
✎
19:25
|
Я загрузку из OpenOffice делал с помощью TOpenOffice
|
|||
42
Alexor
27.11.09
✎
19:25
|
Ну и уж так до кучи
Книга знаний: Интеграция OpenOffice Calc с 1С 7.7 |
|||
43
smaharbA
27.11.09
✎
19:31
|
в (18) рабочий, но плохой
|
|||
44
TigerPXN
27.11.09
✎
19:52
|
(42),(43) Всем спасибо, ошибки понял. В следующий раз вариант будет покрасивше :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |