gifts2017

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

Опубликовал Василий Демидов (Душелов) в раздел Программирование - Внешние компоненты

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

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

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


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

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


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

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

*** Методы:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Скачать файлы

Наименование Файл Версия Размер
Версия 1.0.0.2 950
.1235467249 62,47Kb
25.09.09
950
.1235467249 62,47Kb Бесплатно

См. также

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

Комментарии

1. Василий Демидов (Душелов) 08.01.09 02:43
Оптимизировано чтение, в примере добавлен пример формирования файла "с нуля".
2. mrden (MrDen) 08.01.09 23:39
Упрощает работу. Сам же ADO использую и листы перебирает, и открывает, и грузит быстро. Есть конечно ньансы но и их можно учесть
3. Василий Демидов (Душелов) 08.01.09 23:48
(2) на счет скоростей стоит почитать комменты к первой разработке, там в свое время народ занимался расчетом времени работы.
4. mrden (MrDen) 09.01.09 00:16
(3) в сравнении с Excel.Application :-) конечно от которого пришлось отказаться при чтении более 32000 строк
5. Jem (jem) 10.01.09 14:47
Вот бы еще при выделении строк колонки, где-нибудь суммировались значения. Мелочь, но приятно. )
6. Василий Демидов (Душелов) 10.01.09 14:59
(5) Где? В примере? В табличном документе? Так все в ваших руках! :)
7. Владимир (lord_papa) 11.01.09 10:33
(1) >добавлен пример формирования файла "с нуля".
Очень хотелось бы, чтобы Экзель мог читать + редактировать и сохранять. Набрал:
Рез = Экзель.ОткрытьФайл("c:\test.xls");
Рез = Экзель.ОткрытьЛист(1);
Экзель.РедактироватьЗначениеЯчейки(0, 1, 777);
Экзель.СохранитьФайл("c:\test.xls");
ЗапуститьПриложение("c:\test.xls");
Выдает
ExcelEditor : Значение не может быть неопределенным.
Имя параметра: key.

Подскажи плииз, что не так
З.Ы. Клиент присылает прайс.xls, читаю Экзелом, а хотелось бы подправить этот же и сохранить
8. Василий Демидов (Душелов) 11.01.09 10:56
(7) Исходников под рукой сейчас нет. Вечером тогда обновление залью.
9. shard (shard) 13.01.09 13:24
(4) - насчет времени чтения таких объемов: чтение файла 16000 строк 30 столбцов (8,5мб) из восьмерки через CSA массив - 10 секунд на средней машине....
10. Василий Демидов (Душелов) 13.01.09 13:31
11. mrden (MrDen) 13.01.09 13:43
(10) - Color Space Array — Массив цветового пространства может это?
12. Евгений Gjujhtkjd (MadKlop) 14.01.09 10:43
Как установить сие чудо в Висту? :)
13. Василий Демидов (Душелов) 14.01.09 10:46
14. Евгений Gjujhtkjd (MadKlop) 14.01.09 11:56
ругается на параметр /codebase говорит что устанавливаемый компонент не подписан, задайте постоянное имя и повторите попытку, пришлось выгрузить ключи реестра из ХР и влить в Висту :)
15. Евгений Gjujhtkjd (MadKlop) 14.01.09 11:58
так что к бат файлу лучше еще рег файлы прикрепить для висты, или "задать постоянное имя..." :)
16. Василий Демидов (Душелов) 14.01.09 12:06
(14) Это все нормально. Никакие ключи реестра не нужны.
17. Василий Демидов (Душелов) 14.01.09 12:06
Я подпишу компоненту при следующем обновлении.
18. Root (dma.tmb@mail.ru) 15.01.09 14:13
вываливает ошибку при выполнении с файлом в котором ячейки выделены цветом
ExcelEditor : Image Type Not supported.
19. Василий Демидов (Душелов) 15.01.09 14:18
(18) Пришлите файл мне на vasil(сабака)dushelov.ru
20. Root (dma.tmb@mail.ru) 15.01.09 17:31
Изиняюсь, выяснил в файлах с вставленными формулами, файл высылаю!
21. Василий Демидов (Душелов) 15.01.09 20:09
(20) Ругался на картинку на 2 листе (стрелка).
22. Василий Демидов (Душелов) 15.01.09 22:15
Обновил. Файл редактируется, но пока теряется формат ячеек.
Ковыряю формат дальше...
lord_papa; +1 Ответить
23. Анатолий (Aloger) 21.01.09 09:51
А Microsoft .NET Framework 3.0 или 3.5 для работы компоненты подойдет? Или только 2.0? Какую версию лучше использовать для вашей обратки?
24. Василий Демидов (Душелов) 21.01.09 10:12
(23) Все версии фреймворка поддерживают старые.
25. Анатолий (Aloger) 22.01.09 07:03
После установки Microsoft .NET Framework 2.0 и регистрации вашей компоненты при отладке кода с использованием вашей компоненты Конфигуратор и/или Предприятие разукрашивается различными цветами.
Как установка и регистрация повлияют на работу 1с в клиент-серверном варианте? Какие ошибки или сбои в работе возможны?
26. Василий Демидов (Душелов) 22.01.09 09:08
27. Василий Демидов (Душелов) 13.02.09 19:34
Для получения демо-версии или покупки обращайтесь по контактам, указанным в профиле.
28. Дмитрий Ях (diman jah) 18.02.09 22:04
нужна функция поиска
Функция глНайтиВЭксель(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;
КонецФункции
29. Василий Демидов (Душелов) 18.02.09 22:07
Читаем в ТЗ, добавляем индексы, ищем...
30. Василий Демидов (Душелов) 18.02.09 22:11
Хотя ради интереса замерить скорости можно, искать в 1С-е, или искать в массиве данных в компоненте...
31. Василий Демидов (Душелов) 24.02.09 12:21
Обновил, исправил найденные ошибки при редактировании файла.
32. Василий Демидов (Душелов) 24.02.09 12:59
Добавил:

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

Экзель.НайтиЯчейку(ЗначениеЯчейки, НомерНачальнойСтроки); //возвращает пустую строку, если не найдено или номер строки и номер колонки через запятую, если найдена.
33. Дмитрий Ях (diman jah) 25.02.09 23:16
может сделать по-человечески, аналогично
ТаблицаЗначений.НайтиЗначение(<Знач>,<Строка>,<Колонка>)
Возвращает число: 0 - значение не найдено; 1 - значение найдено
<Строка> - идентификатор переменной, куда возвращается номер найденной строки. Если при вызове метода передать в этот параметр номер строки, то поиск будет осуществляться только по указанной строке.
аналогично <Колонка>

Нет смысла искать по всему листу, а потом анализировать то или не то нашлось
34. White (White__) 18.03.09 22:25
а мне нельзя скачать, я рейтингом не вышла :(((
35. Руслан (mrd2008) 29.03.09 10:40
Открытие листа не срабатывает для версии 7.7. Вероятно потому, что значение типа булево нет в 7.7. При выполнении метода выдается сообщение вида:
Ошибка при выполнении метода объекта компоненты <Неизвестная компонента>
Это как-то лечится?
36. Ужас бухгалтера (Ужас бухгалтера) 29.03.09 11:11
(35) Have fun, возьми Йоксель: http://yoksel.net.ru/HomePage
Читает/пишет напрямую файлы Excel. Работает и в 7.7 и в 8.х. Сохраняет форматирование. Конвертирует из XLS в MXL и обратно. Ну и еще кое-что (на сайте все написано)... Для скачивания рейтинг не требует. :)
37. Анатолий (Aloger) 28.04.09 07:49
При сохранении из 1с создается документ без листов. В него записываются данные.Документ записывается.

Как получит данные из документа в котором нет листов?
38. Алексей Плутенко (Noy) 28.04.09 12:04
(37) С чего ты взял что документ без листов?

-Видишь суслика?
-Нет.
-И я не вижу, а он есть!
(с)ДМБ
39. Анатолий (Aloger) 29.04.09 06:27
Вопрос снят.

Программист поставщика переделал выгрузку данных из 1с в документ Excel.
1)Записывается документ Excel без листов.
2)Создается новый документ Excel с листами.
3)Данные из 1го документа записываются новый.
4)Новый документ пересылают нам.
40. Анатолий (Aloger) 20.05.09 05:21
Василий, вы получили мои письма? Жду ответа.
41. Василий Демидов (Душелов) 20.05.09 09:12
(40) Нет, ничего не было. Было только пустое письмо.
Сюда ссылку на файл выложите.
43. Василий Демидов (Душелов) 21.05.09 09:24
(42) А в чем проблема с ним? Открывается спокойно даже демо-обработкой.
44. Aleks Федоров (faleks) 21.05.09 09:39
Aloger
Проблема решается просто. Открываешь файл в EXEL. Заходишь «Сервис» - «Параметры» закладка «Вид» ставишь галочку «ярлычки листов».
45. Aleks Федоров (faleks) 21.05.09 10:11
46. Василий Демидов (Душелов) 21.05.09 10:13
(45) Ну разговор был, что из компоненты этот файл не читается.
47. Анатолий (Aloger) 25.05.09 05:18
Файл читается, а все остальные файлы уже удалили :( . Как только появится такая проблема сообщу.
Прошу прощения за беспокойство.
48. Анатолий (Aloger) 26.05.09 11:57
Нерабочий файл. Помогите, пожалуйста.
http://slil.ru/27694302
49. Василий Демидов (Душелов) 26.05.09 15:07
(48) Это формат Excel 5/95, а данная компонента только для 97/2003.
50. Вадим Мананников (manan) 27.07.09 23:07
с картинками, похоже, не умеет работать?
51. dushelov (Душелов) 30.07.09 11:44
52. Sv MN (fotya) 03.09.09 12:20
Здравствуйте!
Подскажите, пожалуйста, есть ли в обработке возможность обращения к листу по его имени, а не по номеру и НайтиЯчейку в которую есть вхождение значения а не 100% совпадение?
53. dushelov (Душелов) 03.09.09 12:22
(52) По имени - нет. А искать ячейки - выгружаете данные с листа в ТЗ и там уже средствами 1С ищете то, что нужно.
54. ежист (ежист) 28.12.09 09:28
Как вывести жирным шрифтом?
Как вывести формулу?
maksa2005; serega7; +2 Ответить 1
55. dushelov (Душелов) 28.12.09 09:34
56. ежист (ежист) 28.12.09 10:33
жалко, без выделения жирным шрифтом - не читабильно для пользователей получается.
57. ежист (ежист) 28.12.09 10:35
понравилось что работает все очень быстро, жалко из-за оформления отказываться от компоненты!
58. dushelov (Душелов) 28.12.09 10:44
(57) Основная идея компоненты - чтение, и запись для больших объемов данных, при использовании обменов и т.п.. Оформление и прочее - с этим сама 1С справляется.
59. Вячеслав Н. Бойко (boy13) 15.02.10 12:46
(58) вот как раз на больших объемах и загибается... говорит, Exception... OutOfMemory... :(
60. Сергей Калуцкий (SEREGIK) 13.04.10 17:01
> Экзель.РедактироватьЗначениеЯчейкиСФорматированием(Строка, Колонка, Значение, > СтрокаФорматирования);

а как заранее получить эту строку форматирования ?
61. Сергей Калуцкий (SEREGIK) 14.04.10 10:23
и как сделать чтобы не слетало форматирование во всем файле Excel ?
62. Misha ⁠ (Magister) 05.08.10 17:11
Вылетает на защищенном файле с ошибкой:
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
Куда можно его выслать?
63. Morpheus (turbomilo@mail.ru) 10.09.10 10:45
Кое-что накопал про строку форматирования для:
"Экзель.РедактироватьЗначениеЯчейкиСФорматированием(Строка, Колонка, Значение, > СтрокаФорматирования);"
см. здесь - http://www.mvps.org/dmcritchie/excel/colors.htm
От себя, получилось только изменить цвет шрифта (СтрокаФорматирования="[magenta]@"), дальше не разобрался нет времени.
Еще один момент в старых версиях Excel есть функция "GetFormat(cell)" - которая должна показывать строку форматирования для ячейки, кое-что по этому поводу здесь: http://www.mvps.org/dmcritchie/excel/formula.htm#GetFormat.
64. Morpheus (turbomilo@mail.ru) 10.09.10 10:51
И еще, в конце концов, я отказался от использования этого модуля для выгрузки в Excel файл, использую ТабличныйДокумент, там с форматированием все проще. Для выгрузки в Excel: ТабличныйДокумент.Записать(ИмяФайлаВФорматеXLS, ТипФайлаТабличногоДокумента.XLS);.
---------------------------------------------------------------------------------
1С v8.1
65. Eugeneer (Eugeneer) 10.02.11 13:22
Чота на винд 2007 не хочет работать. Не подключена и все. Регил все как положено.
66. Eugeneer (Eugeneer) 10.02.11 13:41
Значит что выдает при регистрации на винде7
RA0000 Не удалось найти входную сборку ....
На серваке с финдой 2003 -64 регится но тоже не работает.
Все делается с правами дамина.
67. Ийон Тихий (cool.vlad4) 10.02.11 13:55
(0) Это случаем не Excel Library?
68. Eugeneer (Eugeneer) 23.03.11 17:43
Как все таки победить ошибку в (66) ?
69. Михаил Жулёв (reaper2011) 23.03.11 20:47
при загрузке файла появляется ошибка (скрин во вложении), что это может быть?
Прикрепленные файлы:
70. Александр (Alex1967) 18.05.11 16:24
Пример ошибки и решения:
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 и зарегил нормально даже без перегрузки.

Работает :D
71. Pavlo (pavlo) 18.08.11 10:36
я так понимаю полного форматирования размера х*y ячеек, вставка картинок и формул не пашет таки? :( Вот если бы все это реально было, то реальная замена (а то вон к 2010 подключиться вообще не дает и фиг пойми, пишет: Конфигурация операционной системы не рассчитана на запуск этого приложения, а с 2003 обработка пашет на ура), а вот если бы вообще без екселя все это делать было бы супер :(
72. Эдуард Неженцев (ErrorEd88) 08.09.11 14:50
Спасибо за разработку, очень помогла. Только после загрузки данных из Excel файла - запускается новый процесс 1с и жрет память.
73. Наталья Ковалева (DiamDiam) 25.09.11 13:44
не могу зарегистрировать библиотеку ExcelEditor.dll, ругается "Модуль "ExcelEditor.dll" загружен, но точка входа DllRegisterServer не была найдена. Проверьте что "ExcelEditor.dll" является правильным файлом DLL или OCX и повторите попытку.
74. Евгений Украинский (patronize) 28.09.11 10:08
Замечательная компонента, простая и быстрая в использовании , а главное можно теперь обходиться без всяких офисов , единственное что немного расстраивает это обязательность фраемворков , всегда путаю какой именно нужен. А в остальном хтелось бы дальнейшего развития проекта и огромная благодарность автору!
75. Антон (dv2008) 30.09.11 13:26
очень удачная обработка - использовал уже раз 10, а что до дотнета, так он давно в винду встроен
76. Наталья Акулина (MTA_N) 03.10.11 07:55
Все работает отлично, использовали много раз
77. Алексей (ACE$) 30.11.11 16:45
а есть ли возможность вставлять ячейки в книгу?
78. Александр Кияница (treedo) 02.12.11 19:57
Нужно предложить разрабам втулить ее в поставку 1С)
79. Elena Kho (chorochol) 20.01.12 14:45
после установки компоненты и начала работы выходит сообщение типа "Ключ уже зарегистрирован"
80. Elena Kho (chorochol) 20.01.12 14:45
хотя до этого компонента не была установлена
81. Юрий Зайцев (Yury1001) 14.02.12 12:41
не сохраняет :(
в книге test обнаружено содержимое которое не удалось прочитать
82. Igor Александрович (igor_1c) 17.02.12 11:16
да, неплохой вариант работы с Excel
83. Алексей Алексей (_alex1974) 30.05.12 08:22
Тестировали на 8.2?
Почему-то один раз отрабатывает, а при повторном вызове всё завешивает. Хотя вызов Выполнено() есть...
В 8.1 та же обработка работала абсолютно корректно.
84. Taras Shewchenko (yuyu1) 13.08.12 21:58
http://www.dushelov.ru

какая-то недоделанная страничка
85. Taras Shewchenko (yuyu1) 14.08.12 13:48
вообще, мне не понравилось. Я открыл файл , записал несколько ячеек, закрыл файл - и все форматы в нем обнулились, то бишь нет уже ярко раскрашенных ячеек, объединенные ячейки разъединились и т.п.
86. Тимофей Синичкин (TimofeySin) 01.11.12 11:08
А как COM соединением подключится? а том не надо это делать на сервере. а на сервер ПодключитьВнешнююКомпоненту не работает.
87. Александр Лобачёв (SANILLA) 30.09.13 00:44
хм, очень интересно, сейчас качну и обязательно попробую :)
88. Денис Кузнецов (kuza_87) 03.02.14 16:11
А если честно, то всё-таки что быстрее? Ваша функция или http://infostart.ru/public/20090/
89. Дмитрий Елисеев (w-divin) 02.04.14 16:44
(88) kuza_87, автор, к сожалению, Вам уже не ответит (((
90. dimi3o (etmarket) 26.11.14 02:35
Неужели никто не сталкивался с проблемой, что библиотека не читает строки из файла Excel когда в документе отключена функция работы с листами!?
91. Геннадий Поляков (Gennadiy83) 18.10.15 21:45
Пытаюсь применить пример в 1С 77. Однако при попытке создать объект,

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

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

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