![]() |
|
Выгрузка справочника в Excell | ☑ | ||
---|---|---|---|---|
0
inmortal203
17.10.14
✎
12:43
|
Добрый день! Не перестает "радовать" меня моя работа... Пытаюсь выгрузить в эксель справочник. Но файл создается, ошибок никаких... но вот только он пустой в итоге! Хотя данные записываются по алгоритму верно. Что в этой части кода не так?
ИмяФайла = ЭтотОбъект.ФайлЭкспорта; Попытка Эксель = Новый COMОбъект("Excel.Application"); Эксель.DisplayAlerts = False; Исключение Сообщить(ОписаниеОшибки()); Эксель.Application.Quit(); Возврат; КонецПопытки; // если указали имя несуществующего файла... Если НайтиФайлы(ИмяФайла).Количество() = 0 Тогда ТабДокумент = Новый ТабличныйДокумент; ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS); Иначе УдалитьФайлы(ИмяФайла); ТабДокумент = Новый ТабличныйДокумент; ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS); КонецЕсли; Книга = Эксель.WorkBooks.Open(ИмяФайла); Лист = Книга.WorkSheets(ТекущийЛист); Лист.Name = "Спр1"; Состояние("Выгружается справочник "+"Спр1"); ЗаписатьСправочникНаЛист("Спр1",Лист); Попытка Книга.SaveAs(ИмяФайла); Исключение Сообщить(ОписаниеОшибки()+" Файл не сохранен!"); КонецПопытки; Эксель.ActiveWorkbook.Close(); Эксель.Application.Quit(); |
|||
1
pessok
17.10.14
✎
12:48
|
зачем такой гемор? заполняй просто табличный документ и сохраняй сразу готовый в эксель.
+ никто не знает что у тебя в ЗаписатьСправочникНаЛист("Спр1",Лист); |
|||
2
inmortal203
17.10.14
✎
12:50
|
(1) гемор в том, что в книге эксель должно быть около 12 справочников на разных листах. просто цикл я выкинул. дело не в этом, не сохраняется и первый лист.
|
|||
3
silent person
17.10.14
✎
12:51
|
ТекущийЛист где-то определяется ?
|
|||
4
silent person
17.10.14
✎
12:52
|
а вот это:
Если НайтиФайлы(ИмяФайла).Количество() = 0 Тогда ТабДокумент = Новый ТабличныйДокумент; ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS); Иначе УдалитьФайлы(ИмяФайла); ТабДокумент = Новый ТабличныйДокумент; ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS); КонецЕсли; тоже было в цикле ? O_o |
|||
5
Рэйв
17.10.14
✎
12:53
|
(0)Сдается мне собака порылась у тебя в скромно укрытом ЗаписатьСправочникНаЛист("Спр1",Лист);
|
|||
6
inmortal203
17.10.14
✎
12:58
|
понимаю опасения в зелености прогера) вот тогда полностью текст:
МассивСпавочников = Новый Массив; МассивСпавочников.Добавить("хххх"); ----------------------------------- ИмяФайла = ЭтотОбъект.ФайлЭкспорта; // пытаемся открыть эксель Попытка Эксель = Новый COMОбъект("Excel.Application"); Эксель.DisplayAlerts = False; Исключение Сообщить(ОписаниеОшибки()); Эксель.Application.Quit(); Возврат; КонецПопытки; // если указали имя несуществующего файла... Если НайтиФайлы(ИмяФайла).Количество() = 0 Тогда ТабДокумент = Новый ТабличныйДокумент; ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS); Иначе УдалитьФайлы(ИмяФайла); ТабДокумент = Новый ТабличныйДокумент; ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS); КонецЕсли; Книга = Эксель.WorkBooks.Open(ИмяФайла); ТекущийЛист = 1; //Для Каждого ТекущийСправочник из МассивСпавочников Цикл Если ТекущийЛист = 1 Тогда Лист = Книга.WorkSheets(ТекущийЛист); КонецЕсли; Лист.Name = ТекущийСправочник; Состояние("Выгружается справочник "+ТекущийСправочник); ЗаписатьСправочникНаЛист(ТекущийСправочник ,Лист); ТекущийЛист = ТекущийЛист + 1; Лист = Книга.Sheets.Add(); //КонецЦикла; Попытка Книга.SaveAs(ИмяФайла); Исключение Сообщить(ОписаниеОшибки()+" Файл не сохранен!"); КонецПопытки; Эксель.ActiveWorkbook.Close(); Эксель.Application.Quit(); а вот и процедура которая заполняет Условия = "ГДЕ НЕ Спр.ЭтоГруппа И НЕ Спр.ПометкаУдаления"; ЕстьГруппы = Метаданные.Справочники[Справочник].Реквизиты.Найти("ЭтоГруппа") <> Неопределено; ЕстьОрганизация = Метаданные.Справочники[Справочник].Реквизиты.Найти("Организация") <> Неопределено; Условия = ?(ЕстьГруппы,Условия,СтрЗаменить(Условия,"НЕ Спр.ЭтоГруппа И","")) + ?(ЕстьОрганизация," И Спр.Организация = &Организация ",""); Запрос = Новый Запрос; Если ЕстьОрганизация Тогда Запрос.УстановитьПараметр("Организация",Справочники.Организации.НайтиПоКоду("000000001")); КонецЕсли; Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник."+Справочник+" Как Спр "+Условия+" Упорядочить ПО Наименование"; Данные = Запрос.Выполнить().Выгрузить(); СтруктураКолонок = Новый Структура; Колонка=1; // заполнение шапки таблицы Для Каждого ТекКолонка из Данные.Колонки Цикл ИмяКолонки = ТекКолонка.Имя; Если мСписокИсключаемыхКолонок.Найти(ИмяКолонки) = Неопределено Тогда Лист.Cells(1, Колонка).NumberFormat = "@"; Лист.Cells(1,Колонка).Value = ИмяКолонки; СтруктураКолонок.Вставить(ИмяКолонки,Колонка); Колонка=Колонка+1; КонецЕсли; КонецЦикла; // заполнить шапку таблицы ТекСтрокаЛиста = 2; // переносим саму таблицу в эксель Для Каждого Строка из Данные Цикл Кол = 1; Для Каждого ТекКолонка из Данные.Колонки Цикл ИмяКолонки = ТекКолонка.Имя; Если мСписокИсключаемыхКолонок.Найти(ИмяКолонки) = Неопределено Тогда Лист.Cells(ТекСтрокаЛиста, Кол).NumberFormat = "@"; Лист.Cells(ТекСтрокаЛиста,Кол).Value = Строка(Строка[ИмяКолонки]); Кол = Кол + 1; КонецЕсли; КонецЦикла; ТекСтрокаЛиста = ТекСтрокаЛиста + 1; КонецЦикла; // заполняем данные таблицы проверено отладчиком, Данные - заполнено. |
|||
7
inmortal203
17.10.14
✎
12:59
|
внутрь цикла однозначно заходим
(с) Отладчик Если мСписокИсключаемыхКолонок.Найти(ИмяКолонки) = Неопределено Тогда Лист.Cells(ТекСтрокаЛиста, Кол).NumberFormat = "@"; Лист.Cells(ТекСтрокаЛиста,Кол).Value = Строка(Строка[ИмяКолонки]); Кол = Кол + 1; КонецЕсли; |
|||
8
Рэйв
17.10.14
✎
13:05
|
(6)Нехорошо зарезервированными словами имновать переменные:-)
Попробуй в Для Каждого Строка из Данные Цикл вместо Строка чтото другое. Может из-за этого глючит. А вообще вставь в цикл Сообщить(Лист.Cells(ТекСтрокаЛиста,Кол).Value); Чтобы точно знать что в ексель чтото попало. |
|||
9
silent person
17.10.14
✎
13:13
|
у меня 2010 Excel не захотел открывать файл созданный вот так
ТабДокумент = Новый ТабличныйДокумент; // ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS); создал пустой файл руками в Excel-е. Справочник выгрузился. |
|||
10
silent person
17.10.14
✎
13:14
|
+9
всмысле вот так ТабДокумент = Новый ТабличныйДокумент; ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS); это я уже у себя закомментировал, чтобы мой файл не затирался |
|||
11
inmortal203
17.10.14
✎
13:21
|
(8) хорошая идея) сейчас попробую.. иногда о таком даже не задумываешься...
|
|||
12
inmortal203
17.10.14
✎
13:49
|
не знаю что делать, но все это не помогает... уже и формат поменял, и вручную создавал и xls и xlsx...
|
|||
13
silent person
17.10.14
✎
14:17
|
на локальном компьютере вот эта обработка сработала нормально, все выгрузилось.
&НаСервереБезКонтекста Процедура ЗаписатьСправочникНаЛист(Справочник ,Лист) Условия = "ГДЕ НЕ Спр.ЭтоГруппа И НЕ Спр.ПометкаУдаления"; ЕстьГруппы = Метаданные.Справочники[Справочник].Реквизиты.Найти("ЭтоГруппа") <> Неопределено; ЕстьОрганизация = Метаданные.Справочники[Справочник].Реквизиты.Найти("Организация") <> Неопределено; Условия = ?(ЕстьГруппы,Условия,СтрЗаменить(Условия,"НЕ Спр.ЭтоГруппа И","")) + ?(ЕстьОрганизация," И Спр.Организация = &Организация ",""); Запрос = Новый Запрос; Если ЕстьОрганизация Тогда Запрос.УстановитьПараметр("Организация",Справочники.Организации.НайтиПоКоду("000000001")); КонецЕсли; Запрос.Текст = "ВЫБРАТЬ * ИЗ Справочник."+Справочник+" Как Спр "+Условия+" Упорядочить ПО Наименование"; Данные = Запрос.Выполнить().Выгрузить(); СтруктураКолонок = Новый Структура; Колонка=1; // заполнение шапки таблицы Для Каждого ТекКолонка из Данные.Колонки Цикл ИмяКолонки = ТекКолонка.Имя; //Если мСписокИсключаемыхКолонок.Найти(ИмяКолонки) = Неопределено Тогда Лист.Cells(1, Колонка).NumberFormat = "@"; Лист.Cells(1,Колонка).Value = ИмяКолонки; СтруктураКолонок.Вставить(ИмяКолонки,Колонка); Колонка=Колонка+1; //КонецЕсли; КонецЦикла; // заполнить шапку таблицы ТекСтрокаЛиста = 2; // переносим саму таблицу в эксель Для Каждого Строка из Данные Цикл Кол = 1; Для Каждого ТекКолонка из Данные.Колонки Цикл ИмяКолонки = ТекКолонка.Имя; //Если мСписокИсключаемыхКолонок.Найти(ИмяКолонки) = Неопределено Тогда Лист.Cells(ТекСтрокаЛиста, Кол).NumberFormat = "@"; Лист.Cells(ТекСтрокаЛиста,Кол).Value = Строка(Строка[ИмяКолонки]); Кол = Кол + 1; //КонецЕсли; КонецЦикла; ТекСтрокаЛиста = ТекСтрокаЛиста + 1; КонецЦикла; // заполняем данные таблицы КонецПроцедуры &НаСервереБезКонтекста Процедура Команда1НаСервере() // Вставить содержимое обработчика. // МассивСпавочников = Новый Массив; // МассивСпавочников.Добавить("хххх"); // ----------------------------------- ИмяФайла = "D:\test.xls"; // пытаемся открыть эксель Попытка Эксель = Новый COMОбъект("Excel.Application"); Эксель.DisplayAlerts = False; Исключение Сообщить(ОписаниеОшибки()); Эксель.Application.Quit(); Возврат; КонецПопытки; // если указали имя несуществующего файла... //Если НайтиФайлы(ИмяФайла).Количество() = 0 Тогда // ТабДокумент = Новый ТабличныйДокумент; // ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS); //Иначе // УдалитьФайлы(ИмяФайла); // ТабДокумент = Новый ТабличныйДокумент; // ТабДокумент.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS); //КонецЕсли; Книга = Эксель.WorkBooks.Open(ИмяФайла); ТекущийЛист = 1; //Для Каждого ТекущийСправочник из МассивСпавочников Цикл Если ТекущийЛист = 1 Тогда Лист = Книга.WorkSheets(ТекущийЛист); КонецЕсли; ТекущийСправочник = "Сотрудники"; Лист.Name = ТекущийСправочник; // Состояние("Выгружается справочник "+ТекущийСправочник); ЗаписатьСправочникНаЛист(ТекущийСправочник ,Лист); ТекущийЛист = ТекущийЛист + 1; Лист = Книга.Sheets.Add(); //КонецЦикла; Попытка Книга.SaveAs(ИмяФайла); Исключение Сообщить(ОписаниеОшибки()+" Файл не сохранен!"); КонецПопытки; Эксель.ActiveWorkbook.Close(); Эксель.Application.Quit(); КонецПроцедуры &НаКлиенте Процедура Команда1(Команда) Команда1НаСервере(); КонецПроцедуры |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |