[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 не будет опубликован. Обязательные поля помечены *