[РЕШЕНО] Загрузка данных из Экселя

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем alexburn, 10 авг 2015.

  1. TopicStarter Overlay
    alexburn
    Online

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.781
    Симпатии:
    509
    Баллы:
    204
    Приветствую, ребята. Пишу код для подключения к экселю:
    Код:
    Попытка
            ДокумЭксель = Новый COMОбъект("Excel.Application");
            Книга = ДокумЭксель.WorkBooks.Open(ПутьКФайлу);      
            Состояние("Подключились к файлу");
        Исключение
            Сообщить("Произошла ошибка при обращение к Excel:" + Символы.ПС + ОписаниеОшибки());
        КонецПопытки;
      
        //если создали объект, тогда его можно открывать
        Если ДокумЭксель <> Неопределено Тогда      
            //Обработаем для реестра договоров
            ЛистДоговоров = Книга.WorkSheets(1);
            //ВсегоКолонок = ЛистДоговоров.Cells(1,1).SpecialCells(11).Column;
            ВсегоСтрок = ЛистДоговоров.Cells(1,1).SpecialCells(11).Row;
            ЗначениеЯчейки = ЛистДоговоров.Cells(8,8).Value;
            Сообщить(ЗначениеЯчейки);
        КонецЕсли;
    Вроде все должно наботать, но нифига не работает, голову всю сломал.
    Вот открываю книгу, смотрю по адресу - 8,8 - значение стоит, но почему-то не выводит :(
  2. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Ну а что возвращает?
    ЛистДоговоров.Cells(8,8).Value

    У мелкософта нет изголения что листы с 0 нумеруются?
    Книга.WorkSheets(1);
  3. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.574
    Симпатии:
    717
    Баллы:
    204
    Чего происходит-то? Если Excel не запустился по каким-то причинам, то что будет?
    alexburn нравится это.
  4. TopicStarter Overlay
    alexburn
    Online

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.781
    Симпатии:
    509
    Баллы:
    204
    ЛистДоговоров.Cells(8,8).Value вообще ничего не возвращает :(
    Такое ощущение что не может получить значение, потому что Если ДокумЭксель <> Неопределено условие не отрабатывается и в код вообще не заходит. Брееееед
    --- Объединение сообщений, 10 авг 2015 ---
    Когда файл выбираю для обработки, процесс экселевский уже работает. че за ххххх
    --- Объединение сообщений, 10 авг 2015 ---
    Бред короче этот эксель на сервере, пойду скриптом обработаю
    Последнее редактирование: 10 авг 2015
  5. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.574
    Симпатии:
    717
    Баллы:
    204
    Если обработка завершилась с ошибкой, EXCEL продолжит болтаться в виде процесса, его килять вручную надо.

    После
    Книга = ДокумЭксель.WorkBooks.Open(ПутьКФайлу);

    Книга <> Неопределено?
    alexburn нравится это.
  6. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Во первых напиши в конце

    ДокумЭксель = Неопределено;

    Потому что у тебя не рвёт ком соединение после обработки...

    Второе, у тебя ячейка 8,8 это не объединение?
    alexburn нравится это.
  7. TopicStarter Overlay
    alexburn
    Online

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.781
    Симпатии:
    509
    Баллы:
    204
    ДокумЭксель.Application.Quit();
    вставлял перед выходом из процедуры, так что соединение в любом случае должен рвать
    8.8 - нее, не объединение
    --- Объединение сообщений, 10 авг 2015 ---
    Я вот думаю может версия экселя влияет :(
  8. kisol
    Online

    kisol Профессионал в 1С

    Регистрация:
    25 июл 2012
    Сообщения:
    395
    Симпатии:
    41
    Баллы:
    54
    Код:
    COMОбъект = ПолучитьCOMОбъект(ПутьКФайлу);
        РабочийЛист = COMОбъект.ActiveSheet; //вот это нужно указать
        Лист = РабочийЛист.Cells;
      
     
        Переменная = Лист.Cells(8,8).Value;
        сообщить(Переменная);
    
    После открытия файла гаси ексель через диспетчер или программно.


    http://i.imgur.com/ZMah6RV.png[​IMG]
  9. TopicStarter Overlay
    alexburn
    Online

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.781
    Симпатии:
    509
    Баллы:
    204
    ПолучитьCOMОбъект - не прокатывает. Нужно НОВЫЙ ()
  10. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Если на сервере доступно "ADODB" то можно через него, в этом случае работаем как с таблицей SQL
    alexburn нравится это.
  11. TopicStarter Overlay
    alexburn
    Online

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.781
    Симпатии:
    509
    Баллы:
    204
    Для меня это пока что темный лес :)
  12. kisol
    Online

    kisol Профессионал в 1С

    Регистрация:
    25 июл 2012
    Сообщения:
    395
    Симпатии:
    41
    Баллы:
    54
    И так и так работает.
    По мне нет никакой разницы ибо ком все равно узнает что это ексель и его запустит.
    [​IMG]
    alexburn нравится это.
  13. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Если совсем плохо то можно попытаться создавать xls без подключения библиотек (кто то делал для реализаций задач по рассылкам файликов xls под Linux-ами), общие сведения от MS
    --- Объединение сообщений, 10 авг 2015 ---
    кстати, xlsx - вообще архив xml-ок ;)
    alexburn нравится это.
  14. Speaker1982
    Offline

    Speaker1982 Опытный в 1С

    Регистрация:
    12 май 2011
    Сообщения:
    223
    Симпатии:
    5
    Баллы:
    29
    Давай дам кусочек своего работающего кода :)
    Код:
    перем АдресВовременномХранилище;
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл";
    Диалог.ПолноеИмяФайла = "";
    Фильтр = "Excel (*.xls)|*.xls";
    Диалог.Фильтр = Фильтр;
    Диалог.МножественныйВыбор = Ложь;
    Если Диалог.Выбрать() Тогда
        Файл = Диалог.ПолноеИмяФайла;
    КонецЕсли;
    .....
    ИмяФайла = "C:\Users\USR1CV82\TMP\1.xls";
    ПоместитьФайл(АдресВовременномХранилище, Файл, , Ложь);
    
    Файлик   = ПолучитьИзВременногоХранилища(Адрес);
    Файлик.Записать(ИмяФайла);
    Попытка
        Excel      = Новый COMОбъект("Excel.Application");
        WB         = Excel.Workbooks.Open(ИмяФайла);
    Исключение
        Excel.Application.Quit();
        Возврат 0;
    КонецПопытки;   
    // 2) Вычисляем количество листов в файле перебираем их
    КолвоЛистов = WB.Sheets.Count;
    Для НомерЛиста = 1 По КолвоЛистов Цикл
    ExcelЛист = WB.Sheets(НомерЛиста); 
    xlCellTypeLastCell = 11;
    ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;
    ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;
    
    Для индекс = 7 По ExcelПоследняяКолонка Цикл
        Если  ExcelЛист.Cells(Строка, индекс).Value = "Дозаказ в фасовках" Тогда   
            Прервать;   
        КонецЕсли;   
        СписокПодразделений.Добавить(ExcelЛист.Cells(Строка, индекс).Value, индекс);
        //Сообщить (ExcelЛист.Cells(Строка, индекс).Value);
    КонецЦикла;
           
    // 4) заполняем таблицу значений уже со строки 3
    Для Строка = 3 По ExcelПоследняяСтрока-1 Цикл
    //Стр = Таблица.Добавить();
    //Стр.Товар = ExcelЛист.Cells(Строка, 3).Value;
        Для каждого элемент из СписокПодразделений Цикл
        //    Сообщить (ExcelЛист.Cells(Строка, Число(элемент.Представление)).Value);
        Если Число(ExcelЛист.Cells(Строка, Число(элемент.Представление)).Value) <> 0 Тогда
            Стр = Таблица.Добавить();
    
    alexburn нравится это.
  15. Yuriy_Alexandrovich
    Offline

    Yuriy_Alexandrovich Профессионал в 1С Команда форума

    Регистрация:
    15 сен 2011
    Сообщения:
    1.275
    Симпатии:
    76
    Баллы:
    54
    Забей в поисковике "Загрузка из Excel в 1С 8 c помощью стандартного провайдера Windows - Microsoft Jet OLEDB", там по ссылкам аж с примерами
    alexburn нравится это.
  16. TopicStarter Overlay
    alexburn
    Online

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.781
    Симпатии:
    509
    Баллы:
    204
    Там пару литров нужно, чтоб разобраться что к чему :)
  17. Draco
    Offline

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    А если сразу к типу нужному приобразовывать типа
    ЗначениеЯчейки = Строка(ЛистДоговоров.Cells(8,8).Value);

    Просто 1С не всегда понимает что из экселя возвращается
    --- Объединение сообщений, 10 авг 2015 ---
    просто у меня не всегда вот этот кусок кода без преобразования работал

    Код:
     Пока ExcelЛист.Cells(Строка, КолонкаНачала).Value <> Неопределено Цикл
    
        // Обработка нажатия Ctrl + Break
        ОбработкаПрерыванияПользователя();
    
        // Добавить данные в табличную часть экранной формы
        Попытка
            //Номенклатура=Справочники.Номенклатура.НайтиПоКоду(Строка(ExcelЛист.Cells(Строка, КолонкаНачала).Value));
            если ПоКоду Тогда
            Номенклатура=Справочники.Номенклатура.НайтиПоКоду(Строка(ExcelЛист.Cells(Строка, КолонкаНачала).Value));
            иначе
            Номенклатура=Справочники.Номенклатура.НайтиПоНаименованию(Строка(ExcelЛист.Cells(Строка, КолонкаНачала).Value));
            Конецесли;
        Если Номенклатура<>Справочники.Номенклатура.ПустаяСсылка()Тогда
            ДобавитьСвойство(Номенклатура,Справочники.ЗначенияСвойствОбъектов.НайтиПоКоду(Строка(ExcelЛист.Cells(Строка, КолонкаСвойства).Value))); 
        КонецЕсли;
        Исключение
          // Не редко происходит ошибка конвертации отдельной ячейки документа
          Сообщить("Ошибка чтения строки файла Microsoft Excel." + Строка + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
        КонецПопытки;
        // Отобразить информацию о ходе выполнения обработки
        Состояние("Обработка файла Microsoft Excel : "
          + "строка " + Строка + " из " + ExcelПоследняяСтрока);
         Строка=Строка+1;
      КонецЦикла;
    
  18. TopicStarter Overlay
    alexburn
    Online

    alexburn Модераторы Команда форума Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    14.781
    Симпатии:
    509
    Баллы:
    204
    Накатал скриптом :)

Поделиться этой страницей