Чтение и запись файла Excel напрямую из 1С
Компонента читает и редактирует напрямую файл Excel без загрузки самого Excel (формат Microsoft Office 97/2003)
В продолжение развития проекта чтения из Excel «напрямую» //infostart.ru/projects/621/
*** Для работы компоненты потребуется установленный Microsoft .NET Framework 2.0, который можно скачать отсюда.
Чтобы зарегистрировать компоненту в Windows — запустить reg.bat
или использовать совместно с хранилищем внешних компонент.
ПОДКЛЮЧЕНИЕ КОМПОНЕНТЫ В 1С:
ИмяВК="AddIn.ExcelEditor";
Попытка
ПодключитьВнешнююКомпоненту(ИмяВК);
Исключение
Предупреждение("Не удалось подключить компоненту " + ИмяВК);
КонецПопытки;
Попытка
Экзель = Новый(ИмяВК);
Исключение
Предупреждение("Ошибка создания объекта внешней компоненты: " + ИмяВК);
КонецПопытки;
*** Методы:
//ОТКРЫТИЕ ФАЙЛА:
Экзель.ОткрытьФайл(Файл); // возвращает значение типа булево;
//ПОЛУЧЕНИЕ КОЛИЧЕСТВА ЛИСТОВ
КоличествоЛистов = Экзель.ПолучитьКоличествоЛистов();
//ОТКРЫТИЕ ЛИСТА
Экзель.ОткрытьЛист(НомерЛиста); // возвращает значение типа булево;
//ПОЛУЧЕНИЕ КОЛИЧЕСТВА КОЛОНОК
КоличествоКолонок = Экзель.ПолучитьКоличествоКолонок();
//ПОЛУЧЕНИЕ КОЛИЧЕСТВА СТРОК
КоличествоСтрок = Экзель.ПолучитьКоличествоСтрок();
//ПОЛУЧЕНИЕ ЗНАЧЕНИЯ ЯЧЕЙКИ
ЗначениеЯчейки = Экзель.ПолучитьЗначениеЯчейки(НомерСтроки, НомерКолонки);
//ПОЛУЧЕНИЕ ЗНАЧЕНИЯ ЯЧЕЙКИ В ФОРМАТЕ ДАТА
ЗначениеЯчейки = Экзель.ПолучитьЗначениеЯчейкиДата(НомерСтроки, НомерКолонки);
//ОЧИСТКА ПАМЯТИ
Экзель.Выполнено();
//ДОБАВИТЬ ЛИСТ
Экзель.ДобавитьЛист(ИмяЛиста);
//РЕДАКТИРОВАТЬ ЯЧЕЙКУ
Экзель.РедактироватьЗначениеЯчейки(Строка, Колонка, Значение);
//РЕДАКТИРОВАТЬ ЯЧЕЙКУ С ФОРМАТИРОВАНИЕМ
Экзель.РедактироватьЗначениеЯчейкиСФорматированием(Строка, Колонка, Значение, СтрокаФорматирования);
//РЕДАКТИРОВАТЬ ШИРИНУ КОЛОНКИ
Экзель.РедактироватьШиринуКолонки(СКолонки, ПоКолонку, Ширина);
//ЗАПИСАТЬ
Экзель.СохранитьФайл(ПутьКФайлу);
//ПОИСК ЯЧЕЙКИ:
Экзель.НайтиЯчейку(ЗначениеЯчейки, НомерНачальнойСтроки);
//возвращает пустую строку, если не найдено или номер строки и номер колонки через запятую, если найдена.
Оптимизировано чтение, в примере добавлен пример формирования файла «с нуля».
Упрощает работу. Сам же ADO использую и листы перебирает, и открывает, и грузит быстро. Есть конечно ньансы но и их можно учесть
(2) на счет скоростей стоит почитать комменты к первой разработке, там в свое время народ занимался расчетом времени работы.
(3) в сравнении с Excel.Application 🙂 конечно от которого пришлось отказаться при чтении более 32000 строк
Вот бы еще при выделении строк колонки, где-нибудь суммировались значения. Мелочь, но приятно. )
(5) Где? В примере? В табличном документе? Так все в ваших руках! 🙂
(1) >добавлен пример формирования файла «с нуля».
Очень хотелось бы, чтобы Экзель мог читать + редактировать и сохранять. Набрал:
Рез = Экзель.ОткрытьФайл(«c: est.xls»);
Рез = Экзель.ОткрытьЛист(1);
Экзель.РедактироватьЗначениеЯчейки(0, 1, 777);
Экзель.СохранитьФайл(«c: est.xls»);
ЗапуститьПриложение(«c: est.xls»);
Выдает
ExcelEditor : Значение не может быть неопределенным.
Имя параметра: key.
Подскажи плииз, что не так
З.Ы. Клиент присылает прайс.xls, читаю Экзелом, а хотелось бы подправить этот же и сохранить
(7) Исходников под рукой сейчас нет. Вечером тогда обновление залью.
(4) — насчет времени чтения таких объемов: чтение файла 16000 строк 30 столбцов (8,5мб) из восьмерки через CSA массив — 10 секунд на средней машине….
CSA массив — это что?
(10) — Color Space Array — Массив цветового пространства может это?
Как установить сие чудо в Висту? 🙂
(12) А что не так с вистой?
ругается на параметр /codebase говорит что устанавливаемый компонент не подписан, задайте постоянное имя и повторите попытку, пришлось выгрузить ключи реестра из ХР и влить в Висту 🙂
так что к бат файлу лучше еще рег файлы прикрепить для висты, или «задать постоянное имя…» 🙂
(14) Это все нормально. Никакие ключи реестра не нужны.
Я подпишу компоненту при следующем обновлении.
вываливает ошибку при выполнении с файлом в котором ячейки выделены цветом
ExcelEditor : Image Type Not supported.
(18) Пришлите файл мне на vasil(сабака)dushelov.ru
Изиняюсь, выяснил в файлах с вставленными формулами, файл высылаю!
(20) Ругался на картинку на 2 листе (стрелка).
Обновил. Файл редактируется, но пока теряется формат ячеек.
Ковыряю формат дальше…
А Microsoft .NET Framework 3.0 или 3.5 для работы компоненты подойдет? Или только 2.0? Какую версию лучше использовать для вашей обратки?
(23) Все версии фреймворка поддерживают старые.
После установки Microsoft .NET Framework 2.0 и регистрации вашей компоненты при отладке кода с использованием вашей компоненты Конфигуратор и/или Предприятие разукрашивается различными цветами.
Как установка и регистрация повлияют на работу 1с в клиент-серверном варианте? Какие ошибки или сбои в работе возможны?
Никак не влияют.
Для получения демо-версии или покупки обращайтесь по контактам, указанным в профиле.
нужна функция поиска
Функция глНайтиВЭксель(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;
КонецФункции
Читаем в ТЗ, добавляем индексы, ищем…
Хотя ради интереса замерить скорости можно, искать в 1С-е, или искать в массиве данных в компоненте…
Обновил, исправил найденные ошибки при редактировании файла.
Добавил:
ПОИСК ЯЧЕЙКИ:
Экзель.НайтиЯчейку(ЗначениеЯчейки, НомерНачальнойСтроки); //возвращает пустую строку, если не найдено или номер строки и номер колонки через запятую, если найдена.
может сделать по-человечески, аналогично
ТаблицаЗначений.НайтиЗначение(<Знач>,<Строка>,<Колонка>)
Возвращает число: 0 — значение не найдено; 1 — значение найдено
<Строка> — идентификатор переменной, куда возвращается номер найденной строки. Если при вызове метода передать в этот параметр номер строки, то поиск будет осуществляться только по указанной строке.
аналогично <Колонка>
Нет смысла искать по всему листу, а потом анализировать то или не то нашлось
а мне нельзя скачать, я рейтингом не вышла :(((
Открытие листа не срабатывает для версии 7.7. Вероятно потому, что значение типа булево нет в 7.7. При выполнении метода выдается сообщение вида:
Ошибка при выполнении метода объекта компоненты <Неизвестная компонента>
Это как-то лечится?
(35) Have fun, возьми Йоксель:http://yoksel.net.ru/HomePage
Читает/пишет напрямую файлы Excel. Работает и в 7.7 и в 8.х. Сохраняет форматирование. Конвертирует из XLS в MXL и обратно. Ну и еще кое-что (на сайте все написано)… Для скачивания рейтинг не требует. 🙂
При сохранении из 1с создается документ без листов. В него записываются данные.Документ записывается.
Как получит данные из документа в котором нет листов?
(37) С чего ты взял что документ без листов?
-Видишь суслика?
-Нет.
-И я не вижу, а он есть!
(с)ДМБ
Вопрос снят.
Программист поставщика переделал выгрузку данных из 1с в документ Excel.
1)Записывается документ Excel без листов.
2)Создается новый документ Excel с листами.
3)Данные из 1го документа записываются новый.
4)Новый документ пересылают нам.
Василий, вы получили мои письма? Жду ответа.
(40) Нет, ничего не было. Было только пустое письмо.
Сюда ссылку на файл выложите.
(42) А в чем проблема с ним? Открывается спокойно даже демо-обработкой.
Aloger
Проблема решается просто. Открываешь файл в EXEL. Заходишь «Сервис» — «Параметры» закладка «Вид» ставишь галочку «ярлычки листов».
(42) — 44
(45) Ну разговор был, что из компоненты этот файл не читается.
Файл читается, а все остальные файлы уже удалили 🙁 . Как только появится такая проблема сообщу.
Прошу прощения за беспокойство.
Нерабочий файл. Помогите, пожалуйста.
http://slil.ru/27694302
(48) Это формат Excel 5/95, а данная компонента только для 97/2003.
с картинками, похоже, не умеет работать?
С картинками — нет.
Здравствуйте!
Подскажите, пожалуйста, есть ли в обработке возможность обращения к листу по его имени, а не по номеру и НайтиЯчейку в которую есть вхождение значения а не 100% совпадение?
(52) По имени — нет. А искать ячейки — выгружаете данные с листа в ТЗ и там уже средствами 1С ищете то, что нужно.
Как вывести жирным шрифтом?
Как вывести формулу?
(54) Никак
жалко, без выделения жирным шрифтом — не читабильно для пользователей получается.
понравилось что работает все очень быстро, жалко из-за оформления отказываться от компоненты!
(57) Основная идея компоненты — чтение, и запись для больших объемов данных, при использовании обменов и т.п.. Оформление и прочее — с этим сама 1С справляется.
(58) вот как раз на больших объемах и загибается… говорит, Exception… OutOfMemory… 🙁
> Экзель.РедактироватьЗначениеЯчейкиСФорматированием(Строка, Колонка, Значение, > СтрокаФорматирования);
а как заранее получить эту строку форматирования ?
и как сделать чтобы не слетало форматирование во всем файле Excel ?
Вылетает на защищенном файле с ошибкой:
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
Куда можно его выслать?
Кое-что накопал про строку форматирования для:
http://www.mvps.org/dmcritchie/excel/colors.htm
http://www.mvps.org/dmcritchie/excel/formula.htm#GetFormat .
«Экзель.РедактироватьЗначениеЯчейкиСФорматированием(Строка, Колонка, Значение, > СтрокаФорматирования);»
см. здесь —
От себя, получилось только изменить цвет шрифта (СтрокаФорматирования=»[magenta]@»), дальше не разобрался нет времени.
Еще один момент в старых версиях Excel есть функция «GetFormat(cell)» — которая должна показывать строку форматирования для ячейки, кое-что по этому поводу здесь:
И еще, в конце концов, я отказался от использования этого модуля для выгрузки в Excel файл, использую ТабличныйДокумент, там с форматированием все проще. Для выгрузки в Excel: ТабличныйДокумент.Записать(ИмяФайлаВФорматеXLS, ТипФайлаТабличногоДокумента.XLS);.
———————————————————————————
1С v8.1
(0) Это случаем не Excel Library?
при загрузке файла появляется ошибка (скрин во вложении), что это может быть?
Пример ошибки и решения:
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 и зарегил нормально даже без перегрузки.
Работает 😀
я так понимаю полного форматирования размера х*y ячеек, вставка картинок и формул не пашет таки? 🙁 Вот если бы все это реально было, то реальная замена (а то вон к 2010 подключиться вообще не дает и фиг пойми, пишет: Конфигурация операционной системы не рассчитана на запуск этого приложения, а с 2003 обработка пашет на ура), а вот если бы вообще без екселя все это делать было бы супер 🙁
Спасибо за разработку, очень помогла. Только после загрузки данных из Excel файла — запускается новый процесс 1с и жрет память.
не могу зарегистрировать библиотеку ExcelEditor.dll, ругается «Модуль «ExcelEditor.dll» загружен, но точка входа DllRegisterServer не была найдена. Проверьте что «ExcelEditor.dll» является правильным файлом DLL или OCX и повторите попытку.
Замечательная компонента, простая и быстрая в использовании , а главное можно теперь обходиться без всяких офисов , единственное что немного расстраивает это обязательность фраемворков , всегда путаю какой именно нужен. А в остальном хтелось бы дальнейшего развития проекта и огромная благодарность автору!
очень удачная обработка — использовал уже раз 10, а что до дотнета, так он давно в винду встроен
Все работает отлично, использовали много раз
а есть ли возможность вставлять ячейки в книгу?
Нужно предложить разрабам втулить ее в поставку 1С)
после установки компоненты и начала работы выходит сообщение типа «Ключ уже зарегистрирован»
хотя до этого компонента не была установлена
не сохраняет 🙁
в книге test обнаружено содержимое которое не удалось прочитать
да, неплохой вариант работы с Excel
Тестировали на 8.2?
Почему-то один раз отрабатывает, а при повторном вызове всё завешивает. Хотя вызов Выполнено() есть…
В 8.1 та же обработка работала абсолютно корректно.
какая-то недоделанная страничка
вообще, мне не понравилось. Я открыл файл , записал несколько ячеек, закрыл файл — и все форматы в нем обнулились, то бишь нет уже ярко раскрашенных ячеек, объединенные ячейки разъединились и т.п.
А как COM соединением подключится? а том не надо это делать на сервере. а на сервер ПодключитьВнешнююКомпоненту не работает.
хм, очень интересно, сейчас качну и обязательно попробую 🙂
А если честно, то всё-таки что быстрее? Ваша функция илиhttp://infostart.ru/public/20090/
(88) kuza_87, автор, к сожалению, Вам уже не ответит (((
Неужели никто не сталкивался с проблемой, что библиотека не читает строки из файла Excel когда в документе отключена функция работы с листами!?
Пытаюсь применить пример в 1С 77. Однако при попытке создать объект,
Экзель = СоздатьОбъект(«AddIn.ExcelEditor»);
генерируется ошибка: Ошибка при создании объекта из компоненты <Неизвестная компонента> (отсутствует CLSID)
При подключении компоненты ошибки не возникает. Подскажите как быть?