|
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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |