Пытаюсь загрузить Эксель в массив, но вторая процедура не выводится в отладчик
Здравствуйте.
Подскажите пожалуйста, в чём моя ошибка при написании этой процедуры.
Подскажите пожалуйста, в чём моя ошибка при написании этой процедуры.
&НаКлиенте
Процедура ПолеДляВыбораФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выберите excel - файл";
Диалог.ПолноеИмяФайла = "c:\";
Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx";
Если Диалог.Выбрать() Тогда
ПолеДляВыбораФайла = Диалог.ПолноеИмяФайла;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура Загрузить(Команда, ПолеДляВыбораФайла)
Если ПустаяСтрока(ПолеДляВыбораФайла) Тогда
Сообщить("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
Возврат;
КонецЕсли;
КнигаExcel = ПолучитьCOMОбъект(ПолеДляВыбораФайла); //Получить книгу из файла EXCEL
ExcelЛист = КнигаExcel.Sheets(1);
xlCellTypeLastCell = 11;
ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;
ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;
МАдресов = Новый Массив;
Для НомСтроки = 2 По ExcelПоследняяСтрока Цикл // НомСтроки=2 - номер колонки
Номер = ExcelЛист.Cells(НомСтроки,2).Value; // (НомСтроки,2) - номер колонки и номер строки
МАдресов.Добавить(Номер);
КонецЦикла;
КнигаExcel=КнигаExcel.Application.Quit();
Сообщить("Загрузка завершена!");
КонецПроцедуры
ПоказатьОтветы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Да спасибо, прям перед вашим сообщением разобрался и заработало:
&НаКлиенте
Процедура Загрузить(Команда);
ЗагрузитьФайл(ПолеДляВыбораФайла); /////// Добавил для кнопки отдельную процедуру и вызов серверной /////
/// процедуры по этой кнопке
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьФайл(ПолеДляВыбораФайла)
Если ПустаяСтрока(ПолеДляВыбораФайла) Тогда
Сообщить("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
Возврат;
КонецЕсли;
КнигаExcel = ПолучитьCOMОбъект(ПолеДляВыбораФайла); //Получить книгу из файла EXCEL
ExcelЛист = КнигаExcel.Sheets(1);
xlCellTypeLastCell = 11;
ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;
ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;
МАдресов = Новый Массив;
Для НомСтроки = 2 По ExcelПоследняяСтрока Цикл // НомСтроки=2 - номер колонки
Номер = ExcelЛист.Cells(НомСтроки,2).Value; // (НомСтроки,2) - номер колонки и номер строки
МАдресов.Добавить(Номер);
КонецЦикла;
КнигаExcel=КнигаExcel.Application.Quit();
Сообщить("Загрузка завершена!");
КонецПроцедуры
Показать
Не подскажете как сделать что бы в массив добавлялись бы две колонки, 2-ая и 3-я ???
Как это прописать?
Для НомСтроки = 2 По ExcelПоследняяСтрока Цикл // НомСтроки=2 - номер колонки
Номер = ExcelЛист.Cells(НомСтроки,2).Value; // (НомСтроки,2) - номер колонки и номер строки
МАдресов.Добавить(Номер);
КонецЦикла;
Как это прописать?
(4) Ну у вас тогда в массиве будет три записи для колонки 1, 2, 3
Лучше добавляете не само значение а структуру из значений
Для НомСтроки = 2 По ExcelПоследняяСтрока Цикл // НомСтроки=2 - номер колонки
Номер1 = ExcelЛист.Cells(НомСтроки,2).Value;
Номер2 = ExcelЛист.Cells(НомСтроки,3).Value;
Номер3 = ExcelЛист.Cells(НомСтроки,4).Value;
МАдресов.Добавить(Номер1);
МАдресов.Добавить(Номер2);
МАдресов.Добавить(Номер3);
Лучше добавляете не само значение а структуру из значений
Для НомСтроки = 2 По ExcelПоследняяСтрока Цикл // НомСтроки=2 - номер колонки
Структура = Новый Структура();
Номер1 = ExcelЛист.Cells(НомСтроки,2).Value;
Номер2 = ExcelЛист.Cells(НомСтроки,3).Value;
Номер3 = ExcelЛист.Cells(НомСтроки,4).Value;
Структура.Вставить("Номер1", Номер1);
Структура.Вставить("Номер2", Номер2);
Структура.Вставить("Номер3", Номер3);
МАдресов.Добавить(Структура);
КонецЦикла;
Показать
(4) Вам нужно еще создать один массив, и в него добавить тот массив, то есть примерно так:
И потом можете обращайться к этим колонкам массива.
МассивКолонок = Новый Массив;
МассивНомеров = Новый Массив;
МассивНомеров.Добавить("№1");
МассивНомеров.Добавить("№2");
МассивНомеров.Добавить("№3");
...
МассивЧегоТо = Новый Массив;
МассивЧегоТо .Добавить("№1");
МассивЧегоТо .Добавить("№2");
МассивЧегоТо .Добавить("№3");
МассивКолонок.Добавить(МассивНомеров);
МассивКолонок.Добавить(МассивЧегоТо);
ПоказатьИ потом можете обращайться к этим колонкам массива.
Забудьте про com объект, читайте файл штатными средствами ТабличныйДокумент.Прочитать();
Это мой метод, надеюсь нигде не опечатался при переносе.
&НаКлиенте
Процедура ФайлНачалоВыбора(Команда)
Режим = РежимДиалогаВыбораФайла.Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
Фильтр = "Табличный документ(*.xls;*.xlsx;*.ods;*.mxl)|*.xls;*.xlsx;*.ods;*.mxl";
ДиалогОткрытияФайла.Фильтр = Фильтр;
ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
ДиалогОткрытияФайла.Заголовок = "Выберите файлы";
Если ДиалогОткрытияФайла.Выбрать() Тогда
МассивФайлов = ДиалогОткрытияФайла.ВыбранныеФайлы;
Для Каждого ИмяФайла Из МассивФайлов Цикл
Файл = ИмяФайла;
КонецЦикла;
ПрочитатьФайл(Файл);
Иначе
//Предупреждение(НСтр("ru = 'Файл(ы) не выбран!'; en = 'File(s) not selected!'"));
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПрочитатьФайл(Файл)
МассивЗаголовков=Новый Массив;
ДвоичныеДанные = Новый ДвоичныеДанные(Файл);
МассивИмениФайла = СтрРазделить(Файл,ПолучитьРазделительПути());
КонечноеИмяФайла = МассивИмениФайла[МассивИмениФайла.Количество()-1];
Хранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные);
ПрочитатьФайлНаСервере(Хранилище,КонечноеИмяФайла);
КонецПроцедуры
&НаСервере
Процедура Хранилище (Хранилище,КонечноеИмяФайла)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(Хранилище);
ИмяФайлаНаСервере = КаталогВременныхФайлов()+ПолучитьРазделительПути()+КонечноеИмяФайла;
ДвоичныеДанные.Записать(ИмяФайлаНаСервере);
Таблица = ФайлExcelВТаблицуЗначений(ИмяФайлаНаСервере);
КонецПроцедуры;
// Парсит Excel и возвращает таблицу значений из него
//
// Параметры:
// Файл - строка - имя файла на сервере, из которого будет идти чтение
// НомерЛиста - число - номер читаемого листа, 0 - читаем все листы
// КолУровнейШапки - число - для сложных шапок, содержащих 2 и более уровней
//
// Возвращаемое значение:
// ТаблицаЗначений - Таблица с данными из файла Excel
//
Функция ФайлExcelВТаблицуЗначений(Файл,НомерЛиста=0,КолУровнейШапки=0,ЧитатьКакТекст=Ложь) Экспорт
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Файл,?(ЧитатьКакТекст,СпособЧтенияЗначенийТабличногоДокумента.Текст,СпособЧтенияЗначенийТабличногоДокумента.Значение));
ЧитаемаяОбласть = ТабДок.Область();
Если НомерЛиста>0 Тогда
ТабОбластей = Новый ТаблицаЗначений;
ТабОбластей.Колонки.Добавить("Верх");
ТабОбластей.Колонки.Добавить("Область");
Для Каждого Область Из ТабДок.Области Цикл
Строка = ТабОбластей.Добавить();
Строка.Область = Область;
Строка.Верх = Область.Верх;
КонецЦикла;
ТабОбластей.Сортировать("Верх");
Область = ТабОбластей[НомерЛиста-1].Область;
КонецЕсли;
Если КолУровнейШапки > 1 Тогда
Область = СвернутьСложнуюШапку(ТабДок,КолУровнейШапки,Область);
КонецЕсли;
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.НеДобавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
Возврат ПЗ.Результат.Выгрузить();
КонецФункции // ФайлExcelВТаблицуЗначений()
// Для парсинга табличных документов: сворачивает шапку для построителя запросов до 1 уровня
//
// Параметры:
// Область - ТабличныйДокумент,ОбластьТабличногоДокумента - <описание параметра>
// КолУровней - Число - Исходное количество уровней начиная с 2. Передавать меньше 2 не имеет смысла.
//
// Возвращаемое значение:
// ОбластьТабличногоДокумента - Область с обрезанной до 1 строки шапкой.
Функция СвернутьСложнуюШапку(ТабДок,КолУровней,Область=Неопределено) Экспорт
Если Область=Неопределено Тогда
Область = ТабДок.Область();
КонецЕсли;
МассивЗаголовков = Новый Массив;
МаксКолонок = ТабДок.ПолучитьРазмерОбластиДанныхПоГоризонтали();
ПерваяСтрока = Область.Верх;
Для Сч = 1 По КолУровней Цикл
ПредЗначение = "";
Для Кол = 1 По МаксКолонок Цикл
Текст = ТабДок.Область("R"+Строка(ПерваяСтрока+Сч-1)+"C"+Кол).Текст;
Если Сч = 1 Тогда
МассивЗаголовков.Добавить(Новый Массив);
Если ЗначениеЗаполнено(Текст) Тогда
МассивЗаголовков[Кол-1].Добавить(Текст);
ПредЗначение = Текст;
Иначе
МассивЗаголовков[Кол-1].Добавить(ПредЗначение);
КонецЕсли;
Иначе
ИменаЗаголовка = МассивЗаголовков[Кол-1];
РодительОтличается = Ложь;
Если Кол >1 Тогда
Для Инд = 0 по Сч-2 Цикл
Если ИменаЗаголовка[Инд] <> МассивЗаголовков[Кол-2][Инд] Тогда
РодительОтличается = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если ЗначениеЗаполнено(Текст) Тогда
ИменаЗаголовка.Добавить(Текст);
Иначе
Если ЗначениеЗаполнено(ПредЗначение) И НЕ РодительОтличается Тогда
ИменаЗаголовка.Добавить(ПредЗначение);
КонецЕсли;
КонецЕсли;
ПредЗначение = Текст;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Кол = 1 По МаксКолонок Цикл
ТабДок.Область("R"+Строка(ПерваяСтрока+КолУровней-1)+"C"+Кол).Текст = СтрСоединить(МассивЗаголовков[Кол-1],"_");
КонецЦикла;
НоваяОбласть = ТабДок.Область("R"+Строка(ПерваяСтрока+КолУровней-1)+":R"+Область.Низ);
Возврат НоваяОбласть;
КонецФункции // СвернутьСложнуюШапку()
ПоказатьЭто мой метод, надеюсь нигде не опечатался при переносе.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот