8.х Работа с Excel

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

  1. TopicStarter Overlay
    IlyaM
    Offline

    IlyaM

    Регистрация:
    15 дек 2008
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    Здравстуйте, Все! :unsure:

    Два основных вопроса по работе с Excel файлом из 1С.

    1. Как можно наиболее быстро считать файл???

    Лично, я делаю это в цикле, перебирая строки файла пока значение заполнено.
    И соотвественно формирую таблицу значений, добавляя эти строки.
    Но строк 18000 - длительный процесс получается.
    Пока ЗначениеЗаполнено(ЛистИзФайла.Rows(ИндексСтроки).Columns(1).Value) Цикл
    /-/-/-/-/
    КонецЦикла;

    2. Как программно изменить ширину колонок в Excel файле???

    Есть там токое свойство у колонок и ячеек, как Width (ширина), но напрямую это свойство недоступно для записи. Когда я пытаюсь присвоить значение ширины сразу

    ЭксельЛист.Columns(1).Width = 60;

    ничего не выходит.
    Я так понял это нужно каким-то методом менять???

    Буду рад советам и если кто-то, может быть, даже подкинет список основных свойств и методов для работы с Excel... Или скажет, где взять. А не то я в справке по 2003 еще кой-чего нашел. Скупо и на английском... А в 2007 даже интернетная справка ни фига не выдает....

    Всем спасибо!!!!! :smile:
  2. Romik
    Offline

    Romik Опытный в 1С

    Регистрация:
    27 июн 2008
    Сообщения:
    238
    Симпатии:
    0
    Баллы:
    26

    Способов куча!
    1) Хороший способ...сам пользуюсь:)
    Загружаешь внешний файл Excel в ТЧ

    //ЗагрузкаФайла
    ТзТарифы.Очистить();
    db = Новый COMОбъект("ADODB.Connection");
    Rs = Новый COMОбъект("ADODB.RecordSet");

    Попытка
    db.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+ПутьФайлаТарифа+";Extended Properties=""Excel 8.0;HDR=NO; IMEX=1;""";
    db.Open();
    Исключение
    Предупреждение("Невозможно установить соединение");
    КонецПопытки;

    rs.ActiveConnection = db;
    rs.LockType = 2;

    cat=Новый COMОбъект("ADOX.Catalog");
    cat.ActiveConnection=db;

    ТекстЗапроса="
    |SELECT * FROM ["+cat.Tables(0).Name+"]
    |";

    rs.Open(ТекстЗапроса);
    Пока rs.Eof()=0 Цикл

    Строка2 = ТзТарифы.Добавить();
    Строка2.Зона = rs.Fields("F2").Value;
    Строка2.ОбластьЗоны = rs.Fields("F3").Value;
    Строка2.Стоимость = rs.Fields("F5").Value;
    Строка2.Еденица = rs.Fields("F6").Value;
    Строка2.ТипЗоны = rs.Fields("F7").Value;
    Строка2.Код = rs.Fields("F8").Value;
    rs.MoveNext();
    КонецЦикла;
    rs.Close();
    db.Close();
    //конец выгрузки

    1.1) Посмотри Универсальный загрузчик Excel...оттуда можно выдернуть полезное!

    2) Насчёт ширины не знаю не приходилось пользоваться!

    2.2) Я непарился с настройками этих колонок.
    Делал всё через макет в нём же настраивал ширину колонок и всё
    И выводил данные в Excel файл...

    Путь = "C:RN_w"+(НеделяГода(НачДата))+".xls";
    ТабДок.Записать(Путь,ТипФайлаТабличногоДокумента.XLS);

    Вложения:

  3. TopicStarter Overlay
    IlyaM
    Offline

    IlyaM

    Регистрация:
    15 дек 2008
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    Вон оно как.... :smile:
    Ну круто!
    Спасибо! :unsure:
  4. Romik
    Offline

    Romik Опытный в 1С

    Регистрация:
    27 июн 2008
    Сообщения:
    238
    Симпатии:
    0
    Баллы:
    26
    Спасибо надо на кнопочку нажим :vis: ать:)))) :unsure:
  5. LxS
    Offline

    LxS Разработчик

    Регистрация:
    5 апр 2007
    Сообщения:
    680
    Симпатии:
    0
    Баллы:
    26
    Где-то я уже видел эти слова)))
  6. Gmix
    Offline

    Gmix

    Регистрация:
    10 май 2007
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
  7. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Ширину изменить не можете, потому что у объекта CEllS оно (свойство) не доступно для изменения. А для записи доступно свойство ColumnWidth объекта Columns

    С EXCELем вообще лучше освоить запись макросов, и потом смотреть что получается по записи. Вот например макрос, который раздвигает колонку B (2ую)
    Код:
    Sub Макрос1()
    Columns("B:B").ColumnWidth = 16
    End Sub
    
    Соответсвенно в 1Ске вам надо будет написать так

    Код:
    ЛистЕксель.Columns("B:B").ColumnWidth = НоваяШиринаКолонки;
    
    Кстати, чтобы не бегать по таблице, выискивая "хто тут последний" можно считать спешиалкеллс
    Код:
    НомерПоследнейВведеннойСтроки = ЛистЕксель.Cells.SpecialCells(xlLastCell).Row;
    НомерПоследнейВведеннойКолонки = ЛистЕксель.Cells.SpecialCells(xlLastCell).Column;
    
    где xlLastCell - это константа ексель = 11

    Правда это не избавит от необходимости проверки на то, что строка банально не заполнена. (пользователь пропустил пару строк)
    --------------------------------------------------------------------
    Если вам необходимо только читать книгу EXCEL, то рекомендую полазать по инету, и скачать какую нибудь библиотеку по "прямому" чтению ексель файлов (на проклубе 1С были такие). А то много времени тратится на открытие/закрытие EXCEL. Можно конечно читать и как БД через ADO (как показали выше)
  8. TopicStarter Overlay
    IlyaM
    Offline

    IlyaM

    Регистрация:
    15 дек 2008
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    Спасибо всем за ответы и советы... :)))))
    Я уже много фишек выяснил по поводу Эксель.....
    А самый оптимальный для себя способ выяснил своим методом проб и ошибок и выяснением свойств и методов самого Экселя....
    Так вот... Сам процесс чтения данных всех используемых ячеек листа Эксель заключается в одной строке... :)))) МассивыИзЭксель = ЛистИзФайла.UsedRange.Value.Выгрузить();
    Конечно, предварительно создается СомОбъект, получается его свойстово WorkBooks, добавляется в коллекцию книга путем открытия файла Эксель..........
    А потом..... А потом...............
    Достаточно одной строчки, чтобы получить все данные с листа.... В виде массива массивов, каждый из которых будет колонкой листа Эксель....
    А уж теперь крутите их вертите, как хотите.... :))))
    Конечно, делается, обычно все через попытки, в исключениях выводится информация об ошибках...
    Но если честно, и так работало.... :))))

    Эксель = Новый COMОбъект("Excel.Application");
    ЭксельОбъектКниги = Эксель.Workbooks;
    КнигаИзФайла = ЭксельОбъектКниги.Open(ЗагружаемыйФайл);
    ЛистИзФайла = КнигаИзФайла.Worksheets(1);

    МассивыИзЭксель = ЛистИзФайла.UsedRange.Value.Выгрузить();

    П.С.
    Кстати, надо попробовать все в одну строчку зафигачить..... :0))
  9. TopicStarter Overlay
    IlyaM
    Offline

    IlyaM

    Регистрация:
    15 дек 2008
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1

    И да.....
    ЗагружаемыйФайл - это строка полного пути к файлу....
  10. uza
    Offline

    uza 1С, VBA (EXCEL), VB (.NET + WEB)

    Регистрация:
    10 июл 2007
    Сообщения:
    1.845
    Симпатии:
    1
    Баллы:
    29
    Ну можно и еще проще (ИМХО)
    Код:
    НаборЗначений = МойЛист.Range("A1:D5")
    
    (возможно так
    Код:
    НаборЗначений = Новый ...
    
    , ибо тут инициализируется/создается новый объект типа Range), а уж по нему можно бегать и скакать, через теже Cells например.

    А вообще, раз уж надо часто работать с ексель (не только "тупое" чтение, но и запись в него и т.п.) рекомендую почитать какиенибуть книги по этому делу (EXCEL VBA), ну или форумы (примеров простых вещей в сети полно)
  11. TopicStarter Overlay
    IlyaM
    Offline

    IlyaM

    Регистрация:
    15 дек 2008
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    До этого я так и ползал по листу Эксель поячеечно, но этот процесс медлительный... Каждый раз при обращении к ComОбъекту тратится время...
    НаборЗначений = МойЛист.Range("A1:D5")
    Если вот сюда добавить ".Value", то значение будет типа ComSafeArray, для которого есть метод выгрузить(). И уже получится массив массивов, с которыми работать получается гораздо быстрее...
    После этого сам Эксель вообще закрывается... (правда, на деле после метода Quit() он продолжает висеть до окончания всей процедуры, в которой был создан ComОбъект Excel)
    И писал я поначалу сразу в эксель. Теперь же(по совету форумцев) формирую табличный док через макет в том виде, в котором мне нужно. И просто записываю в формате Xls....
    Хотя, не спорю, если работать именно с Эксель при формировании выходных файлов, то можно много вяких фишек понадобавлять, доступных только свойствам и методам самого Эксель
  12. F E A R
    Offline

    F E A R

    Регистрация:
    17 фев 2010
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Скачал Ваш загрузчик. Запустил. Указал путь к файлу. После чего следовал указаниям программы, но споткнулся на участке ОТБОР. Выбрал номенклатуру, а далее в разделе программки "СВЯЗИ" не знаю как именно привязать первый столбец к артиклу, второй столбец с наименованием к наименованию товара в номенклатуре.

    И еще , вы все пишите вечно какой-то код програмный )))
    Куда и в какое окно его вбивать-то?
    А то подобную ернду вижу часто, но х.з. куда именно его вводить нужно?
    Я 1С недавно поставил.
  13. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.647
    Симпатии:
    948
    Баллы:
    204
    f e a r я вам в другой теме ответил. что для вашей задачи по загрузке только артикула и наименования хватит этого.

    Воспользуйтесь типовой обработкой Загрузка данных из табличного документа. Она и на дисках ИТС есть и во всех конфигурациях. Вам ее с головой хватит.
  14. BuhRu
    Offline

    BuhRu Новичок в 1С

    Регистрация:
    25 июн 2010
    Сообщения:
    48
    Симпатии:
    3
    Баллы:
    4
    На любом диске ИТС на самом деле есть такая обработка.
    находиться в разделе «Технологическая поддержка» > «Методическая поддержка 1С:Предприятие 8» > «Универсальные отчеты и обработки» > «Загрузка данных из табличного документа».
    На ИТС за июнь 2010 г. находилась тут :1CIts EXE EXTREPS UNIREPS82 UploadFromTableDocument

    Обработка универсальная, позволяет загружать данные в любые конфигурации на платформе 1С:Предприятие 8, в любые справочники, документы и реестры сведений из файлов формата *.xls, *.mxl, *.txt, *.dbf.

    Обратите внимание, начиная с Февраля 2010 г. на диске ИТС данная обработка запускается только на платформе 1С:Предприятие версии 8.2. Для конфигураций на платформе 8.1 нужна версия обработки размещенной на ИТС до января 2010 включительно.

    Тут можно посмотерть пример, как с помощью этой обработки загрузить справочник номенклатуры с ценами в 1С:Бухгалтерия 8, ред.2.0 из прайс листа в Excel
    http://www.online-ufa.ru/content/articles/...ELEMENT_ID=1049
  15. BuhRu
    Offline

    BuhRu Новичок в 1С

    Регистрация:
    25 июн 2010
    Сообщения:
    48
    Симпатии:
    3
    Баллы:
    4
    А тут есть пример, как с помощью этой обработки в 1С:Управление торговлей 8 загрузить прайс-лист с наименованиями, артикулами, ценами и штрих-кодами
    http://www.online-ufa.ru/content/articles/...ELEMENT_ID=1057

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