|
Эксель: считывание без точного указания столбца и ячейки | ☑ | ||
---|---|---|---|---|
0
листопад
03.12.11
✎
20:41
|
Есть файл-Excel, считываю его и загружаю в табличную часть документа. Подскажите, как указать, что начинать считывать надо со столбца, имеющего именование "Расход за период", а далее столюец "литр". Т.е. в Эксель это выглядит так:
http://s54.radikal.ru/i143/1112/8d/3c3c691f2fdf.jpg |
|||
1
mikecool
03.12.11
✎
20:42
|
найтитекст
|
|||
2
mikecool
03.12.11
✎
20:43
|
или прописать типа настроек, а юзер пусть сам указывает + (1) в помощь юзеру
|
|||
3
mikecool
03.12.11
✎
20:45
|
+1 вру, это кажется называется Find ))
|
|||
4
листопад
03.12.11
✎
20:49
|
(1), (2) спасибо, а можно по-подробнее: как сначала найти столбец с наименованием "Расход за период", а далее столбец "литр" (ведь столбцов, имеющих наименование "литр", у меня несколько).
Может как-то по-другому надо считывать??? Раньше я указывала, что надо считывать с такой-то ячейки, а в этом случае, Эксель заполняться может по-разному, т.е. шапка таблицы может начаться не с 7-8 строчки, а с 5 или 6-той. Поэтому я хочу прописать считывание по наименованию. Хотя, может есть какой-то другой, более оптимальный способ? |
|||
5
mikecool
03.12.11
✎
20:49
|
находишь "Расход за период", а потом поблизости проверяешь свой литр
|
|||
6
листопад
03.12.11
✎
20:53
|
(5) как проверять "поблизости"?
|
|||
7
mikecool
03.12.11
✎
21:03
|
(6) find находит ячейку с координатами x и y
смотришь ячейки (x+1,y), (x+1,y+1), (x+1,y-1) типа так |
|||
8
листопад
03.12.11
✎
21:28
|
Ниже код, в котором я начинаю считывать данные с 15-той строчки. Как в него вставить условия, описанные мною в (0):
Процедура ЧтениеXLSФайла(Элемент) ExcelПриложение = Новый COMОбъект("Excel.Application"); ExcelФайл = ExcelПриложение.WorkBooks.Open(ИмяФайла); Попытка // Читаем данные первого листа книги ExcelЛист = ExcelФайл.Sheets(1); Версия = Лев(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 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание); ExcelПриложение.Quit(); КонецПопытки; // Последовательное чтение строк с выбранного листа Для а = 15 по ФайлСтрок Цикл ОбработкаПрерыванияПользователя(); КонецЦикла; ExcelПриложение.Quit(); КонецПроцедуры // ЧтениеXLSФайла(Элемент) |
|||
9
листопад
03.12.11
✎
22:31
|
+(8) Т.е. в (8) я жестко прописала считывание с 15-той строки, а мне надо (т.к. строки могут меняться), при считывании сначала найти столбец с наименованием "Расход за период", а далее столбец "литр": http://s54.radikal.ru/i143/1112/8d/3c3c691f2fdf.jpg
|
|||
10
Mans
03.12.11
✎
22:51
|
Для а = 1 по ФайлКолонок Цикл
Для б = 1 по ФайлСтрок Цикл Если СокрЛП(ExcelПриложение.Cells(а,б).Text)="Расход за период" Тогда Прервать; КонецЕсли; КонецЦикла; Если б<=ФайлСтрок Тогда Прервать; КонецЕслии; КонецЦикла; |
|||
11
Mans
03.12.11
✎
22:54
|
точнее наоборот: ФайлКолонок <-> ФайлСтрок
|
|||
12
Rie
03.12.11
✎
22:56
|
А почему бы не считать из Excel в 1Совский ComSafeArray - а далее бегать по нему и искать нужное?
|
|||
13
Armando
03.12.11
✎
23:09
|
Можно ado применить. В select`е указываешь имя колонки и не паришься, где она находится.
|
|||
14
листопад
04.12.11
✎
00:02
|
(10) спасибо. Но не пойму, как этот код работает. Объясните пож-та...
|
|||
15
Mans
04.12.11
✎
00:07
|
вложенные циклы? по строке доходим (или не доходим) до права, если не нашли - следующая строка
и опять с лева на право |
|||
16
листопад
04.12.11
✎
00:20
|
(15)
Для а = 1 по ФайлСтрок Цикл Для б = 1 по ФайлКолонок Цикл Если СокрЛП(ExcelПриложение.Cells(а,б).Text)="Расход за период" Тогда // вот здесь мы нашли ячейку "Расход за период" // как дальше продолжить считывать столбец, ведь дальше идет строка с ячейкой "литр" //может быть так: Если СокрЛП(ExcelПриложение.Cells(а,б).Value) = "литр" Тогда //вот здесь дальше как??? Прервать; КонецЕсли; КонецЦикла; Если б<=ФайлКолонок Тогда Прервать; КонецЕсли; КонецЦикла; |
|||
17
Mans
04.12.11
✎
00:22
|
судя по рисунку:
Если СокрЛП(ExcelПриложение.Cells(а+1,б).Value) = "литр" Тогда |
|||
18
листопад
04.12.11
✎
00:47
|
(17) Спасибо. Подскажите еще, пож-та: почему у меня не добавляются данные в табличную часть экранной формы? Ниже код:
Для а = 1 по ФайлСтрок Цикл Для б = 1 по ФайлКолонок Цикл Если СокрЛП(ExcelПриложение.Cells(а,б).Text)="Расход за период" Тогда Сообщить("зашла в цикл " + "А="+ а + " Б="+ б); Если СокрЛП(ExcelПриложение.Cells(а+1,б).Value) = "литр" Тогда Наименование = СокрЛП(ExcelПриложение.Cells(а+2,НомерКолонкиНаименование).Value); Количество = СокрЛП(ExcelПриложение.Cells(а+2,НомерКолонкиКоличество).Value); Количество = СтрЗаменить(Количество, Символы.НПП, ""); // Добавить данные в табличную часть экранной формы Стр=ТаблицаДокумента.Добавить(); Попытка Стр.Наименование = Наименование; Стр.Количество = Количество; Исключение Сообщить("Ошибка чтения строки файла Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание); КонецПопытки; Состояние("Обработка файла Microsoft Excel."); КонецЕсли; Прервать; КонецЕсли; Если б<=ФайлКолонок Тогда Прервать; КонецЕсли; КонецЦикла; КонецЦикла; |
|||
19
листопад
04.12.11
✎
00:50
|
+(18)
Еще забыла добавить в код (в самом начале): НомерКолонкиНаименование = 2; НомерКолонкиКоличество = 11; Для а = 1 по ФайлСтрок Цикл Для б = 1 по ФайлКолонок Цикл ...и т.д |
|||
20
листопад
04.12.11
✎
00:54
|
ТаблицаДокумента это Табличное поле на форме обработки, имеющее тип значения - таблица значений.
|
|||
21
Mans
04.12.11
✎
01:02
|
"Прервать" почему из условия вынесен?
для чего НомерКолонкиКоличество, это ж вроде "б"? еще один цикл запускать надо, по вертикали: Для в = а+2 по ФайлСтрок Цикл Наименование = СокрЛП(ExcelПриложение.Cells(в,НомерКолонкиНаименование).Value); Количество = СокрЛП(ExcelПриложение.Cells(в,б).Value); ..... |
|||
22
листопад
04.12.11
✎
01:27
|
(21) поправила, теперь видит только первую строчку файла с данными:
MOBILGEAR 600 XP 220 85,00 А остальные данные не видит... Вот код: НомерКолонкиНаименование = 2; НомерКолонкиКоличество = 11; Для а = 1 по ФайлСтрок Цикл Для б = 1 по ФайлКолонок Цикл Если СокрЛП(ExcelПриложение.Cells(а,б).Text)="Расход за период" Тогда Если СокрЛП(ExcelПриложение.Cells(а+1,б).Value) = "литр" Тогда Наименование = СокрЛП(ExcelПриложение.Cells(а+2,НомерКолонкиНаименование).Value); Количество = СокрЛП(ExcelПриложение.Cells(а+2,НомерКолонкиКоличество).Value); Количество = СтрЗаменить(Количество, Символы.НПП, ""); // Добавить данные в табличную часть экранной формы Стр=ТаблицаДокумента.Добавить(); Попытка Стр.Наименование = Наименование; Стр.Количество = Количество; Исключение Сообщить("Ошибка чтения строки файла Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание); КонецПопытки; Состояние("Обработка файла Microsoft Excel."); КонецЕсли; Прервать; КонецЕсли; КонецЦикла; Если б<=ФайлКолонок Тогда Прервать; КонецЕсли; КонецЦикла; |
|||
23
Mans
04.12.11
✎
01:30
|
(18) и (22) в чем разница?
|
|||
24
листопад
04.12.11
✎
01:31
|
(23) КонецЦикла перенесла и Прервать.
|
|||
25
Torquader
04.12.11
✎
01:34
|
Чтобы прочитать файл Excel - нужно хотя бы примерно знать его структуру.
Для начала через UsedRange можно узнать заполненный диапазон. Потом уже в заполненном диапазоне найти нужную ячейку. В вашем случае ещё полезно проверять MergeCells, чтобы отличить объединённые ячейки от обычных. (22) И вопрос - зачем что-то искать, если в начале задали номера колонок вручную ? |
|||
26
Mans
04.12.11
✎
01:48
|
НомерКолонкиНаименование = 2;
//НомерКолонкиКоличество = 11; Для а = 1 по ФайлСтрок Цикл Для б = 1 по ФайлКолонок Цикл Если СокрЛП(ExcelПриложение.Cells(а,б).Text)="Расход за период" Тогда Если СокрЛП(ExcelПриложение.Cells(а+1,б).Value) = "литр" Тогда Состояние("Обработка файла Microsoft Excel."); Для в = а+2 по ФайлСтрок Цикл Наименование = СокрЛП(ExcelПриложение.Cells(в,НомерКолонкиНаименование).Value); Количество = СокрЛП(ExcelПриложение.Cells(в,б).Value); Количество = СтрЗаменить(Количество, Символы.НПП, ""); // Добавить данные в табличную часть экранной формы Стр=ТаблицаДокумента.Добавить(); Попытка Стр.Наименование = Наименование; Стр.Количество = Количество; Исключение Сообщить("Ошибка чтения строки файла Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание); КонецПопытки; КонецЦикла; Прервать; КонецЕсли; //Прервать; КонецЕсли; КонецЦикла; Если б<=ФайлКолонок Тогда Прервать; КонецЕсли; КонецЦикла; в 2 ночи (да еще перед выборами) барышням полагается стихи читать, а не ГСМ учитывать |
|||
27
листопад
04.12.11
✎
01:49
|
(25) Логично. Просто у меня уже был написан код, в котором я заранее задавала номера колонок, а теперь выяснилось, что колонки надо находить программно. Вот я и путаюсь...
P.S. А как работает UsedRange и MergeCells Может пример кода какого-нибудь приведете, а то боюсь, что не разберусь... |
|||
28
листопад
04.12.11
✎
01:59
|
(26) Mans, огромное Вам СПАСИБО!!! Вы мне ОЧЕНЬ помогли!!! Буду теперь дальше разбираться, чтобы пустые номенклатуры без кол-ва не загружались...
P.S. У меня НЕ активная гражданская позиция: вместо выборов, буду учитывать ГСМ и завтра ))) |
|||
29
Мимохожий Однако
04.12.11
✎
07:21
|
ОФФ: Агитация запрещена :-)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |