Имя: Пароль:
1C
1С v8
Эксель: считывание без точного указания столбца и ячейки
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
ОФФ: Агитация запрещена :-)
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс