Как сделать Загрузку Excel (стадия программирования начинающего программиста)
Здравствуйте , прошу проверить загрузку из эксель , т.к посмотрел разные сайты, но не нашел как же все таки правильно сделать.
Делаю так:
Создаю обработку. Создаю реквизит формы ПутьКФайлу. Его вытаскиваю в элементы формы.
Указываю в событии НачалоВыбора ПутьКФайлуНачалоВыбора
Затем создаю команду загрузить. У нее следующий код:
и вроде как то работает но очень плохо , работал с материалами и фурнитурой
(Уважаемые модераторы, прошу не банить данный вопрос , я начинающий программист)
Делаю так:
Создаю обработку. Создаю реквизит формы ПутьКФайлу. Его вытаскиваю в элементы формы.
Указываю в событии НачалоВыбора ПутьКФайлуНачалоВыбора
&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выбор файла";
Диалог.Фильтр = "Excel файлы(*.xls; *.xlsx)|*.xls;*.xlsx";
Диалог.ИндексФильтра = 0;
Диалог.ПредварительныйПросмотр = Ложь;
Диалог.ПроверятьСуществованиеФайла = Истина;
Диалог.МножественныйВыбор = Ложь;
Диалог.ПолноеИмяФайла = ПутьКФайлу;
Если Диалог.Выбрать() Тогда
ПутьКФайлу = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
ПоказатьЗатем создаю команду загрузить. У нее следующий код:
&НаСервере
Процедура ЗагрузитьНаСервере(ДвоичДанные, Расширение)
ФайлЭксельНаСервере = ПолучитьИмяВременногоФайла(Расширение);
ДвоичДанные.Записать(ФайлЭксельНаСервере);
Попытка
// Создание COM-объекта
Эксель = Новый COMОбъект("Excel.Application");
// Отключение вывода предупреждений и вопросов
Эксель.DisplayAlerts = 0;
Эксель.Visible = 0;
Исключение
Return;
КонецПопытки;
// Открываем книгу
Книга = Эксель.Workbooks.Open(ФайлЭксельНаСервере);
// Открываем лист
Лист = Книга.Sheets(1);
// Определяем количество строк и столбцов
ВсегоСтрок = Лист.Cells(1,1).SpecialCells(11).Row;
ВсегоСтолбцов = Лист.Cells(1,1).SpecialCells(11).Column;
// Перебираем строки
Для СчетчикСтрок = 2 По ВсегоСтрок Цикл
Организация = Лист.Cells(СчетчикСтрок,1).Value;
ОрганизацияСпр = Справочники.Организации.НайтиПоНаименованию(Организация);
Имя = Лист.Cells(СчетчикСтрок,2).Value;
ФИО = Лист.Cells(СчетчикСтрок,3).Value;
// Создаем нового агента в справочнике Агенты
Агент = Справочники.Агенты.СоздатьЭлемент();
// Заполняем реквизиты
Агент.Владелец = ОрганизацияСпр;
Агент.Наименование = Имя;
Агент.ФИО = ФИО;
// Записываем
Агент.Записать();
КонецЦикла;
// Закрываем книгу
Эксель.Workbooks.Close();
// Отключаем Эксель
Эксель.Application.Quit();
КонецПроцедуры
// загрузка агентов
&НаКлиенте
Процедура Загрузить(Команда)
ИмяФайла = ЭтаФорма.ПутьКФайлу;
нФайл = Новый Файл(ИмяФайла);
Если Не нФайл.Существует() Тогда
Возврат;
КонецЕсли;
ДвоичДанные = Новый ДвоичныеДанные(ИмяФайла);
ЗагрузитьНаСервере(ДвоичДанные, нФайл.Расширение);
КонецПроцедуры
Показатьи вроде как то работает но очень плохо , работал с материалами и фурнитурой
(Уважаемые модераторы, прошу не банить данный вопрос , я начинающий программист)
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
(9)так даже на этих объемах нативное 1С чтение *.xls(х) проигрывает по скорости в 10-25 раз чтению с помощью MS Excel(COM)
p.s тест запускать либо в файловом варианте, либо с установленным на сервере MS Excel.
p.s тест запускать либо в файловом варианте, либо с установленным на сервере MS Excel.
Прикрепленные файлы:
ТестовыйЛист_100к_строк_20_колонок.zip
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
1С умеет в эксель без всяких COM/OLE.
1) Получаете книгу EXCEL через табличный документ.
2) Переносите данные табличного документа в таблицу значений.
3) профит!
1) Получаете книгу EXCEL через табличный документ.
2) Переносите данные табличного документа в таблицу значений.
3) профит!
(9)так даже на этих объемах нативное 1С чтение *.xls(х) проигрывает по скорости в 10-25 раз чтению с помощью MS Excel(COM)
p.s тест запускать либо в файловом варианте, либо с установленным на сервере MS Excel.
p.s тест запускать либо в файловом варианте, либо с установленным на сервере MS Excel.
Прикрепленные файлы:
ТестовыйЛист_100к_строк_20_колонок.zip
(11)
А разве автор где-то пишет, что требуется скорость при чтении?
Он учится, а учиться надо на элементарных подходах.
Вот освоит чтение Книги, освоит получение Листов, потом обход табличного документа по ячейкам.
И всё это без магии:
Лист.Cells(1,1).SpecialCells(11).Row - для старого формата
или
Страница.UsedRange.Rows.Count - для нового формата
А когда скорость станет критичной, то тогда и реализует другой подход, например получение данных таблиц через COMSafeArray.
А разве автор где-то пишет, что требуется скорость при чтении?
Он учится, а учиться надо на элементарных подходах.
Вот освоит чтение Книги, освоит получение Листов, потом обход табличного документа по ячейкам.
И всё это без магии:
Лист.Cells(1,1).SpecialCells(11).Row - для старого формата
или
Страница.UsedRange.Rows.Count - для нового формата
А когда скорость станет критичной, то тогда и реализует другой подход, например получение данных таблиц через COMSafeArray.
(11) в замер времени выполнения через СОМ не включили подключение, получение страницы и создание ТЗ :)
Да, на больших таблицах второй способ будет выигрывать.
Но на не больших будет проигрывать. Хотя там не сильно будет принципиально, если только не загружать много файлов небольшого размера.
Ну и самое важное. Если это необходимо делать на сервере, то не факт, что Excel будет на сервере (а это скорее всего так и будет).
Да, на больших таблицах второй способ будет выигрывать.
Но на не больших будет проигрывать. Хотя там не сильно будет принципиально, если только не загружать много файлов небольшого размера.
Ну и самое важное. Если это необходимо делать на сервере, то не факт, что Excel будет на сервере (а это скорее всего так и будет).
Три способа:
1: самый простой:
Функция ЧтениеExcel(ВыбранныйФайл)
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ВыбранныйФайл);
ОбластиТаб = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);
Построитель = Новый ПостроительОтчета
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластиТаб);
Построитель.Выполнить();
ТабДанные = Построитель.Результат.Выгрузить();
Возврат ТабДанные;
КонецФункции
2: Через Com:
Функция ЧтениеExcel(ВыбранныйФайл)
Попытка
ТЗ = Новый ТаблицаЗначений();
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ВыбранныйФайл);
//Открыть необходимый лист
Excel.Sheets(1).Select(); //лист 1, по умолчанию
//Получить количество строк и колонок.
//В разных версиях Excel получаются по-разному, поэтому сначала определить версию Excel
Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
Если Версия = "8" тогда
МакСтрок = Excel.Cells.CurrentRegion.Rows.Count;
МакСтолб = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
МакСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
МакСтолб = Excel.Cells(1,1).SpecialCells(11).Column;
Конецесли;
Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
ТЗ.Колонки.Добавить(ИмяСтолбца, Новый ОписаниеТипов("Строка"));
КонецЦикла;
Для НомСтрока = 1 по МакСтрок цикл
СтрТЗ = ТЗ.Добавить();
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Excel.Cells(НомСтрока,НомСтолбец).Value;
СтрТЗ[НомСтолбец-1] = Данные;
КонецЦикла;
КонецЦикла;
Excel.ActiveWorkbook.Close(); Excel.Quit(); Excel = 0;
Возврат ТЗ;
Исключение
Сообщить("Произошла ошибка при обращение к Excel:" + Символы.ПС + ОписаниеОшибки());
Excel.ActiveWorkbook.Close(); Excel = 0;
Возврат Неопределено;
КонецПопытки;
КонецФункции
3: Еще один через Com:
Функция ЧтениеExcel(ВыбранныйФайл)
Попытка
Док = ПолучитьCOMОбъект(ВыбранныйФайл);
ТЗ = Новый ТаблицаЗначений();
Страница = Док.Sheets(1);
МакСтрок = Страница.UsedRange.Rows.Count; // макс. колич. строк
МакСтолб = Страница.UsedRange.Columns.Count; // макс. колич. столбцов
Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
ТЗ.Колонки.Добавить(ИмяСтолбца, Новый ОписаниеТипов("Строка"));
КонецЦикла;
Для НомСтрока = 1 по МакСтрок цикл
СтрТЗ = ТЗ.Добавить();
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Страница.Cells(НомСтрока,НомСтолбец).Value;
СтрТЗ[НомСтолбец-1] = Данные;
КонецЦикла;
КонецЦикла;
Возврат ТЗ;
Исключение
Сообщить("Произошла ошибка при обращение к Excel:" + Символы.ПС + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
1: самый простой:
Функция ЧтениеExcel(ВыбранныйФайл)
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ВыбранныйФайл);
ОбластиТаб = ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, ТабДок.ШиринаТаблицы);
Построитель = Новый ПостроительОтчета
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластиТаб);
Построитель.Выполнить();
ТабДанные = Построитель.Результат.Выгрузить();
Возврат ТабДанные;
КонецФункции
2: Через Com:
Функция ЧтениеExcel(ВыбранныйФайл)
Попытка
ТЗ = Новый ТаблицаЗначений();
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open(ВыбранныйФайл);
//Открыть необходимый лист
Excel.Sheets(1).Select(); //лист 1, по умолчанию
//Получить количество строк и колонок.
//В разных версиях Excel получаются по-разному, поэтому сначала определить версию Excel
Версия = Лев(Excel.Version,Найти(Excel.Version,".")-1);
Если Версия = "8" тогда
МакСтрок = Excel.Cells.CurrentRegion.Rows.Count;
МакСтолб = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13);
Иначе
МакСтрок = Excel.Cells(1,1).SpecialCells(11).Row;
МакСтолб = Excel.Cells(1,1).SpecialCells(11).Column;
Конецесли;
Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
ТЗ.Колонки.Добавить(ИмяСтолбца, Новый ОписаниеТипов("Строка"));
КонецЦикла;
Для НомСтрока = 1 по МакСтрок цикл
СтрТЗ = ТЗ.Добавить();
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Excel.Cells(НомСтрока,НомСтолбец).Value;
СтрТЗ[НомСтолбец-1] = Данные;
КонецЦикла;
КонецЦикла;
Excel.ActiveWorkbook.Close(); Excel.Quit(); Excel = 0;
Возврат ТЗ;
Исключение
Сообщить("Произошла ошибка при обращение к Excel:" + Символы.ПС + ОписаниеОшибки());
Excel.ActiveWorkbook.Close(); Excel = 0;
Возврат Неопределено;
КонецПопытки;
КонецФункции
3: Еще один через Com:
Функция ЧтениеExcel(ВыбранныйФайл)
Попытка
Док = ПолучитьCOMОбъект(ВыбранныйФайл);
ТЗ = Новый ТаблицаЗначений();
Страница = Док.Sheets(1);
МакСтрок = Страница.UsedRange.Rows.Count; // макс. колич. строк
МакСтолб = Страница.UsedRange.Columns.Count; // макс. колич. столбцов
Для Столбец = 1 по МакСтолб цикл
ИмяСтолбца = "Столбец_" + Столбец;
ТЗ.Колонки.Добавить(ИмяСтолбца, Новый ОписаниеТипов("Строка"));
КонецЦикла;
Для НомСтрока = 1 по МакСтрок цикл
СтрТЗ = ТЗ.Добавить();
Для НомСтолбец = 1 по МакСтолб цикл
Данные = Страница.Cells(НомСтрока,НомСтолбец).Value;
СтрТЗ[НомСтолбец-1] = Данные;
КонецЦикла;
КонецЦикла;
Возврат ТЗ;
Исключение
Сообщить("Произошла ошибка при обращение к Excel:" + Символы.ПС + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
пример немного более быстрого варианта:
&НаСервере
Процедура ЗагрузитьНоменклатуру() Экспорт
Connection = Новый COMОбъект("ADODB.Connection");
Connection.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};DBQ="+Объект.ПутьКФайлу+";DriverId=790";
Попытка
Connection.Open();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Сообщить("Загрузить номенклатуру...");
СтрокаЗапроса = " SEL ECT DISTINCT * FR OM ["+Объект.НомерЛиста+"$A:С]";
Попытка
COMObject = Connection.Execute(СтрокаЗапроса);
COMSafeArray = COMObject.GetRows();
Исключение
Сообщить(СтрокаЗапроса + " // " + ОписаниеОшибки());
Возврат;
КонецПопытки;
N = COMSafeArray.GetUpperBound();
Сообщить("Строк в документе:" + Строка(N));
Для Индекс = Число(Объект.НачСтрока) по ?(Объект.КонСтрока > N, N, Объект.КонСтрока) Цикл
АртикулИмп = ?(Объект.Артикул =0,"",СокрЛП(COMSafeArray.GetValue(Индекс, Объект.Артикул-1)));
НаименованиеИмп = СокрЛП(COMSafeArray.GetValue(Индекс, Объект.Наименование-1));
КодКИСИмп = ?(Объект.КодКИС =0,"",СокрЛП(COMSafeArray.GetValue(Индекс, Объект.КодКИС-1)));
Попытка
Результат = Справочники.НоменклатураКонтрагентов.НайтиПоКоду(АртикулИмп);
Если Результат.Ссылка.Пустая() Тогда
НовыйТовар = Справочники.НоменклатураКонтрагентов.СоздатьЭлемент();
НовыйТовар.Код = АртикулИмп;
НовыйТовар.Наименование = НаименованиеИмп;
НовыйТовар.НоменклатураКИС = Справочники.Номенклатура.НайтиПоКоду(КодКИСИмп);
НовыйТовар.Записать();
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Сообщить("Обработано строк файла: " + Строка(Индекс));
Сообщить("Конец загрузки: " + Строка(ТекущаяДата()));
Connection.Close();
КонецПроцедуры
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот