|
v8: выгрузка из 1С в Excel с помощью ADO,как указать с какой строки грузить? | ☑ | ||
---|---|---|---|---|
0
Shur1cIT
25.11.13
✎
11:00
|
нашел два примера формировании строки, но не пойму где указывать начало строки загрузки? мне дополнять лист необходимо а не с нуля добавлять
Command.CommandText = "INSERT INTO [МояТаблица] |(Символьный, Дата, Целый, Дробный) |values ('АБВГДЕЁ', '12/4/1955', '1234567', '12345,6789')"; Command.Execute(); |
|||
1
Shur1cIT
25.11.13
✎
11:24
|
может быть не INSERT INTO использовать ? а что тогда?
|
|||
2
Apokalipsec
25.11.13
✎
11:25
|
ну по логике ADD
|
|||
3
Shur1cIT
25.11.13
✎
11:30
|
не могу примера найти, может это как-то по-другому делают?
|
|||
4
Apokalipsec
25.11.13
✎
11:33
|
ладно, зайдем с другой стороны, ты это делаешь в цикле и добавляешь единичку к строке в которую это вставляешь?
|
|||
5
Shur1cIT
25.11.13
✎
11:35
|
да это в цикле ,единицы нет просто добавляться данные
|
|||
6
Shur1cIT
25.11.13
✎
11:37
|
по оле у меня выгружалось так, сейчас на ADO переделываю
НомерСтроки = НомерСтрокиДляНачалаЗагрузки; Для Каждого Строка ИЗ ТабПлатежей Цикл Лист.Cells(НомерСтроки, 1).Value = Строка.Дата;//Формат(Строка.Дата,"ДЛФ=D"); Лист.Cells(НомерСтроки, 2).Value = СокрЛП(Строка.КодГр); Лист.Cells(НомерСтроки, 3).Value = СокрЛП(Строка.КодСтатьи); Лист.Cells(НомерСтроки, 4).Value = Строка.Дебет;//Число(Формат(Строка.Дебет ,"ЧЦ=15; ЧДЦ=2; ЧГ=")); Лист.Cells(НомерСтроки, 5).Value = Строка.Кредит;//Число(Формат(Строка.Кредит,"ЧЦ=15; ЧДЦ=2; ЧГ=")); Лист.Cells(НомерСтроки, 7).Value = СокрЛП(Строка.Контрагент); Лист.Cells(НомерСтроки, 8).Value = СокрЛП(Строка.НазначениеПлатежа); Лист.Cells(НомерСтроки, 10).Value = Строка(Строка.Неделя-Смещение)+"-я неделя"; Лист.Cells(НомерСтроки, 12).Value = ПолучитьКомпаниюВФорматеДДС(Строка.Компания); Лист.Cells(НомерСтроки, 13).Value = СокрЛП(Строка.РуководительЦФО); Лист.Cells(НомерСтроки, 14).Value = Строка.ДебетВВалюте;//Число(Формат(Строка.ДебетВВалюте ,"ЧЦ=15; ЧДЦ=2; ЧГ=")); Лист.Cells(НомерСтроки, 15).Value = Строка.КредитВВалюте;//Число(Формат(Строка.КредитВВалюте,"ЧЦ=15; ЧДЦ=2; ЧГ=")); Лист.Cells(НомерСтроки, 16).Value = Формат(Строка.КурсНаДату ,"ЧЦ=15; ЧДЦ=2; ЧГ="); НомерСтроки = НомерСтроки + 1; Сообщить(НомерСтроки); КонецЦикла; |
|||
7
Apokalipsec
25.11.13
✎
11:40
|
а как сейчас выгружается? код приведи.
|
|||
8
Shur1cIT
25.11.13
✎
11:46
|
Это раньше так было в связи с тем что очень часто сие глючит и работает медленно решил переделать на ADO, но заткнулся по причине отсутствие в адо возможности указания номера строки вставки
Смещение = 0; Смещение = ПолучитьСмещениеНеделиМесяца(ДатаНачала); ТабПлатежей = ПолучитьДанныеДляВыгрузки(); xlCalculationAutomatic = -4105; xlCalculationManual = -4135; Попытка // Загрузка объекта Microsoft Excel Состояние("Выгрузка данных из 1С в Microsoft Excel..."); ExcelПриложение = Новый COMОбъект("Excel.Application"); Исключение Сообщить("Ошибка при запуске Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание); Возврат; КонецПопытки; Книга = ExcelПриложение.WorkBooks.Open(ФайлДДС); ExcelПриложение.Visible = 1; Лист = Книга.WorkSheets(СокрЛП(ИмяЛистаДляВыгрузки));// лист для загрузки ExcelПриложение.Calculation = xlCalculationManual; НомерСтроки = НомерСтрокиДляНачалаЗагрузки; Для Каждого Строка ИЗ ТабПлатежей Цикл Лист.Cells(НомерСтроки, 1).Value = Строка.Дата;//Формат(Строка.Дата,"ДЛФ=D"); Лист.Cells(НомерСтроки, 2).Value = СокрЛП(Строка.КодГр); Лист.Cells(НомерСтроки, 3).Value = СокрЛП(Строка.КодСтатьи); Лист.Cells(НомерСтроки, 4).Value = Строка.Дебет;//Число(Формат(Строка.Дебет ,"ЧЦ=15; ЧДЦ=2; ЧГ=")); Лист.Cells(НомерСтроки, 5).Value = Строка.Кредит;//Число(Формат(Строка.Кредит,"ЧЦ=15; ЧДЦ=2; ЧГ=")); Лист.Cells(НомерСтроки, 7).Value = СокрЛП(Строка.Контрагент); Лист.Cells(НомерСтроки, 8).Value = СокрЛП(Строка.НазначениеПлатежа); Лист.Cells(НомерСтроки, 10).Value = Строка(Строка.Неделя-Смещение)+"-я неделя"; Лист.Cells(НомерСтроки, 12).Value = ПолучитьКомпаниюВФорматеДДС(Строка.Компания); Лист.Cells(НомерСтроки, 13).Value = СокрЛП(Строка.РуководительЦФО); Лист.Cells(НомерСтроки, 14).Value = Строка.ДебетВВалюте;//Число(Формат(Строка.ДебетВВалюте ,"ЧЦ=15; ЧДЦ=2; ЧГ=")); Лист.Cells(НомерСтроки, 15).Value = Строка.КредитВВалюте;//Число(Формат(Строка.КредитВВалюте,"ЧЦ=15; ЧДЦ=2; ЧГ=")); Лист.Cells(НомерСтроки, 16).Value = Формат(Строка.КурсНаДату ,"ЧЦ=15; ЧДЦ=2; ЧГ="); НомерСтроки = НомерСтроки + 1; Сообщить(НомерСтроки); КонецЦикла; Сообщить("Конец выгрузки!"); ExcelПриложение.Calculation = xlCalculationAutomatic; |
|||
9
Shur1cIT
25.11.13
✎
12:06
|
вопрос при выгрузке по ОЛЕ есть ли возможность подключиться к уже открытому файлу Excell пользователя?
|
|||
10
acsent
25.11.13
✎
12:08
|
Разве INSERT не добавляет строку снизу???
|
|||
11
Shur1cIT
25.11.13
✎
12:14
|
(10) добавляет, только не всегда она корректно низ определить сможет, так как строки частично по формулам уже заполнены будут
|
|||
12
Serginio1
25.11.13
✎
12:39
|
(0)
Процедура СоздатьПараметрыИТекст(СтрКолонки,Стр,Cmd) Имя=СтрКолонки.Имя; ТипЗначения=СтрКолонки.ТипЗначения; Если ТипЗначения.СодержитТип(Тип("Строка")) Тогда Стр=Стр+Имя+" NTEXT,"; Cmd.Parameters.Append(Cmd.CreateParameter(Имя,203,1,255,"1")); ИначеЕсли ТипЗначения.СодержитТип(Тип("Число")) Тогда КвалификаторыЧисла=Типзначения.КвалификаторыЧисла; Разрядность=КвалификаторыЧисла.Разрядность; РазрядностьДробнойЧасти=КвалификаторыЧисла.РазрядностьДробнойЧасти; Стр=Стр+Имя+" Numeric("+Разрядность+","+РазрядностьДробнойЧасти+"),"; // Парам=Cmd.CreateParameter(Имя,131,1,Разрядность,); Парам=Cmd.CreateParameter(Имя,6,1,Разрядность,); Парам.NumericScale = РазрядностьДробнойЧасти; Парам.Precision = Разрядность-РазрядностьДробнойЧасти-?(РазрядностьДробнойЧасти=0,0,1); Cmd.Parameters.Append(Парам); ИначеЕсли ТипЗначения.СодержитТип(Тип("Дата")) Тогда Стр=Стр+Имя+" DateTime,"; Cmd.Parameters.Append(Cmd.CreateParameter(Имя,135,1)); ИначеЕсли ТипЗначения.СодержитТип(Тип("Булево")) Тогда Стр=Стр+Имя+" BOOLEAN,"; Cmd.Parameters.Append(Cmd.CreateParameter(Имя,11,1)); КонецЕсли; КонецПроцедуры Процедура СоздатьТаблицуИКоманд(Тз,Соединение,Команд) Стр="Create TABLE Лист1 ("; Колонки=Тз.Колонки; Для каждого СтрКолонки из колонки Цикл СоздатьПараметрыИТекст(СтрКолонки,Стр,Команд) КонецЦикла; Стр=Лев(Стр,СтрДлина(Стр)-1)+")"; Соединение.Execute(Стр); КонецПроцедуры Процедура ЗаписатьТзВЭксель(тз) // Допустимые типы // adDouble = 5 Значение с плавающей точкой двойной точности // adDAte = 7 Дата // adCurrency = 6 Денежная сумма // adBoolean = 11 Булево // adVarWChar = 202 Символьная строка Unicode, заканчивающаяся NULL // adLongVarWChar = 203 Длинное строковое значение ИмяФайлаЭксель = "D:\Export.xlsx"; // Имя создаваемого файла Файл=Новый Файл(ИмяФайлаЭксель); Если файл.Существует() Тогда УдалитьФайлы(ИмяФайлаЭксель); КонецЕсли; СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = "+ИмяФайлаЭксель; СтрокаПодключения = СтрокаПодключения + ";Mode=Share Deny Write; Extended Properties = "+"""Excel 12.0"+";HDR=Yes;IMEX=1"";"; ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source="+ИмяФайлаЭксель+";Extended Properties=Excel 12.0 Xml;"; Connection = Новый COMОбъект("ADODB.Connection"); // Создаем соединение Connection = Новый COMОбъект("ADODB.Connection"); Connection.Open(ActiveConnection); Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Connection; Command.CommandType = 1; СоздатьТаблицуИКоманд(Тз,Connection,Command); Connection = Новый COMОбъект("ADODB.Connection"); Connection.Open(СтрокаПодключения); Command.ActiveConnection = Connection; Command.CommandType = 1; Параметры= Command.Parameters; ТекстВопросов=" VALUES("; ТекстКоманды= "INSERT INTO [Лист1]("; Для каждого парам из Параметры Цикл ТекстКоманды=ТекстКоманды+парам.Name+","; ТекстВопросов=ТекстВопросов+"?," КонецЦикла; ТекстКоманды=Лев(ТекстКоманды,стрДлина(ТекстКоманды)-1)+") "+Лев(ТекстВопросов,стрДлина(ТекстВопросов)-1)+")"; Сообщить(ТекстКоманды); Command.CommandText=ТекстКоманды; Command.prepared=истина; Для каждого Выборка из Тз Цикл Для каждого парам из Параметры Цикл Значение=Выборка[Парам.Name]; Если Парам.Type=203 Тогда Парам.Size=СтрДлина(Значение)+1; КонецЕсли; Парам.Value=Значение; КонецЦикла; Command.Execute(); КонецЦикла; // // Закрываем соединение Command = Неопределено; Connection.Close(); Connection = Неопределено; КонецПроцедуры |
|||
13
WildSery
25.11.13
✎
12:44
|
(12) Молодец! А теперь прочитай, что было нужно.
(11) Вставляй не в страницу, а в неименованный диапазон, типа "INSERT INTO [Sheet1$A10:O10]" В этом случае вставка будет в первую незанятую строку после 10й, не важно, что за пределами диапазона. |
|||
14
Shur1cIT
25.11.13
✎
13:11
|
ок спасибо
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |