Имя: Пароль:
1C
1C 7.7
v7: COMSafeArray в 1С 7.7 или как быстро заполнить данные в Excel
0 КонецЦикла
 
02.11.13
15:15
Есть такое?

В общем-то требуется заполнить быстро, не построчно определенную колонку листа Excel (начиная с определенной ячейки), остальное содержимое портить нельзя.
Были мысли по поводу заполнения шаблона и копи-паст макросом из него в нужное место.

Еще есть мысли?
1 МихаилМ
 
02.11.13
15:21
oledb (ado)
2 Rie
 
02.11.13
15:23
(0) Нету такого.
Используй ADO.
3 КонецЦикла
 
02.11.13
15:24
(1) Этим я смогу заполнить какой-то шаблон не открывая ексель
Но заполнить существующую книгу, допустим диапазон A6:A100 не получилось
4 Torquader
 
02.11.13
15:26
MSScriptControl вам в помощь, и его команду Array для создания массива - быстро и просто, только немного попрограммировать на VbScript придётся.
5 КонецЦикла
 
02.11.13
15:28
(4) Спс, можно и на визуал бэйсике забацать. Но хотелось бы или запросом или как-то попроще.
6 Torquader
 
02.11.13
15:30
(5) Попроще - через ADO - запись в Excel-файл.
Ну и очень просто - сохранить в файл, а в Excel написать сценарий, который его загрузит в файл - у меня так отчёты формировались ещё на пятом Excel, когда 1С в помине не было.
7 КонецЦикла
 
02.11.13
15:33
(6) Вот туплю, но не получилось что-то записать нужный диапазон
Может где-то пример валяется? Пока не нашел
8 МихаилМ
 
02.11.13
15:44
(6)
ошибаетесь

в 1993 была уже 1с бухгалтерия 2.0
9 mrDSide
 
02.11.13
16:15
(3) Если касается именно Excel, почему не хотите:
СоздатьОбъект("Excel.Application")
писать очень удобно, т.к. это COM-объект - используешь функционал этого самого COM-объекта.
10 Rie
 
02.11.13
16:17
(9) COM - тормозит. Если объём данных большой - то на фиг, на фиг.
11 mrDSide
 
02.11.13
20:16
(10) ну тогда бог в помощь!!!
http://msdn.microsoft.com/ru-ru/library/office/gg615597(v=office.14).aspx
12 КонецЦикла
 
02.11.13
21:26
В общем как...

Никуя не получается по адо вставить.
Кто кинет рабочий пример заполнения диапазона ячеек D5:D10 существующего файла с названием листа ТекЛист - буду премного благодарен.

Поэтому пока попробовал заполнять шаблон по адо, а далее скриптом делать копи-пасте куда надо (т.е. открывать 2 окна ексель).
13 КонецЦикла
 
03.11.13
01:46
Самым идиотским моментом оказалось преобразование "эта ячейка отформатирована как текст" в число :)
14 Torquader
 
03.11.13
01:50
(13) А вот эти "грабли" через ADO вообще не решаются - там требуется, чтобы все ячейки в одной колонке были одного типа.
Да и COMSafeArray тут тоже не поможет, так как формат ячейки живёт в отдельной области памяти.
Конечно, число со строкой Excel не спутает, но вот если нужен какой-то специальный формат вывода, то только OLE или встроенный скрипт.
Кстати, как вариант, есть действие - когда в документ Excel временно вставляется сценарий вместе с данными как текст (одно копирование через границы процесса) и потом оно вызывается (второй вызов через границы процесса).
15 КонецЦикла
 
03.11.13
01:59
:)
Кто подскажет почему файл vbs, запускаемый как команда системы, ругается на то что нет доступа к файлу xls
Руками он же отрабатывает нормально
16 КонецЦикла
 
03.11.13
02:00
Там проще все...

With Excel.ActiveSheet.UsedRange
    .FormulaR1C1 = .FormulaR1C1
End With
17 Torquader
 
03.11.13
02:01
(15) Ему нужно путь писать от имени диска, то есть приводить к каноническому виду. И ругается не vbs, который видит файл в текущей директории, а Excel, который вообще ничего не знает о текущей директории процесса, который вызвал его по OLE - у Excel своя текущая директория, и файл он ищет именно там.
18 КонецЦикла
 
03.11.13
02:05
(17) Писал

Set Excel = CreateObject("Excel.Application")
Set Workbooks = Excel.Workbooks
Workbooks.Open("C:\1c911.by.price.xls")

Ошибка: Нет доступа к '1c911.by.price.xls'
Код: 800A03EC
Источник: MS Excel

Видно ты прав, но что тут исправить еще?
19 КонецЦикла
 
03.11.13
03:27
Хм... может программно добавит макрос в книгу ексель и там щарашить?
20 КонецЦикла
 
03.11.13
03:36
ХАХАХАХ
Вротмненоги

ЗапуститьПриложение("C:\1c911.by.script.vbs");
21 КонецЦикла
 
03.11.13
03:46
...только надо малек подождать, не нужно сразу бросаться открывать файл-результат.. .слышно как веник шелестит хотя сообщает об окончании обработки

итак, чтение и запись на моем дохлом компе занимают примерно 6 сек (6500 строк)... ну запись чутка больше
23 Rie
 
03.11.13
09:05
(22) Может, пишущтий процесс захватывает файл? И надо просто подождать его завершения?
24 КонецЦикла
 
03.11.13
14:46
Вроде все ОК.
Просто начало во-первых в цикле крутиться (создал разные файлы "откуда брать" и разные скрипты), во-вторых подправил ячейку вставки, убрал удаление временных файлов (скрипта и "откуда брать", т.к. дозапись еще шла.
25 Torquader
 
04.11.13
13:16
(24) Видишь - нерешаемых задач нет - есть ленивые программисты.
Если постараться, то всё получается.
26 КонецЦикла
 
13.11.13
23:34
Нет блин, все равно не совсем получается. Пробовал сделать сигнальный файл в скрипте - тоже не помогло. Если руками запустить скрипт - получается.

Суть скрипта - копирование большого массива ячеек в буфер и вставка в другой файл с последующей его файла.

Компромиссный вариант - вопрос екселя о сохранении темпового файла при закрытии. Какого хрена спрашивает если файл не изменяется? Из него копируется просто фрагмент.

В vbs скрипте написать проверку свободности в цикле и закрывать сохраняя? Или куда копать?
27 КонецЦикла
 
13.11.13
23:35
Если оставить не закрывая - висит соответственно процесс екселя и залоченный темповый файл
28 КонецЦикла
 
13.11.13
23:36
"с последующей его файла. " читать как "с последующей его записью"
29 КонецЦикла
 
13.11.13
23:41
А... может убивать процесс екселя? :)
Только опять же, заполняемый файл должен успеть записаться
30 КонецЦикла
 
14.11.13
01:59
Ругалось на открытие файла скриптом, поэтому помогло
Connection.Close() от предыдущей операции (заполнения темпового файла)
Еще поменял местами запись темпа (поставил первым) и основного файла
Пока сработало
:)
31 ADirks
 
14.11.13
09:23
Кстати, а не пробовал RiK_SQL::СохранитьТаблицуВЕксел() ?
вроде оно, хотя может с новыми офисами и не взлететь.
32 trad
 
14.11.13
09:28
33 trad
 
14.11.13
09:33
(32) пример
    OLEExSup=СоздатьОбъект("OLEExSup");
    Массив = СоздатьОбъект("OleSafeArray");
    Массив.Создать(Массив.ТипыЗначений.VT_I4,10,20);
    Для инд1=0 По 9 Цикл
        Для инд2=0 По 19 Цикл
            Значение=инд1+инд2;
            Массив.УстановитьЗначение(инд1,инд2,Значение);
        КонецЦикла;
    КонецЦикла;
    ЛевоВерх=Лист.Cells(1,1);
    ПравоНиз=Лист.Cells(10,20);
    Диапазон=Лист.Range(ЛевоВерх, ПравоНиз);
    OLEExSup.УстановитьСвойство(Диапазон,"Value",Массив);
34 trad
 
14.11.13
09:46
еще добавка, получение листа
Книга=глПолучитьCOMОбъект(ПутьКФайлу);
Лист=Книга.Worksheets(1);
35 trad
 
14.11.13
09:46
Функция глПолучитьCOMОбъект(ИмяФайла="", ИмяКлассаCOM="") Экспорт
    ScrptCtrl=СоздатьОбъект("MSScriptControl.ScriptControl");
    ScrptCtrl.Language="vbscript";
    ScrptCtrl.AddCode("
    |Function GetCOMObject(StrFileName, StrClassName)
    |    Set GetCOMObject = GetObject(StrFileName, StrClassName)
    |End Function
    |");
    Возврат ScrptCtrl.Run("GetCOMObject",ИмяФайла, ИмяКлассаCOM);
КонецФункции
36 КонецЦикла
 
14.11.13
12:59
Спасибо, посмотрю. Но уже сделано на ADOХ и работает.
Где раньше был? :)
37 КонецЦикла
 
14.11.13
13:09
(31) надо записывать в определенный шаблон, аккуратненько
допустим колонка 16, строка с 5 по 6200
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс