Чтение/Запись документа Excel 2007 без офиса, без внешних компонент. (с примером для 7.7, 8.1 и 8.2 на управляемых формах)
Интеграция - Загрузка и выгрузка в Excel
Бесплатные
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Узнавайте о новых бесплатных решениях в нашей телеграм-группе Инфостарт БЕСПЛАТНО
| Наименование | Скачано | Бесплатно |
|---|---|---|
|
Обработка для 8.1 и 8.2
.zip 29,08Kb
3427
|
3427 | Скачать бесплатно |
|
Конфигурация для 1С 7.7
.1235567370 37,10Kb
1216
|
1216 | Скачать бесплатно |
Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Написано в ознакомительных целях, по аналогии с //infostart.ru/projects/2365/
Использование (1С 8.x): вставляете обработку в конфигурацию и используете ее методы:
Процедура ОткрытьФайлЭкзекль2007(ПутьКФайлу)
Экзель = Обработки.Excel2007.Создать();
Если НЕ Экзель.ОткрытьФайл(ПутьКФайлу) Тогда
Предупреждение("Файл " + ПутьКФайлу + " не открыт!");
Возврат;
КонецЕсли;
Если НЕ Экзель.ОткрытьЛист(1) Тогда
Предупреждение("Лист 1 не открыт!");
Возврат;
КонецЕсли;
Сообщить("Количество строк: " + Экзель.Лист.Количество());
Сообщить("Количество колонок: " + Экзель.Лист.Колонки.Количество());
КонецПроцедуры
Процедура СоздатьФайлЭкзель2007(ПутьКФайлу)
//заполняем ТЗ
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("К1");
ТЗ.Колонки.Добавить("К2");
Стр = ТЗ.Добавить();
Стр.К1 = "Номенклатура";
Стр.К2 = "Количество";
Стр = ТЗ.Добавить();
Стр.К1 = "Хлеб";
Стр.К2 = 10;
Стр = ТЗ.Добавить();
Стр.К1 = "Мясо";
Стр.К2 = 14;
//сохраняем тз в экзель
Экзель = Обработки.Excel2007.Создать();
Экзель.Лист = ТЗ;
Экзель.Записать(ПутьКФайлу);
КонецПроцедуры
Использование (1С 7.7): добавляете из демо-базы все из глобального модуля в свой, файл шаблона кладете в папку с конфигурацией и используете по примеру:
Процедура ОткрытьФайлЭкзекль2007(ПутьКФайлу)
Если экзель_ОткрытьФайл(ПутьКФайлу) = 0 Тогда
Предупреждение("Файл " + ПутьКФайлу + " не открыт!");
Возврат;
КонецЕсли;
Если экзель_ОткрытьЛист(1) = 0 Тогда
Предупреждение("Лист 1 не открыт!");
Возврат;
КонецЕсли;
Сообщить("Количество строк: " + экзель_Лист.КоличествоСтрок());
Сообщить("Количество колонок: " + экзель_Лист.КоличествоКолонок());
Сообщить("***");
//выведем 1 строку
Для сч = 1 По экзель_Лист.КоличествоКолонок() Цикл
Сообщить(экзель_Лист.ПолучитьЗначение(1, сч));
КонецЦикла;
КонецПроцедуры
//*******************************************
Процедура СоздатьФайлЭкзель2007(ПутьКФайлу)
//заполняем ТЗ
ТЗ = СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("К1");
ТЗ.НоваяКолонка("К2");
ТЗ.НоваяСтрока();
ТЗ.К1 = "Номенклатура";
ТЗ.К2 = "Количество";
ТЗ.НоваяСтрока();
ТЗ.К1 = "Хлеб";
ТЗ.К2 = 10;
ТЗ.НоваяСтрока();
ТЗ.К1 = "Мясо";
ТЗ.К2 = 14;
//сохраняем тз в экзель
экзель_Лист = ТЗ;
Если экзель_Записать(ПутьКФайлу) = 1 Тогда
Сообщить("Создан " + ПутьКФайлу);
ЗапуститьПриложение(ПутьКФайлу);
КонецЕсли;
КонецПроцедуры Вступайте в нашу телеграмм-группу Инфостарт
См. также
Загрузка и выгрузка в Excel Маркетплейсы Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)
Реальный помощник, с помощью которого Вы преобразуете необходимые документы для Wildberries, OZON, ЯндексМаркет, ЛаМода, Мегамаркет, Aliexpress, Детский мир, Магнит Маркет (быв.МагнитЭкспресс), Лемана про, ЭНФАНТА (Акушерство), Летуаль, Твой дом, Золотое Яблоко, Каспи, Авито, Аптеки+, М.Видео,Тинькоф в документы "Отчет комиссионера (агента) о продажах" и другие. Работает в 1С:БП 3.0, 1С:БП 3.0 КОРП, 1С:УТ 11, 1С:УНФ, 1С:ERP.
5490 руб.
12.08.2021 48468 654 71
Загрузка и выгрузка в Excel Маркетплейсы Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Платные (руб)
Обработки загрузки данных о продажах WildBerries предназначены для следующих конфигураций: Бухгалтерия предприятия, редакция 3.0; Управление нашей фирмой, редакция 3.0; Розница, редакция 3.0; Управление торговлей, редакция 11; Управление торговлей, редакция 10.3
6000 руб.
11.12.2019 68059 1163 3
Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Системный администратор Разработчик 1С:Предприятие 8 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)
Загрузка номенклатуры из файлов Excel (xls, xlsx, ods, csv, mxl) в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.
12444 руб.
29.10.2014 237910 777 544
Загрузка и выгрузка в Excel Маркетплейсы Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)
Обработки загрузки данных о продажах Ozon предназначены для следующих конфигураций: Бухгалтерия предприятия, редакция 3.0; Управление нашей фирмой, редакция 3.0; Розница, редакция 3.0; Управление торговлей, редакция 11; Управление торговлей, редакция 10.3
6000 руб.
26.11.2020 51294 865 4
SALE! 30%
Загрузка и выгрузка в Excel Оптовая торговля Бухгалтер Пользователь 1С:Предприятие 8 1С 8.3 1С 8.5 1С:Бухгалтерия 2.0 1С:Бухгалтерия 3.0 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Комплексная автоматизация 1.х 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 10 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)
Загрузка данных из Excel в 1С одним кликом: документы, номенклатура, цены, прайсы и справочники без ручного ввода в УТ, КА, ERP, БП, УНФ и др. Попробуйте демо-версию бесплатно!
8000
7200 руб.
09.11.2016 286212 971 964
SALE! 35%
Загрузка и выгрузка в Excel Учет документов Распознавание документов и образов Бухгалтер Пользователь 1С:Предприятие 8 1С 8.3 1С 8.5 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)
Программа для распознавания сканов или фотографий товарных документов в 1С. Просто выбираете файл (PDF, XML, JPG, DOC, XLS, HTML) и нажимаете кнопку "Распознать и загрузить".
8540
5551 руб.
04.06.2019 128020 384 183
Загрузка и выгрузка в Excel Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Розничная и сетевая торговля (FMCG) Управленческий учет Платные (руб)
Загрузка данных отчета о реализации товаров из сервиса Lamoda «Ламода» для конфигурации: 1С:Бухгалтерия предприятия, редакция 3.0; 1C:Управление торговлей, редакция 11 и 1C:Управление нашей фирмой, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".
6000 руб.
01.03.2021 13440 89 0
Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)
Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 07.10.2026, версия 9.5.0 - 10.9.0)
20740 руб.
20.11.2015 179868 430 401
... жаль что пятьПлюсиков не могу поставить...
воОотВеДь...
всё равно за всё заслуженно....!!! удачи во всём....!!!!
воооот....ведь....
если считать, что работаем на хрюне и выше - то можно юзать встроенный в винды зиповщик
2. По поводу форматирования - это уже надо копать в сторону других файлов, отвечающих за оформление. Как я делаю - беру файл, объединяю, к примеру, ячейки, сохраняю и смотрю изменения.
Только небольшая помарочка в Excel2007. Когда пустой путь к файлу и при нажатии на "Открыть" пишет: Преобразование значения к типу Число не может быть выполнено ФайлЛиста = ВременныйКаталог + "\xl\worksheets\sheet" + НомерЛиста + ".xml". Просто не определена переменная "ВременныйКаталог"!
Функция ПрочитатьСписокСтрок(ФайлСтрок)
Строки = Новый СписокЗначений;
хмл = Новый ЧтениеXML;
хмл.ОткрытьФайл(ФайлСтрок);
Пока хмл.Прочитать() Цикл
//Если хмл.ТипУзла = ТипУзлаXML.Текст Тогда // некорректно работает для пустых строк!!!
// Строки.Добавить(хмл.Значение);
//КонецЕсли;
// Spartan - 29.03.2013 - начало
Если хмл.Имя = "t" И хмл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
Если хмл.Прочитать() И хмл.Имя = "#text" Тогда
Строки.Добавить(хмл.Значение);
Иначе
Строки.Добавить("");
КонецЕсли;
КонецЕсли;
// Spartan - 29.03.2013 - конец
КонецЦикла;
хмл.Закрыть();
Возврат Строки;
КонецФункции
Показать(уже встроены багфиксы из (51) )
Процедура ЗаписатьДанныеЛиста(хмл)
ЧислоСтрок = Лист.Количество();
ЧислоКолонок = Лист.Колонки.Количество();
Для иСтр = 0 По ЧислоСтрок - 1 Цикл
хмл.ЗаписатьНачалоЭлемента("row");
хмл.ЗаписатьАтрибут("r", ПолучитьИмяСтроки(иСтр));
хмл.ЗаписатьАтрибут("spans", "1:" + ЧислоВСтроку(ЧислоСтрок)); // вместо хмл.ЗаписатьАтрибут("spans", "1:" + ЧислоСтрок);
Для иКол = 0 По ЧислоКолонок - 1 Цикл
хмл.ЗаписатьНачалоЭлемента("c");
хмл.ЗаписатьАтрибут("r", ПолучитьОбласть(иСтр, иКол));
ЗначЯчейки = Лист.Получить(иСтр).Получить(иКол);
Попытка
А = Число(ЗначЯчейки);
ЭтоЧисло = Истина;
ЗначЯчейки = СтрЗаменить(Формат(А, "ЧРД=."), Символы.НПП, ""); // Артур
Исключение
ЭтоЧисло = Ложь;
КонецПопытки;
Т = ТипЗнч(ЗначЯчейки);
Если НЕ ЭтоЧисло И ТипЗнч(ЗначЯчейки) = Тип("Строка") Тогда
Если НЕ ЗначЯчейки = "" тогда // mozz 30.04.2013 (здесь вываливалось на пустых ячейках)
хмл.ЗаписатьАтрибут("t", "s");
Элем = СписокСтрок.НайтиПоЗначению(ЗначЯчейки);
ЗначЯчейки = СписокСтрок.Индекс(Элем);
КонецЕсли; // mozz 30.04.2013
КонецЕсли;
хмл.ЗаписатьНачалоЭлемента("v");
хмл.ЗаписатьТекст(Строка(ЗначЯчейки));
хмл.ЗаписатьКонецЭлемента();
хмл.ЗаписатьКонецЭлемента();
КонецЦикла;
хмл.ЗаписатьКонецЭлемента();
КонецЦикла;
КонецПроцедуры ПоказатьФункция ПолучитьИмяСтроки(а)
Возврат Формат(а + 1,"ЧГ=");
КонецФункции
но это все не важно )) за идею ++++++++
для ее исправления нужно исправить код модуля
1. завести новую функцию
Функция ЧислоВСтроку(значениеЧисла) // Артур для исключения ошибок открытия файлов
Возврат СокрЛП(Формат(значениеЧисла, "ЧРД=.; ЧГ="));
КонецФункции
2. прописать ее использование
а) хмл.ЗаписатьАтрибут("spans", "1:" + ЧислоВСтроку(ЧислоСтрок)); // вместо хмл.ЗаписатьАтрибут("spans", "1:" + ЧислоСтрок);
б) хмл.ЗаписатьАтрибут("count", ЧислоВСтроку(Строки.Количество())); // Артур вместо //Строка(Строки.Количество())
хмл.ЗаписатьАтрибут("uniqueCount", ЧислоВСтроку(Строки.Количество())); // Артур вместо //Строка(Строки.Количество())
Прикрепил готовый файл для 8.1 с моими правками + дополнения от webstep
{ВнешняяОбработка.Excel2007(63)}: Значение не является значением объектного типа (Строки)
Для сч = 0 По Колонки.Строки.Количество() - 1 Цикл
{ВнешняяОбработка.Excel2007(93)}: Поле объекта не обнаружено (F)
НоваяСтрока[МассивБукв[ИндексСтроки]] = ЗначениеЯчейки;
ADD: Кстати старый код работает нормально и быстро, интересно, новый код быстрей?
{ВнешняяОбработка.Excel2007(266)}: Ошибка при вызове метода контекста (Индекс): Несоответствие типов (параметр номер '1')
ЗначЯчейки = СписокСтрок.Индекс(Элем);
по причине:
Несоответствие типов (параметр номер '1')
{ВнешняяОбработка.Excel2007(266)}: Ошибка при вызове метода контекста (Индекс): Несоответствие типов (параметр номер '1')
ЗначЯчейки = СписокСтрок.Индекс(Элем);
по причине:
Несоответствие типов (параметр номер '1')
1. Выдает ошибки при пустых ячейках. Если ячейка не текст, а большое поле типа Memo.
2. Где то с 283 строки в ячейки начинает подставлять числа, начиная с 1000. и пошел часть ячеек записывает нормально а потом оп и 1001, часть ячеек нормально, 1002 и т д.
Хотя вторая ошибка это возможно результат исправления первой ) Такой я программист )))
Но 2 момента остались:
1. Если есть пустое большое поле, то она выдает ошибку
2. Дата при открытии получается в формате DD.MM. YYYY обрезается. При этом если стр.252: ЗначЯчейки = Лист.Получить(иСтр).Получить(иКол); заменить на ЗначЯчейки = Строка(Лист.Получить(иСтр).Получить(иКол)); то эта ошибка решается. Но появляются другие :)
Не подумайте что я жалуюсь. Идея супер. Буду искать причины и править. Но если кто быстрее меня сообразит, дайте знать. т.к. искать я могу очень долго )))
Функция Excel2007СписокЛистов(ВременныйКаталог);
Листы = НайтиФайлы(ВременныйКаталог + "\xl\worksheets\", "sheet*.xml");
Возврат Листы.Количество();
КонецФункции Там 3 листа, 2-й пустой, в моём варианте они обрабатываются все вместе
//создаем колонки
Колонки = ДеревоДанных.Строки.Найти("cols", "Объект", Истина);
сч = 0;
Для Каждого Стр Из Колонки.Строки Цикл
Если Стр.Объект <> "col" Тогда
Продолжить;
КонецЕсли;
Лист.Колонки.Добавить(МассивБукв[сч]);
сч = сч + 1;
КонецЦикла; Показатьна
//создаем колонки
Колонки = ДеревоДанных.Строки.Найти("dimension", "Объект", Истина);
Счетчик = 0;
Для Каждого Стр Из Колонки.Строки Цикл
Если Стр.Объект = "ref" Тогда
Диапозон = Стр.Значение;
//поиск максимального значения колонки
Счетчик=МассивБукв.Количество();
Пока Счетчик>0 Цикл
Счетчик = Счетчик - 1;
Если Найти(Диапозон, МассивБукв[Счетчик])>0 Тогда
Для Индекс=0 По Счетчик Цикл
Лист.Колонки.Добавить(МассивБукв[Индекс]);
КонецЦикла;
Счетчик = 0;
КонецЕсли;
КонецЦикла;
Прервать;
КонецЕсли;
КонецЦикла;
Показатьтеперь колонки формирует правильно.
удалил
ИндексСтроки = -1;и, ориентируясь на значение в "r", заменил:
ИндексСтроки = ИндексСтроки + 1;на
//поиск колонки
СтрЗначение = Колонка.Строки.Найти("r", "Объект");
Если СтрЗначение <> Неопределено Тогда
ИмяКолонки = СтрЗначение.Значение;
КонецЕсли;
ИндексСтроки = Неопределено;
Счетчик = МассивБукв.Количество();
Пока Счетчик>0 Цикл
Счетчик = Счетчик - 1;
Если Найти(ИмяКолонки, МассивБукв[Счетчик])>0 Тогда
ИндексСтроки = Счетчик;
Счетчик = 0;
КонецЕсли;
КонецЦикла;
......................... Показатьпроблема решена
прошу не пинать ногами - на больших таблицах код может работать медленно, но это уже менять МассивБукв на что-то иное...
и вот еще что... обработка благодаря этому самому массиву букв расчитана на не очень большие таблицы, но я на всякий случай предусмотрел его расширение и на двухбуквенные колонки, поэтому поиск ведется от конца к началу, а не наоборот.
кстати, как здесь можно свой комментарий удалить? вот еще проблема...
Функция ПолучитьЛистEXCEL_XML(ИмяФайлаExcel, НомерЛиста=1) Экспорт
ИмяФайла = СокрЛП(ИмяФайлаExcel);
Если Прав(НРег(ИмяФайла),4)<>".xlsx" Тогда
//ошибка
КонецЕсли;
пФайл = Новый Файл(ИмяФайла);
Если Не пФайл.Существует() Тогда
//ошибка
КонецЕсли;
СписокСтрок = Новый СписокЗначений;
ВременныйКаталог = КаталогВременныхФайлов() + "NightReg";
УдалитьФайлы(ВременныйКаталог);
Зип = Новый ЧтениеZipФайла;
Зип.Открыть(ИмяФайла);
Зип.ИзвлечьВсе(ВременныйКаталог, РежимВосстановленияПутейФайловZIP.Восстанавливать);
ФайлСтрок = ВременныйКаталог + "\xl\sharedStrings.xml";
хмл = Новый ЧтениеXML;
хмл.ОткрытьФайл(ФайлСтрок);
Пока хмл.Прочитать() Цикл
Если хмл.ТипУзла = ТипУзлаXML.Текст Тогда
СписокСтрок.Добавить(хмл.Значение);
КонецЕсли;
КонецЦикла;
хмл.Закрыть();
ФайлЛиста = ВременныйКаталог + "\xl\worksheets\sheet"+НомерЛиста+".xml";
Файл = Новый Файл(ФайлЛиста);
Если НЕ Файл.Существует() Тогда
//ошибка
КонецЕсли;
МассивБукв = Новый Массив;
МассивБукв.Добавить("A");
МассивБукв.Добавить("B");
МассивБукв.Добавить("C");
МассивБукв.Добавить("D");
МассивБукв.Добавить("E");
МассивБукв.Добавить("F");
МассивБукв.Добавить("G");
МассивБукв.Добавить("H");
МассивБукв.Добавить("I");
МассивБукв.Добавить("J");
МассивБукв.Добавить("K");
МассивБукв.Добавить("L");
МассивБукв.Добавить("M");
МассивБукв.Добавить("N");
МассивБукв.Добавить("O");
МассивБукв.Добавить("P");
МассивБукв.Добавить("Q");
МассивБукв.Добавить("R");
МассивБукв.Добавить("S");
МассивБукв.Добавить("T");
МассивБукв.Добавить("U");
МассивБукв.Добавить("V");
МассивБукв.Добавить("W");
МассивБукв.Добавить("X");
МассивБукв.Добавить("Y");
МассивБукв.Добавить("Z");
//здесь можно расширить двухбуквенными значениями
ДеревоДанных = Новый ДеревоЗначений;
ДеревоДанных.Колонки.Добавить("Объект");
ДеревоДанных.Колонки.Добавить("Значение");
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(Файл);
ТекЭлемент = Неопределено;
ТекБаза = Неопределено;
Пока ЧтениеXML.Прочитать() Цикл
Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
РежимЗагрузки = ЧтениеXML.Имя;
Если ТекЭлемент = Неопределено Тогда
ТекЭлемент = ДеревоДанных.Строки.Добавить();
ТекЭлемент.Объект = РежимЗагрузки;
Иначе
ТекЭлемент = ТекЭлемент.Строки.Добавить();
ТекЭлемент.Объект = РежимЗагрузки;
КонецЕсли;
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
Если ТекЭлемент = Неопределено Тогда
ТекЭлемент = Неопределено;
Иначе
ТекЭлемент = ТекЭлемент.Родитель;
КонецЕсли;
ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
ТекЭлемент.Значение = ЧтениеXML.Значение;
КонецЕсли;
Для сч = 0 По ЧтениеXML.КоличествоАтрибутов() - 1 Цикл
Стр = ТекЭлемент.Строки.Добавить();
Стр.Объект = ЧтениеXML.ИмяАтрибута(сч);
Стр.Значение = ЧтениеXML.ЗначениеАтрибута(сч);
КонецЦикла;
КонецЦикла;
ЧтениеXML.Закрыть();
Лист = Новый ТаблицаЗначений;
//создаем колонки
Колонки = ДеревоДанных.Строки.Найти("dimension", "Объект", Истина);
Счетчик = 0;
Для Каждого Стр Из Колонки.Строки Цикл
Если Стр.Объект = "ref" Тогда
Диапазон = Стр.Значение;
//поиск максимального значения колонки
Счетчик=МассивБукв.Количество();
Пока Счетчик>0 Цикл
Счетчик = Счетчик - 1;
Если Найти(Диапазон, МассивБукв[Счетчик])>0 Тогда
Для Индекс=0 По Счетчик Цикл
Лист.Колонки.Добавить(МассивБукв[Индекс]);
КонецЦикла;
Счетчик = 0;
КонецЕсли;
КонецЦикла;
Прервать;
КонецЕсли;
КонецЦикла;
//читаем строки
СтрСтрок = ДеревоДанных.Строки.Найти("sheetData", "Объект", Истина);
Для Каждого Строка Из СтрСтрок.Строки Цикл
НоваяСтрока = Лист.Добавить();
Для Каждого Колонка Из Строка.Строки Цикл
Если Колонка.Объект <> "c" Тогда
Продолжить;
КонецЕсли;
//поиск колонки
СтрЗначение = Колонка.Строки.Найти("r", "Объект");
Если СтрЗначение <> Неопределено Тогда
ИмяКолонки = СтрЗначение.Значение;
КонецЕсли;
ИндексСтроки = Неопределено;
Счетчик = МассивБукв.Количество();
Пока Счетчик>0 Цикл
Счетчик = Счетчик - 1;
Если Найти(ИмяКолонки, МассивБукв[Счетчик])>0 Тогда
ИндексСтроки = Счетчик;
Счетчик = 0;
КонецЕсли;
КонецЦикла;
ЗначениеЯчейки = Неопределено;
СтрЗначение = Колонка.Строки.Найти("v", "Объект");
Если СтрЗначение <> Неопределено Тогда
ЗначениеЯчейки = СтрЗначение.Значение;
КонецЕсли;
СтрЗначение = Колонка.Строки.Найти("t", "Объект");
Если СтрЗначение <> Неопределено И СтрЗначение.Значение = "s" И ЗначениеЯчейки <> Неопределено Тогда
ЗначениеЯчейки = СписокСтрок.Получить(Число(ЗначениеЯчейки)).Значение;
КонецЕсли;
НоваяСтрока[МассивБукв[ИндексСтроки]] = ЗначениеЯчейки;
КонецЦикла;
КонецЦикла;
Возврат Лист;
КонецФункции
ПоказатьЗапись проходит успешно, но при попытке открыть полученный файл в Офис 2007 выдается ошибка о невозможности открытия :(
Проблема в том, что число выгружается в формате через запятую :(
а нужно через точку.
ЗЫ или это зависит от региональных установок? вроде они у меня штатные как для Офиса, так и для 1С
В методе ЗаписатьДанныеЛиста(хмл)
нужно поправить код
Попытка
А = Число(ЗначЯчейки);
ЭтоЧисло = Истина;
Исключение
Попытка
А = Число(ЗначЯчейки);
ЭтоЧисло = Истина;
ЗначЯчейки = СтрЗаменить(Формат(А, "ЧРД=."), Символы.НПП, ""); // Артур
Исключение
ЗЫ кстати, приведенный код решает проблему неверного сохранения чисел более 999, при сохранении в строку в которых появляется неразрывный пробел.
При открытии подобного файла в Офис 2007 также будет ошибка открытия :(
Папка=Шел.namespace(Архив+"\"+Путь);
Архив = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip"
Путь = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\_rels"
Архив+"\"+Путь = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\_rels"
поправил, теперь плохой тип 404
ПутьФайла = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\[Content_Types].xml"
чё к чему не пойму.
Вы пошли тем же путем, что и я.
ПутьФайла = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\[Content_Types].xml"
Здесь нужно добиться, чтобы
ПутьФайла = "
т.е. просто [Content_Types].xml
Постом выше привел код. Понимаю, что уже давно неактуально, но если вдруг на будущее кому-то пригодится.
Потому как идея действительно очень интересная!
НоваяСтрока[МассивБукв[ИндексСтроки]] = ЗначениеЯчейки;
файл (прайс 1С пересохранен в xlsx)
в функции:
Функция ОткрытьЛист(НомерЛиста) Экспорт
найди:
НоваяСтрока[МассивБукв[ИндексСтроки]] = ЗначениеЯчейки;
замени на:
Если Лист.Колонки.Найти(МассивБукв[ИндексСтроки]) = Неопределено тогда
Лист.Колонки.Добавить(МассивБукв[ИндексСтроки]);
КонецЕсли;
НоваяСтрока[МассивБукв[ИндексСтроки]] = ЗначениеЯчейки;
и все взлетит!
Коллеги, сайт автора перестал открываться. Там, как минимум, были полезные разработки.
Есть ли необходимость и возможность сохранения ценных ресурсов в подобных случаях, кроме archive.org?
Отвечайте или здесь, или в личку. Если это важно многим - будем думать, как реализовать.
{Глобальный модуль(365)}: Плохой тип переменной
Ошибка возникает на Windows7, в XP все работает "из коробки".
На 7-ке видимо по-другому работает namespace в javascript.
Вобщем, глубоко не ковырял, ибо нет времени.
Обошел проблему очень тупо, ибо не программист.
Просто "подрезал" местами длинные пути до их нужного значения.
Например, переменная Архив принимает значение X:\Путь_к_БД\Template.zip
а переменная Путь должна принять значение xl\workbook.xml (и не только его, а всю структуру внутри архива). Но в Win7 переменная Путь принимает значение X:\Путь_к_БД\Template.zip\xl\workbook.xml
На выходе получаем Архив+"\"+Путь = X:\Путь_к_БД\Template.zip\X:\Путь_к_БД\Template.zip\xl\workbook.xml
Конечно, это будет "плохой тип переменной" )))
Вот рабочий вариант - просто замените текст функции в глобальном модуле.
//*******************************************
Функция архив_ПросмотрРекурс(Архив,Путь="",Сп)
// Функция просматривает содержимое файла Template.zip
// по всем вложенным папкам,
// и заполняет список путями ко всем файлам и папкам
// Исправляем некорректную работу с путями в Windows7
Если Путь <> "" Тогда
Путь=СтрЗаменить(Путь, Архив,""); // Убираем в переменной путь то, что уже записано в переменной Архив (дублирование)
Если Сред(Путь,1,1)="\" Тогда
Путь=Сред(Путь,2); // Если первым символом в пути является разделитель \, то его тоже уберем
КонецЕсли;
КонецЕсли;
Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Шел=СоздатьОбъект("shell.application");
//Сообщить(Архив+""+Путь);
//Сообщить("Архив: "+Архив);
//Сообщить("Путь: "+Путь);
//Сообщить("-----------------------------------------");
Папка=Шел.namespace(Архив+""+Путь);
Скрипт.AddObject("Папка",Папка);
Вложения=Скрипт.Eval("new Enumerator(Папка.Items())");
Пока Вложения.atEnd(0)=0 Цикл
// Таже беда под Win 7. Будем "резать" длиные пути, используя промежуточную переменную //ПутьДляДобавления
ПутьДляДобавления=СтрЗаменить(Вложения.item(0).path,Архив,"");
Если Сред(ПутьДляДобавления,1,1)="\" Тогда
ПутьДляДобавления=Сред(ПутьДляДобавления,2);
КонецЕсли;
//Сп.ДобавитьЗначение(Вложения.item(0).path);
Сп.ДобавитьЗначение(ПутьДляДобавления);
//Сообщить("Добавлено в список: "+ Строка(Вложения.item(0).path));
Если Вложения.item(0).IsFolder=-1 Тогда
архив_ПросмотрРекурс(Архив,Вложения.item(0).path,Сп);
КонецЕсли;
Вложения.moveNext(0);
КонецЦикла;
КонецФункции
//*******************************************
ПоказатьЕсли, кто из программистов, сделает решение этой проблемы элегантнее - большой респект ему!
А пока вот так, коряво, зато работает!
Надеюсь, кому-то поможет.
Функция экзель_ПрочитатьСписокСтрок(ПутьКФайлу)
Строки = СоздатьОбъект("СписокЗначений");
ТекСтрока="";
xml_ОткрытьФайл(ПутьКФайлу);
Пока xml_Прочитать()=1 Цикл
//будем добавлять строку по тегу /s
//все что внутри тега будем объеденять
Если xml_ИмяТега = "</t>" Тогда
ТекСтрока=ТекСтрока+" "+СокрЛП(xml_Текст);
КонецЕсли;
Если xml_ИмяТега = "</si>" Тогда
Строки.ДобавитьЗначение(ТекСтрока);
ТекСтрока="";
КонецЕсли;
КонецЦикла;
Возврат Строки;
КонецФункции ПоказатьФункция экзель_ОткрытьЛист(НомерЛиста)
ФайлЛиста = экзель_ВременныйКаталог + "xl\worksheets\sheet" + НомерЛиста + ".xml";
Если ФС.СуществуетФайл(ФайлЛиста) = 0 Тогда
Возврат 0;
КонецЕсли;
//КонвертироватьФайл(ФайлЛиста);
xml_ОткрытьФайл(ФайлЛиста);
экзель_Лист = СоздатьОбъект("ТаблицаЗначений");
номСтр = 0;
номКолонка = 0;
Пока xml_Прочитать()=1 Цикл
//Сообщить(xml_ИмяТега);
Если xml_ИмяТега = "<row>" Тогда
номСтр = номСтр + 1;
номКолонка = 0;
экзель_Лист.НоваяСтрока();
ИначеЕсли xml_ИмяТега = "<c>" Тогда
//это вариант когда есть буква, но значение не записано. чтобы не было пропуска
Если (лев(стр,5)="""<c r") и (Найти(стр,"/")<>0) Тогда
номКолонка = номКолонка + 1;
Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
экзель_Лист.НоваяКолонка("К" + номКолонка);
КонецЕсли;
экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, "");
текБуква=xml_СписокАтрибутов.Получить("r");
текБуква=лев(текБуква,1);
теккод=КодСимв(текБуква);
предыдущийКод=теккод;
Продолжить;
конецесли;
//а это вариант когда буква пропущена
//надо сравнивать какая была буква ячейки перед этим и какая сейчас.
//буква должна быть в теге "r"
текБуква=xml_СписокАтрибутов.Получить("r");
текБуква=лев(текБуква,1);
теккод=КодСимв(текБуква);
если теккод=65 Тогда
//буква А. сбрасываем на начало
предыдущийКод=теккод;
иначе
//не буква А. прописываем пропущенные
для сч=предыдущийКод+2 по теккод Цикл
номКолонка = номКолонка + 1;
Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
экзель_Лист.НоваяКолонка("К" + номКолонка);
КонецЕсли;
экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, "");
КонецЦикла;
предыдущийКод=теккод;
КонецЕсли;
//Сообщить(текБуква);
//текущаяБуква=
ТипЯчейки = xml_ПолучитьАтрибут("t");
xml_Прочитать();
Если xml_ИмяТега <> "<v>" Тогда
Продолжить;
КонецЕсли;
xml_Прочитать();
ЗначениеЯчейки = СокрЛП(xml_Текст);
Если ТипЯчейки = "s" Тогда
ЗначениеЯчейки = экзель_СписокСтрок.ПолучитьЗначение(Число(ЗначениеЯчейки) + 1, ЗначениеЯчейки);
КонецЕсли;
номКолонка = номКолонка + 1;
Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
экзель_Лист.НоваяКолонка("К" + номКолонка);
КонецЕсли;
экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, ЗначениеЯчейки);
КонецЕсли;
КонецЦикла;
хз="";
экзель_Лист.ВыбратьСтроку(хз);
Возврат 1;
КонецФункции ПоказатьФункция экзель_ОткрытьЛист(НомерЛиста)
ФайлЛиста = экзель_ВременныйКаталог + "xl\worksheets\sheet" + НомерЛиста + ".xml";
Если ФС.СуществуетФайл(ФайлЛиста) = 0 Тогда
Возврат 0;
КонецЕсли;
//КонвертироватьФайл(ФайлЛиста);
xml_ОткрытьФайл(ФайлЛиста);
экзель_Лист = СоздатьОбъект("ТаблицаЗначений");
номСтр = 0;
номКолонка = 0;
//если пропущена колонка А, то будем прописывать с этой
предыдущийКод=63;
Пока xml_Прочитать()=1 Цикл
//Сообщить(xml_ИмяТега);
Если xml_ИмяТега = "<row>" Тогда
номСтр = номСтр + 1;
номКолонка = 0;
экзель_Лист.НоваяСтрока();
ИначеЕсли xml_ИмяТега = "<c>" Тогда
//это вариант когда есть буква, но значение не записано. чтобы не было пропуска
Если (лев(стр,5)="""<c r") и (Найти(стр,"/")<>0) Тогда
номКолонка = номКолонка + 1;
Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
экзель_Лист.НоваяКолонка("К" + номКолонка);
КонецЕсли;
экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, "");
текБуква=xml_СписокАтрибутов.Получить("r");
текБуква=лев(текБуква,1);
теккод=КодСимв(текБуква);
предыдущийКод=теккод;
Продолжить;
конецесли;
//а это вариант когда буква пропущена
//надо сравнивать какая была буква ячейки перед этим и какая сейчас.
//буква должна быть в теге "r"
текБуква=xml_СписокАтрибутов.Получить("r");
текБуква=лев(текБуква,1);
теккод=КодСимв(текБуква);
если теккод=65 Тогда
//буква А. сбрасываем на начало
предыдущийКод=теккод;
иначе
//не буква А. прописываем пропущенные
для сч=предыдущийКод+2 по теккод Цикл
номКолонка = номКолонка + 1;
Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
экзель_Лист.НоваяКолонка("К" + номКолонка);
КонецЕсли;
экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, "");
КонецЦикла;
предыдущийКод=теккод;
КонецЕсли;
//хз=0;
//экзель_Лист.ВыбратьСтроку(хз);
//Сообщить(текБуква);
//текущаяБуква=
ТипЯчейки = xml_ПолучитьАтрибут("t");
xml_Прочитать();
Если xml_ИмяТега <> "<v>" Тогда
Продолжить;
КонецЕсли;
xml_Прочитать();
ЗначениеЯчейки = СокрЛП(xml_Текст);
Если ТипЯчейки = "s" Тогда
ЗначениеЯчейки = экзель_СписокСтрок.ПолучитьЗначение(Число(ЗначениеЯчейки) + 1, ЗначениеЯчейки);
КонецЕсли;
номКолонка = номКолонка + 1;
Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
экзель_Лист.НоваяКолонка("К" + номКолонка);
КонецЕсли;
экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, ЗначениеЯчейки);
КонецЕсли;
КонецЦикла;
Возврат 1;
КонецФункции ПоказатьВы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 19139
Создание 24.02.09 17:08
Обновление 20.01.10 00:00
Просмотры 75802
Загрузки 4643
Рейтинг
229
Комментарии 78
Код открыт Не указано
Рубрики Загрузка и выгрузка в Excel
Кому Разработчик
Тип файла Внешняя обработка (ert,epf)
Платформа 1С:Предприятие 8
Конфигурация
1C:Бухгалтерия
,
1C77
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)