|
Выгрузка в ексель из таб части используя ComSafeArray | ☑ | ||
---|---|---|---|---|
0
yyyuuu
02.02.22
✎
09:02
|
Всем привет ребята.
Хочу выгрузить табличную часть документа в Excel. Шапка формируется все хорошо, а вот строки и значения нет. Подскажите пожалуйста ребята как бы можно было это реализовать? Что Я сделал: Попытка Excel_App = Новый COMОбъект("Excel.Application"); Excel_App.Interactive = Ложь; Excel_App.DisplayAlerts = Ложь; Исключение Сообщить("Не удалось подключиться к Excel, возможно программа на компьютере не установлена! Операция прервана!"); Возврат; КонецПопытки; Книга=Excel_App.Application.Workbooks.Add(); Д1 = ЭтотОбъект.Дата; Сообщить(Д1); случайноеЧисло = Новый ГенераторСлучайныхЧисел(0); сл = случайноеЧисло.СлучайноеЧисло(0,1000); ИмяФайла = "disloc_" + ФЧ(День(Д1), 2) + ФЧ(Месяц(Д1), 2) + ФЧ(Год(Д1), 4) + "_" + ФЧ(Час(Д1), 2) + "_" + ФЧ(Минута(Д1), 2) + сл + ".xls"; Сообщить(ИмяФайла); Сообщить("Формирую файл Excel..."); ТекЛист=Книга.WorkSheets(1); ТекЛист.Name = "report"; Если Выб_Таблица.Количество() = 0 Тогда Сообщить("Пустая таблица! Операция прервана!"); Возврат; КонецЕсли; КолонкиТаблицы = Выб_Таблица.выгрузитьКолонки().Колонки;//Выб_Таблица.Колонки; СтартМассив = Новый Массив; Для каждого Колонка Из КолонкиТаблицы Цикл //СтартМассив.Добавить(Выб_Таблица.ВыгрузитьКолонку(Колонка.Имя)); СтартМассив.Добавить(Колонка.Имя); КонецЦикла; РазмерМассив = Новый Массив; РазмерМассив.Добавить(КолонкиТаблицы.Количество()); РазмерМассив.Добавить(Выб_Таблица.Количество()); МассивArray = Новый COMSafeArray(СтартМассив, "VT_VARIANT", РазмерМассив); НачальнаяСтрока = 3; Book_Excel = Excel_App.Workbooks.Add(); Sheet_Excel = Book_Excel.Sheets(1); Кол_Строк = Выб_Таблица.Количество()+1; Кол_Колонок = КолонкиТаблицы.Количество(); //Sheet_Excel.Range(Sheet_Excel.Cells(2,1), Sheet_Excel.Cells(Кол_Строк, Кол_Колонок)).Value = МассивArray; a=0; Для каждого Колонка Из КолонкиТаблицы Цикл a=a+1; Sheet_Excel.Cells(1,a).Value = Колонка.Имя; Sheet_Excel.Columns(a).EntireColumn.AutoFit(); КонецЦикла; Для каждого СтрокаТабличнойЧасти Из Вагоны Цикл а=1; //МассивArray.SetValue(3,3,СтрокаТабличнойЧасти); //МассивКом.SetValue ( 1 , 3 , СтрокаТабличнойЧасти ); Для каждого Строка Из СтрокаТабличнойЧасти Цикл а = а + 1; // Sheet_Excel.Cells(НачальнаяСтрока+1,a-1).Value = Строка; //МассивArray.SetValue(Кол,Стр,Строка); //Sheet_Excel.Columns(2).EntireColumn.AutoFit(); КонецЦикла; НачальнаяСтрока = НачальнаяСтрока +1; КонецЦикла; Sheet_Excel.Range(Sheet_Excel. Cells ( 1 , 1 ), Sheet_Excel . Cells ( Кол_Строк , Кол_Колонок )). Value = МассивArray ; ВремТаб = КаталогВременныхФайлов(); Сообщить(ВремТаб + ИмяФайла); Попытка //Book_Excel.SaveAs(ИмяФайла); Book_Excel.SaveAs(ВремТаб + ИмяФайла,51); Исключение Book_Excel.Close(); Book_Excel = Неопределено; Сообщить("Ошибка при записи файла! Операция прервана!"); Возврат; КонецПопытки; Excel_App.Interactive = Истина; Excel_App.DisplayAlerts = Истина; Excel_App.Application.Quit(); Excel_App = Неопределено; |
|||
1
Галахад
гуру
02.02.22
✎
09:12
|
А что значит "не хорошо"?
|
|||
2
yyyuuu
02.02.22
✎
09:16
|
(1) не формируются строки табличной части, не могу понять что делаю не так
|
|||
3
Галахад
гуру
02.02.22
✎
09:23
|
Наверное криво МассивArray заполняешь.
|
|||
4
yyyuuu
02.02.22
✎
09:23
|
(3) возможно. Вот и хотелось бы узнать, может кто решал подобное и подскажет как
|
|||
5
lodger
02.02.22
✎
09:26
|
(4) вроде всё хорошо работает. ты в сейф-массив заполнил шапку и расчертил размер Х на У
|
|||
6
lodger
02.02.22
✎
09:29
|
кстати, а где ты нашёл такой вариант использования конструктора?
РазмерМассив = Новый Массив; РазмерМассив.Добавить(КолонкиТаблицы.Количество()); РазмерМассив.Добавить(Выб_Таблица.Количество()); МассивArray = Новый COMSafeArray(СтартМассив, "VT_VARIANT", РазмерМассив); |
|||
7
Галахад
гуру
02.02.22
✎
09:34
|
(6) Нормальный вариант. В СП есть.
|
|||
8
yyyuuu
02.02.22
✎
09:52
|
(6) в гугле, нагуглил где то, вроде бы рабочий
|
|||
9
yyyuuu
02.02.22
✎
09:57
|
Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ;
по причине: Произошла исключительная ситуация (0x800a03ec) Сейчас ошибка |
|||
10
lodger
02.02.22
✎
10:20
|
(9) среди значений полей есть нестроковые типы.
|
|||
11
yyyuuu
02.02.22
✎
10:21
|
(10) Точно, спасибо что подсказал. Сразу заработало, ну не совсем заработало, но эта ошибка ушла
|
|||
12
yyyuuu
02.02.22
✎
10:27
|
Поля выводятся, но теперь не выводится шапка. Что не так?
ИменаКолонок = Новый Массив; Для Каждого Колонка Из Колонки Цикл ИменаКолонок.Добавить(Колонка.Имя); КонецЦикла; МассивКОМ = Новый COMSafeArray("VT_VARIANT", ВсегоКолонок, ВсегоСтрок); МассивКОМ.SetValue(1, 2, ИменаКолонок); Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ; {Документ.Дислокация.Форма.ФормаДокумента.Форма(330)}: Ошибка при установке значения атрибута контекста (Value) Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ; по причине: Произошла исключительная ситуация (0x800a03ec) |
|||
13
yyyuuu
02.02.22
✎
10:41
|
(10) а вот смотри еще, а что делать если у Меня в полях есть Даты, не передлывать же Мне их строки, тогда фильтры нельзя будет использовать по датам если дата не строка то ошбика
{Документ.Дислокация.Форма.ФормаДокумента.Форма(330)}: Ошибка при установке значения атрибута контекста (Value) Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ; по причине: Произошла исключительная ситуация (0x800a03ec) |
|||
14
acht
02.02.22
✎
10:43
|
"Что Я сделал ... у Меня ... Мне ..."
Чой-то ржу |
|||
15
yyyuuu
02.02.22
✎
10:45
|
Что то понять не могу вообще. В некоторых документах все ок, работает как надо.
В некоторых ошибка. Каким образом возникает не пойму. Типы данных везде одинаковые: Число, строка, дата {Документ.Дислокация.Форма.ФормаДокумента.Форма(341)}: Ошибка при установке значения атрибута контекста (Value) Ексель.Range(Ексель.Cells(1,1), Ексель.Cells(ВсегоСтрок,ВсегоКолонок)).Value = МассивКОМ; по причине: Произошла исключительная ситуация (0x800a03ec) |
|||
16
yyyuuu
02.02.22
✎
10:46
|
(14) это очень веселая шутка
|
|||
17
mistеr
02.02.22
✎
11:19
|
(0) Немного оффтопик, но зачем вообще нужен этот ComSafeArray? Та быстрее выгружается, что ли?
|
|||
18
lodger
02.02.22
✎
11:24
|
(15) поищи пустые даты
|
|||
19
lodger
02.02.22
✎
11:24
|
excel не любит дат меньше 01.01.1900, поэтому и пустую дату передавать нельзя
|
|||
20
yyyuuu
02.02.22
✎
11:24
|
(17) да, конечно быстрее там 5 тысяч строк, не всегда но бывает. через ComSafeArray вообще раз два и в дамках
|
|||
21
lodger
02.02.22
✎
11:28
|
(20) сохранить табдок в формате excel может быть ещё быстрее.
|
|||
22
mistеr
02.02.22
✎
11:50
|
(20) Быстрее, чем ТабДок.Записать()?
|
|||
23
yyyuuu
02.02.22
✎
11:52
|
(19) Мужик, ты вообще всем был прав. Да действительно пустая дата.
Не совсем согласен с таб.доком на больших объемах. Да и макет надо рисовать еще |
|||
24
lodger
02.02.22
✎
12:16
|
(23) построитель отчёта выведет тебе любую табличную фигню без рисования макета.
|
|||
25
yyyuuu
02.02.22
✎
12:32
|
(24) Пожалуйста можешь в качестве примера что нибудь рабочее скинуть?
|
|||
26
lodger
02.02.22
✎
12:43
|
(25)
Строитель1 = Новый ПостроительОтчета; Строитель1.ИсточникДанных = Новый ОписаниеИсточникаДанных(РезультатЗапроса);//или таблица значений Строитель1.ЗаполнитьНастройки(); ТекущаяСтраница = Новый ТабличныйДокумент; Строитель1.Вывести(ТекущаяСтраница); Короче кода для вывода таблицы в табдок, по моему, просто не существует. //А если разобраться с источником данных и подогнать туда непосредственно запрос, то и копирования данных в оперативке меньше будет. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |