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