gifts2017

Еще один способ загрузки из Екселя

Опубликовал Виталий Криволапов (Vit aka proger) в раздел Программирование - Практика программирования

как то раз понадобилось загружать фаил из екселя, только не целиком, а частями. Сначало я хотел сделать что-то навороченное, выгружать весь файл в таблицу, и отмечать галочками нужное. Но потом нашел более элегантное решение.

 В екселе есть возможность выбрать только выделенные строки: Windows.Application.Selection.Value

таким образом требовалось выделить нужные строки в ексели, сохранить фаил и загрузить его в 1с примерно такой обработкой:

Если ПолеВвода="" Тогда
    Предупреждение("Не выбран файл загрузки!");
       возврат;
КонецЕсли;
 ФС = Новый Файл(ПолеВвода);
 Если ФС.Существует()=Истина Тогда
    Попытка
         XLSОбъектОсновной = Новый COMОбъект("Excel.Application");
    Исключение
       Предупреждение("Невозможно загрузить MS EXCEL !!!" + Символы.ПС + ОписаниеОшибки(), 10, "Ошибка");
       Возврат;
   КонецПопытки;
   
  XLSОбъектКниги = XLSОбъектОсновной.WorkBooks;
  
  Попытка
       XLSОбъект = XLSОбъектКниги.Open(ПолеВвода);
  Исключение
       Предупреждение("Невозможно открыть файл " + ПолеВвода + " !!!" + Символы.ПС + ОписаниеОшибки(), 10, "Ошибка");
       XLSОбъект.Application.Quit();
       Возврат;
  КонецПопытки;
  
  ExcellОткрыт=истина;
  XLSОбъект.Application.Caption = "Открыто из 1С";
  Лист = XLSОбъект.ActiveSheet;
  МассивЕкселя = XLSОбъект.Windows.Application.Selection.Value;
  Для СтрокаСДанными = 1  по МассивЕкселя.GetLength(1) цикл
   ОбработкаПрерыванияПользователя();
   Состояние("Обрабатывается строка № "+СтрокаСДанными);
   Если не ПустаяСтрока(МассивЕкселя.GetValue(2,СтрокаСДанными))тогда
    НоваяСтрока=ТабличнаяЧастьОС.Добавить();
    НоваяСтрока.Номер   = МассивЕкселя.GetValue(1,СтрокаСДанными);
    .............................................

    КонецЕсли;
 КонецЦикла;
     XLSОбъект.Application.Quit();
     ExcellОткрыт=Ложь;
     Предупреждение("Получение данных успешно завершено!");
 Иначе
     Возврат;
 КонецЕсли; 

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. artem666 Bogomaz (artem666) 25.03.10 21:03
Я открою тебе секрет, через ADO можно делать запрос по определенным ячейкам.
2. Виталий Криволапов (Vit aka proger) 26.03.10 07:29
artem666, а как ты определишь, какие ячейки нужны пользователю в каждом документе?
или ты заставишь их редактировать екселевский документ по нужному тебе шаблону?
3. Борис Скворцов (gaglo) 26.03.10 11:19
... а почему бы не удалить ненужные строки в ексели, сохранить файл с новым именем и потом загрузить в 1С целиком?
4. Виталий Криволапов (Vit aka proger) 26.03.10 12:41
gaglo, обычно так и делают, но у меня была особая ситуация: были очень большие екселевские документы, на их основе создавалось много 1с документов, строки которые шли в отдельный 1с документ, как правило шли подряд, друг за другом, но были исключения.
Конечно, я не спорю, можно было создавать из 1 екселя десяток других, но это более трудоемкая работа, чем выделить нужные строки.
5. Виталий Криволапов (Vit aka proger) 26.03.10 13:15
я не утверждаю, что изложенный мной способ лучше стандартного
Для СтрокаСДанными=5 по Лист.Cells(1,1).SpecialCells(11).Row цикл,
мой способ немного отличается и кому-то будет полезен, я думаю.
6. Борис Скворцов (gaglo) 29.03.10 09:29
(5) С трудом, но понял. Автор считает стандартным способом цикл получения по одному значению ячейки за одно обращение к COM-объекту. Для меня же давно стало стандартным способом получение COMSafeArray (личная благодарность от меня за это астральному духу по имени Шепот теней ;-]), только я пишу XXX.UsedRange.Value и получаю все значения с листа; а автор довел до меня, что можно написать XXX.Selection.Value, и получить только выделенные! Уговорил.
8. WellMaster (WellMaster) 31.03.10 09:20
9. Eugeneer (Eugeneer) 31.03.10 09:31
Хаха. все делается гораздо проще. я буквально вчера сделал интеллектуальный распознаватель таблиц. Загружает без всяких настроек только нужную табличную часть.
10. Андрей Герасимов (imagoman) 07.04.10 07:31
текст только бы раскрасить, было бы читаемей
11. Виталий Криволапов (Vit aka proger) 07.04.10 10:12
(10) попытался, подскажите кто знает, как раскрасить текст не вручную
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа