[ExcelEditor] Чтение/запись файла Excel напрямую из 1С без Excel (формат 97/2003)

Чтение и запись файла Excel напрямую из 1С

Компонента читает и редактирует напрямую файл Excel без загрузки самого Excel (формат Microsoft Office 97/2003)

В продолжение развития проекта чтения из Excel «напрямую» //infostart.ru/projects/621/

*** Для работы компоненты потребуется установленный Microsoft .NET Framework 2.0, который можно скачать отсюда.

Чтобы зарегистрировать компоненту в Windows — запустить reg.bat
или использовать совместно с хранилищем внешних компонент.

ПОДКЛЮЧЕНИЕ КОМПОНЕНТЫ В 1С:

  ИмяВК="AddIn.ExcelEditor";

Попытка
ПодключитьВнешнююКомпоненту(ИмяВК);
Исключение
Предупреждение("Не удалось подключить компоненту " + ИмяВК);
КонецПопытки;

Попытка
Экзель = Новый(ИмяВК);
Исключение
Предупреждение("Ошибка создания объекта внешней компоненты: " + ИмяВК);
КонецПопытки;

*** Методы:

//ОТКРЫТИЕ ФАЙЛА:
Экзель.ОткрытьФайл(Файл); // возвращает значение типа булево;

//ПОЛУЧЕНИЕ КОЛИЧЕСТВА ЛИСТОВ
КоличествоЛистов = Экзель.ПолучитьКоличествоЛистов();

//ОТКРЫТИЕ ЛИСТА
Экзель.ОткрытьЛист(НомерЛиста); // возвращает значение типа булево;

//ПОЛУЧЕНИЕ КОЛИЧЕСТВА КОЛОНОК
КоличествоКолонок = Экзель.ПолучитьКоличествоКолонок();

//ПОЛУЧЕНИЕ КОЛИЧЕСТВА СТРОК
КоличествоСтрок = Экзель.ПолучитьКоличествоСтрок();

//ПОЛУЧЕНИЕ ЗНАЧЕНИЯ ЯЧЕЙКИ
ЗначениеЯчейки = Экзель.ПолучитьЗначениеЯчейки(НомерСтроки, НомерКолонки);

//ПОЛУЧЕНИЕ ЗНАЧЕНИЯ ЯЧЕЙКИ В ФОРМАТЕ ДАТА
ЗначениеЯчейки = Экзель.ПолучитьЗначениеЯчейкиДата(НомерСтроки, НомерКолонки);

//ОЧИСТКА ПАМЯТИ
Экзель.Выполнено();

//ДОБАВИТЬ ЛИСТ
Экзель.ДобавитьЛист(ИмяЛиста);

//РЕДАКТИРОВАТЬ ЯЧЕЙКУ
Экзель.РедактироватьЗначениеЯчейки(Строка, Колонка, Значение);

//РЕДАКТИРОВАТЬ ЯЧЕЙКУ С ФОРМАТИРОВАНИЕМ
Экзель.РедактироватьЗначениеЯчейкиСФорматированием(Строка, Колонка, Значение, СтрокаФорматирования);

//РЕДАКТИРОВАТЬ ШИРИНУ КОЛОНКИ
Экзель.РедактироватьШиринуКолонки(СКолонки, ПоКолонку, Ширина);

//ЗАПИСАТЬ
Экзель.СохранитьФайл(ПутьКФайлу);

//ПОИСК ЯЧЕЙКИ:
Экзель.НайтиЯчейку(ЗначениеЯчейки, НомерНачальнойСтроки);
//возвращает пустую строку, если не найдено или  номер строки и номер колонки через запятую, если найдена.

88 Comments

  1. Душелов

    Оптимизировано чтение, в примере добавлен пример формирования файла «с нуля».

    Reply
  2. MrDen

    Упрощает работу. Сам же ADO использую и листы перебирает, и открывает, и грузит быстро. Есть конечно ньансы но и их можно учесть

    Reply
  3. Душелов

    (2) на счет скоростей стоит почитать комменты к первой разработке, там в свое время народ занимался расчетом времени работы.

    Reply
  4. MrDen

    (3) в сравнении с Excel.Application 🙂 конечно от которого пришлось отказаться при чтении более 32000 строк

    Reply
  5. jem

    Вот бы еще при выделении строк колонки, где-нибудь суммировались значения. Мелочь, но приятно. )

    Reply
  6. Душелов

    (5) Где? В примере? В табличном документе? Так все в ваших руках! 🙂

    Reply
  7. lord_papa

    (1) >добавлен пример формирования файла «с нуля».

    Очень хотелось бы, чтобы Экзель мог читать + редактировать и сохранять. Набрал:

    Рез = Экзель.ОткрытьФайл(«c: est.xls»);

    Рез = Экзель.ОткрытьЛист(1);

    Экзель.РедактироватьЗначениеЯчейки(0, 1, 777);

    Экзель.СохранитьФайл(«c: est.xls»);

    ЗапуститьПриложение(«c: est.xls»);

    Выдает

    ExcelEditor : Значение не может быть неопределенным.

    Имя параметра: key.

    Подскажи плииз, что не так

    З.Ы. Клиент присылает прайс.xls, читаю Экзелом, а хотелось бы подправить этот же и сохранить

    Reply
  8. Душелов

    (7) Исходников под рукой сейчас нет. Вечером тогда обновление залью.

    Reply
  9. shard

    (4) — насчет времени чтения таких объемов: чтение файла 16000 строк 30 столбцов (8,5мб) из восьмерки через CSA массив — 10 секунд на средней машине….

    Reply
  10. Душелов

    CSA массив — это что?

    Reply
  11. MrDen

    (10) — Color Space Array — Массив цветового пространства может это?

    Reply
  12. MadKlop

    Как установить сие чудо в Висту? 🙂

    Reply
  13. Душелов

    (12) А что не так с вистой?

    Reply
  14. MadKlop

    ругается на параметр /codebase говорит что устанавливаемый компонент не подписан, задайте постоянное имя и повторите попытку, пришлось выгрузить ключи реестра из ХР и влить в Висту 🙂

    Reply
  15. MadKlop

    так что к бат файлу лучше еще рег файлы прикрепить для висты, или «задать постоянное имя…» 🙂

    Reply
  16. Душелов

    (14) Это все нормально. Никакие ключи реестра не нужны.

    Reply
  17. Душелов

    Я подпишу компоненту при следующем обновлении.

    Reply
  18. dma.tmb@mail.ru

    вываливает ошибку при выполнении с файлом в котором ячейки выделены цветом

    ExcelEditor : Image Type Not supported.

    Reply
  19. Душелов

    (18) Пришлите файл мне на vasil(сабака)dushelov.ru

    Reply
  20. dma.tmb@mail.ru

    Изиняюсь, выяснил в файлах с вставленными формулами, файл высылаю!

    Reply
  21. Душелов

    (20) Ругался на картинку на 2 листе (стрелка).

    Reply
  22. Душелов

    Обновил. Файл редактируется, но пока теряется формат ячеек.

    Ковыряю формат дальше…

    Reply
  23. Aloger

    А Microsoft .NET Framework 3.0 или 3.5 для работы компоненты подойдет? Или только 2.0? Какую версию лучше использовать для вашей обратки?

    Reply
  24. Душелов

    (23) Все версии фреймворка поддерживают старые.

    Reply
  25. Aloger

    После установки Microsoft .NET Framework 2.0 и регистрации вашей компоненты при отладке кода с использованием вашей компоненты Конфигуратор и/или Предприятие разукрашивается различными цветами.

    Как установка и регистрация повлияют на работу 1с в клиент-серверном варианте? Какие ошибки или сбои в работе возможны?

    Reply
  26. Душелов

    Никак не влияют.

    Reply
  27. Душелов

    Для получения демо-версии или покупки обращайтесь по контактам, указанным в профиле.

    Reply
  28. diman jah

    нужна функция поиска

    Функция глНайтиВЭксель(range, what, precision = 1, column = 0) Экспорт

    //поиск в ole-excel

    //

    //возвращает число — номер строки в excel, содержащей найденную ячейку

    //или 0, если ничего не найдено

    //

    //range — (ole-объект), область в excel, по которой производится поиск

    //what — (число, строка, или дата), что ищем

    //precision — 0-первое вхождение, 1-равенство what и значения ячейки

    //column — отсюда можно считать номер колонки, с найденной ячейкой

    //

    Попытка

    cell=range.find(what)

    Исключение

    Возврат 0;

    КонецПопытки;

    Если (what = cell.value)ИЛИ(Число(what) = Число(cell.value))ИЛИ(Строка(what) = Строка(cell.value)) Тогда

    Возврат cell.row

    КонецЕсли;;

    Если (ПустоеЗначение(cell) = 0) Тогда

    Если (precision = 0) Тогда

    column = cell.column;

    Возврат cell.row;

    КонецЕсли;

    fstAddress = cell.address;

    Пока (ПустоеЗначение(cell) = 0) Цикл

    cell = range.findNext(cell);

    Если (cell.address = fstAddress) Тогда

    Возврат(0);

    Прервать;

    КонецЕсли;

    Если (what = cell.value)ИЛИ(Число(what) = Число(cell.value))ИЛИ(Строка(what) = Строка(cell.value)) Тогда

    column=cell.column;

    Возврат cell.row;

    Прервать;

    КонецЕсли;

    КонецЦикла;

    КонецЕсли;

    Возврат 0;

    КонецФункции

    Reply
  29. Душелов

    Читаем в ТЗ, добавляем индексы, ищем…

    Reply
  30. Душелов

    Хотя ради интереса замерить скорости можно, искать в 1С-е, или искать в массиве данных в компоненте…

    Reply
  31. Душелов

    Обновил, исправил найденные ошибки при редактировании файла.

    Reply
  32. Душелов

    Добавил:

    ПОИСК ЯЧЕЙКИ:

    Экзель.НайтиЯчейку(ЗначениеЯчейки, НомерНачальнойСтроки); //возвращает пустую строку, если не найдено или номер строки и номер колонки через запятую, если найдена.

    Reply
  33. diman jah

    может сделать по-человечески, аналогично

    ТаблицаЗначений.НайтиЗначение(<Знач>,<Строка>,<Колонка>)

    Возвращает число: 0 — значение не найдено; 1 — значение найдено

    <Строка> — идентификатор переменной, куда возвращается номер найденной строки. Если при вызове метода передать в этот параметр номер строки, то поиск будет осуществляться только по указанной строке.

    аналогично <Колонка>

    Нет смысла искать по всему листу, а потом анализировать то или не то нашлось

    Reply
  34. White__

    а мне нельзя скачать, я рейтингом не вышла :(((

    Reply
  35. mrd2008

    Открытие листа не срабатывает для версии 7.7. Вероятно потому, что значение типа булево нет в 7.7. При выполнении метода выдается сообщение вида:

    Ошибка при выполнении метода объекта компоненты <Неизвестная компонента>

    Это как-то лечится?

    Reply
  36. Ужас бухгалтера

    (35) Have fun, возьми Йоксель: http://yoksel.net.ru/HomePage

    Читает/пишет напрямую файлы Excel. Работает и в 7.7 и в 8.х. Сохраняет форматирование. Конвертирует из XLS в MXL и обратно. Ну и еще кое-что (на сайте все написано)… Для скачивания рейтинг не требует. 🙂

    Reply
  37. Aloger

    При сохранении из 1с создается документ без листов. В него записываются данные.Документ записывается.

    Как получит данные из документа в котором нет листов?

    Reply
  38. Noy

    (37) С чего ты взял что документ без листов?

    -Видишь суслика?

    -Нет.

    -И я не вижу, а он есть!

    (с)ДМБ

    Reply
  39. Aloger

    Вопрос снят.

    Программист поставщика переделал выгрузку данных из 1с в документ Excel.

    1)Записывается документ Excel без листов.

    2)Создается новый документ Excel с листами.

    3)Данные из 1го документа записываются новый.

    4)Новый документ пересылают нам.

    Reply
  40. Aloger

    Василий, вы получили мои письма? Жду ответа.

    Reply
  41. Душелов

    (40) Нет, ничего не было. Было только пустое письмо.

    Сюда ссылку на файл выложите.

    Reply
  42. Aloger
  43. Душелов

    (42) А в чем проблема с ним? Открывается спокойно даже демо-обработкой.

    Reply
  44. faleks

    Aloger

    Проблема решается просто. Открываешь файл в EXEL. Заходишь «Сервис» — «Параметры» закладка «Вид» ставишь галочку «ярлычки листов».

    Reply
  45. faleks

    (42) — 44

    Reply
  46. Душелов

    (45) Ну разговор был, что из компоненты этот файл не читается.

    Reply
  47. Aloger

    Файл читается, а все остальные файлы уже удалили 🙁 . Как только появится такая проблема сообщу.

    Прошу прощения за беспокойство.

    Reply
  48. Aloger

    Нерабочий файл. Помогите, пожалуйста.

    http://slil.ru/27694302

    Reply
  49. Душелов

    (48) Это формат Excel 5/95, а данная компонента только для 97/2003.

    Reply
  50. manan

    с картинками, похоже, не умеет работать?

    Reply
  51. Душелов

    С картинками — нет.

    Reply
  52. fotya

    Здравствуйте!

    Подскажите, пожалуйста, есть ли в обработке возможность обращения к листу по его имени, а не по номеру и НайтиЯчейку в которую есть вхождение значения а не 100% совпадение?

    Reply
  53. Душелов

    (52) По имени — нет. А искать ячейки — выгружаете данные с листа в ТЗ и там уже средствами 1С ищете то, что нужно.

    Reply
  54. ежист

    Как вывести жирным шрифтом?

    Как вывести формулу?

    Reply
  55. Душелов

    (54) Никак

    Reply
  56. ежист

    жалко, без выделения жирным шрифтом — не читабильно для пользователей получается.

    Reply
  57. ежист

    понравилось что работает все очень быстро, жалко из-за оформления отказываться от компоненты!

    Reply
  58. Душелов

    (57) Основная идея компоненты — чтение, и запись для больших объемов данных, при использовании обменов и т.п.. Оформление и прочее — с этим сама 1С справляется.

    Reply
  59. boy13

    (58) вот как раз на больших объемах и загибается… говорит, Exception… OutOfMemory… 🙁

    Reply
  60. SEREGIK

    > Экзель.РедактироватьЗначениеЯчейкиСФорматированием(Строка, Колонка, Значение, > СтрокаФорматирования);

    а как заранее получить эту строку форматирования ?

    Reply
  61. SEREGIK

    и как сделать чтобы не слетало форматирование во всем файле Excel ?

    Reply
  62. Magister

    Вылетает на защищенном файле с ошибкой:

    ExcelEditor : Index was out of range. Must be non-negative and less than the size of the collection.

    Parameter name: index.

    Файл сформирован из 1С через OpenOffice.org 3.1

    Куда можно его выслать?

    Reply
  63. turbomilo@mail.ru

    Кое-что накопал про строку форматирования для:

    «Экзель.РедактироватьЗначениеЯчейкиСФорматированием(Строка, Колонка, Значение, > СтрокаФорматирования);»

    см. здесь — http://www.mvps.org/dmcritchie/excel/colors.htm

    От себя, получилось только изменить цвет шрифта (СтрокаФорматирования=»[magenta]@»), дальше не разобрался нет времени.

    Еще один момент в старых версиях Excel есть функция «GetFormat(cell)» — которая должна показывать строку форматирования для ячейки, кое-что по этому поводу здесь: http://www.mvps.org/dmcritchie/excel/formula.htm#GetFormat.

    Reply
  64. turbomilo@mail.ru

    И еще, в конце концов, я отказался от использования этого модуля для выгрузки в Excel файл, использую ТабличныйДокумент, там с форматированием все проще. Для выгрузки в Excel: ТабличныйДокумент.Записать(ИмяФайлаВФорматеXLS, ТипФайлаТабличногоДокумента.XLS);.

    ———————————————————————————

    1С v8.1

    Reply
  65. cool.vlad4

    (0) Это случаем не Excel Library?

    Reply
  66. reaper2011

    при загрузке файла появляется ошибка (скрин во вложении), что это может быть?

    Reply
  67. Alex1967

    Пример ошибки и решения:

    Server 2003 SP2. Обновлялся с MS автоматом. Стоял Net 2,3,3.1

    При регистрации reg.bat ругался на отсутствие одной из компонент (по памяти пишу).

    Обрабока 1С, использующая ExcelEditor писала

    Ошибка создания внешней компоненты AddIn.ExcelEditor

    Снес все Framework начиная c последнего, установил .Net Framework 2.0 по ссылке в readme.txt,

    отключил Firwall/antivirus и зарегил нормально даже без перегрузки.

    Работает 😀

    Reply
  68. pavlo

    я так понимаю полного форматирования размера х*y ячеек, вставка картинок и формул не пашет таки? 🙁 Вот если бы все это реально было, то реальная замена (а то вон к 2010 подключиться вообще не дает и фиг пойми, пишет: Конфигурация операционной системы не рассчитана на запуск этого приложения, а с 2003 обработка пашет на ура), а вот если бы вообще без екселя все это делать было бы супер 🙁

    Reply
  69. ErrorEd88

    Спасибо за разработку, очень помогла. Только после загрузки данных из Excel файла — запускается новый процесс 1с и жрет память.

    Reply
  70. DiamDiam

    не могу зарегистрировать библиотеку ExcelEditor.dll, ругается «Модуль «ExcelEditor.dll» загружен, но точка входа DllRegisterServer не была найдена. Проверьте что «ExcelEditor.dll» является правильным файлом DLL или OCX и повторите попытку.

    Reply
  71. patronize

    Замечательная компонента, простая и быстрая в использовании , а главное можно теперь обходиться без всяких офисов , единственное что немного расстраивает это обязательность фраемворков , всегда путаю какой именно нужен. А в остальном хтелось бы дальнейшего развития проекта и огромная благодарность автору!

    Reply
  72. dv2008

    очень удачная обработка — использовал уже раз 10, а что до дотнета, так он давно в винду встроен

    Reply
  73. MTA_N

    Все работает отлично, использовали много раз

    Reply
  74. ACE$

    а есть ли возможность вставлять ячейки в книгу?

    Reply
  75. treedo

    Нужно предложить разрабам втулить ее в поставку 1С)

    Reply
  76. chorochol

    после установки компоненты и начала работы выходит сообщение типа «Ключ уже зарегистрирован»

    Reply
  77. chorochol

    хотя до этого компонента не была установлена

    Reply
  78. Yury1001

    не сохраняет 🙁

    в книге test обнаружено содержимое которое не удалось прочитать

    Reply
  79. igor_1c

    да, неплохой вариант работы с Excel

    Reply
  80. _alex1974

    Тестировали на 8.2?

    Почему-то один раз отрабатывает, а при повторном вызове всё завешивает. Хотя вызов Выполнено() есть…

    В 8.1 та же обработка работала абсолютно корректно.

    Reply
  81. yuyu1

    http://www.dushelov.ru

    какая-то недоделанная страничка

    Reply
  82. yuyu1

    вообще, мне не понравилось. Я открыл файл , записал несколько ячеек, закрыл файл — и все форматы в нем обнулились, то бишь нет уже ярко раскрашенных ячеек, объединенные ячейки разъединились и т.п.

    Reply
  83. TimofeySin

    А как COM соединением подключится? а том не надо это делать на сервере. а на сервер ПодключитьВнешнююКомпоненту не работает.

    Reply
  84. SANILLA

    хм, очень интересно, сейчас качну и обязательно попробую 🙂

    Reply
  85. kuza_87

    А если честно, то всё-таки что быстрее? Ваша функция или http://infostart.ru/public/20090/

    Reply
  86. w-divin

    (88) kuza_87, автор, к сожалению, Вам уже не ответит (((

    Reply
  87. etmarket

    Неужели никто не сталкивался с проблемой, что библиотека не читает строки из файла Excel когда в документе отключена функция работы с листами!?

    Reply
  88. Gennadiy83

    Пытаюсь применить пример в 1С 77. Однако при попытке создать объект,

    Экзель = СоздатьОбъект(«AddIn.ExcelEditor»);

    генерируется ошибка: Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует CLSID)

    При подключении компоненты ошибки не возникает. Подскажите как быть?

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *