![]() |
![]() |
![]() |
|
Загрузка из Excel: неправильно видит количество строчек в файле | ☑ | ||
---|---|---|---|---|
0
Старуха Шапокляк
26.05.10
✎
14:23
|
Загружаю данные из файла Excel в 1С. Файл состоит из одной строки. Смотрю через отладчик, т.к. очень долго. в результате вижу, что значение ФайлСтрок = 1184 (в строчке Для а = 2 по ФайлСтрок Цикл). В результате, после первого прохода Цикла, он опять возвращается в начало цикла! Подскажите, почему так происходит и откуда это число 1184?
//Номер листа в книге Excel для получения данных НомерЛиста = 1; //Пытаемся подключиться к Excel Попытка Excel = новый COMОбъект("Excel.Application"); Исключение Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel."); Возврат; КонецПопытки; Excel.WorkBooks.close(); // закрываем файл - экселя //Подключились удачно, открываем файл Excel.Workbooks.Open(ФайлЗагрузки); //Открываем необходимый лист Excel.Sheets(НомерЛиста).select(); //Получим количество строк и колонок. //В разных версиях 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; Конецесли; Excel.ScreenUpdating = false; // Выбираем данные из файла Для а = 2 по ФайлСтрок Цикл //вот здесь показывает, что ФайлСтрок=1184 ... КонецЦикла; Excel.ScreenUpdating = true; //Закрываем Excel Excel.ActiveWorkbook.Close(); Excel.Application.Quit(); Excel = ""; ФайлЗагрузки = ""; НомерЛиста = ""; |
|||
1
sapphire
26.05.10
✎
14:26
|
Для особо одаренных Microsoft придумала свойство объекта Worksheet(Лист) с славным именем UsedRange(Используемый диапазон) типа Range(Диапазон или по-одинесному Область)
|
|||
2
Старуха Шапокляк
26.05.10
✎
14:27
|
(1) И как его использовать?
|
|||
3
sapphire
26.05.10
✎
14:29
|
//Номер листа в книге Excel для получения данных
НомерЛиста = 1; //Пытаемся подключиться к Excel Попытка Excel = новый COMОбъект("Excel.Application"); Исключение Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel."); Возврат; КонецПопытки; Excel.WorkBooks.close(); // закрываем файл - экселя //Подключились удачно, открываем файл Excel.Workbooks.Open(ФайлЗагрузки); //Открываем необходимый лист Excel.Sheets(НомерЛиста).select(); Worksheet=Excel.Sheets(НомерЛиста); //Получим количество строк и колонок. //В разных версиях 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; //Конецесли; UsedRange=Worksheet.UsedRange Excel.ScreenUpdating = false; // Выбираем данные из файла //Для а = 2 по ФайлСтрок Цикл //вот здесь показывает, что ФайлСтрок=1184 // // ... //КонецЦикла; For Each Row In UsedRange.Rows do // Перебираем строки в используемом диапазоне. enddo; Excel.ScreenUpdating = true; //Закрываем Excel Excel.ActiveWorkbook.Close(); Excel.Application.Quit(); |
|||
4
sapphire
26.05.10
✎
14:31
|
Ну и зачем Excel.Sheets(НомерЛиста).select(); ?
Можно вот так: Worksheet=Excel.Sheets(НомерЛиста); |
|||
5
Старуха Шапокляк
26.05.10
✎
14:55
|
(3), (4) спасибо, но у меня в цикле еще строчки есть, которые я в (0) не указала:
//определим по файлу в каких колонках необходимые данные НомерКолонкиКлюч = 1; НомерКолонкиНазвание = 2; НомерКолонкиИНН = 3; НомерКолонкиКПП = 4; // Выбираем данные из файла Для а = 2 по ФайлСтрок Цикл //вот здесь показывает, что ФайлСтрок=1184 Ключ = СокрЛП(Excel.Cells(а,НомерКолонкиКлюч).Value); Название = СокрЛП(Excel.Cells(а,НомерКолонкиНазвание).Value); ИНН = СокрЛП(Excel.Cells(а,НомерКолонкиИНН).Value); КПП = СокрЛП(Excel.Cells(а,НомерКолонкиКПП).Value); ... КонецЦикла; Вероятно из-за этого, когда я модифицировала свой код по вашему примеру в (3), то стал выдавать ошибку еще на этапе синтаксического контроля: {Форма.Форма(121,39)}: Переменная не определена (а) Ключ = СокрЛП(Excel.Cells(<<?>>а,НомерКолонкиКлюч).Value); {Форма.Форма(132,39)}: Переменная не определена (а) Название = СокрЛП(Excel.Cells(<<?>>а,НомерКолонкиНазвание).Value); {Форма.Форма(135,39)}: Переменная не определена (а) ИНН = СокрЛП(Excel.Cells(<<?>>а,НомерКолонкиИНН).Value); {Форма.Форма(138,39)}: Переменная не определена (а) КПП = СокрЛП(Excel.Cells(<<?>>а,НомерКолонкиКПП).Value); Т.е. сейчас у меня вот такой код (исправленный как в (3)): //Номер листа в книге Excel для получения данных НомерЛиста = 1; //Пытаемся подключиться к Excel Попытка Excel = новый COMОбъект("Excel.Application"); Исключение Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel."); Возврат; КонецПопытки; Excel.WorkBooks.close(); // закрываем файл - экселя //Подключились удачно, открываем файл Excel.Workbooks.Open(ФайлЗагрузки); //Открываем необходимый лист Excel.Sheets(НомерЛиста).select(); Worksheet=Excel.Sheets(НомерЛиста); //+ UsedRange=Worksheet.UsedRange; //+ Excel.ScreenUpdating = false; //определим по файлу в каких колонках необходимые данные НомерКолонкиКлюч = 1; НомерКолонкиНазвание = 2; НомерКолонкиИНН = 3; НомерКолонкиКПП = 4; // Выбираем данные из файла For Each Row In UsedRange.Rows do //+ Ключ = СокрЛП(Excel.Cells(а,НомерКолонкиКлюч).Value); Название = СокрЛП(Excel.Cells(а,НомерКолонкиНазвание).Value); ИНН = СокрЛП(Excel.Cells(а,НомерКолонкиИНН).Value); КПП = СокрЛП(Excel.Cells(а,НомерКолонкиКПП).Value); ... enddo; //+ |
|||
6
Старуха Шапокляк
26.05.10
✎
14:57
|
В (3) Вы пишите, что надо перебрать строки в используемом диапазоне. А как это сделать? Вероятно, что мой метод не подходит:
For Each Row In UsedRange.Rows do //+ Ключ = СокрЛП(Excel.Cells(а,НомерКолонкиКлюч).Value); Название = СокрЛП(Excel.Cells(а,НомерКолонкиНазвание).Value); ИНН = СокрЛП(Excel.Cells(а,НомерКолонкиИНН).Value); КПП = СокрЛП(Excel.Cells(а,НомерКолонкиКПП).Value); ... enddo; //+ |
|||
7
dk
26.05.10
✎
15:03
|
весь код корявый, где брала-то?
по usedrange есть ведь примеры. лень в поиск сходить? ---- Лист = Excel.Sheets(НомерЛиста); ... For Row = 1 to Лист.UsedRange.Rows.Count do //+ Ключ = СокрЛП(Лист.Cells(Row,НомерКолонкиКлюч).Value); Название = СокрЛП(Лист.Cells(Row,НомерКолонкиНазвание).Value); ИНН = СокрЛП(Лист.Cells(Row,НомерКолонкиИНН).Value); КПП = СокрЛП(Лист.Cells(Row,НомерКолонкиКПП).Value); ... enddo; |
|||
8
Старуха Шапокляк
26.05.10
✎
15:35
|
(7) Выдает ошибку при синтаксич.контроле:
{Форма.Форма(121,28)}: Переменная не определена (Лист) Ключ = СокрЛП(<<?>>Лист.Cells(Row,НомерКолонкиКлюч).Value); и т.д. |
|||
9
Старуха Шапокляк
26.05.10
✎
15:37
|
+(8) Еще выдает ошибку:
{Форма.Форма(115,20)}: Переменная не определена (Лист) For Row = 1 to <<?>>Лист.UsedRange.Rows.Count do |
|||
10
Старуха Шапокляк
26.05.10
✎
15:50
|
up!
|
|||
11
Boroda
26.05.10
✎
16:00
|
Есть момент: UsedRange.Rows.Count возвращает количество непустых строк. Т.е если в начале есть пустые строки, то операцией:
Для сч=1 по ...UsedRange.Rows.Count Цикл можешь недобрать строк столько, сколько пустых в начале... |
|||
12
Старуха Шапокляк
26.05.10
✎
16:04
|
(11) Пустых строк впереди - нет. Файл состоит из одной строчки и 20-ти столбцов. Данные начинаются со второй строчки и первого столбца. Но суть в том, что пока даже на этапе СИНТАКСИЧЕСКОГО контроля не прохожу (после того, как текст стал как в (5)).
Хелп!!! |
|||
13
Старуха Шапокляк
26.05.10
✎
16:05
|
Т.е. мне надо указать, что:
Данные располагаются на первом листе книги; Обрабатываемые данные начинаются с первого столбца и со второй строчки. |
|||
14
Boroda
26.05.10
✎
16:09
|
С 8-кой не работал. но вот для 7-ки один раз нашел и пользуюсь постоянно:
ВходЭксель = СоздатьОбъект("Excel.Application"); ВходЭксель.DisplayAlerts = 0; ВходЭксель.Workbooks.Open(СокрЛП(ФормИмяФайлаДанных)); КолЛистов = ВходЭксель.Worksheets().Count; Сообщить("Заполнение менеджером сравочника...","i"); Для СчЛ = 1 По КолЛистов Цикл Лист = ВходЭксель.Worksheets(СчЛ); ИмяЛиста = СокрЛП(Лист.Name); Сообщить("Имя листа "+ИмяЛиста,"i"); Если Найти(нрег(ИмяЛиста),нрег(ИмяНашегоЛиста))=0 Тогда Сообщить(СимволТабуляции+"пропускаем..."); Продолжить; КонецЕсли; Лист = ВходЭксель.Worksheets(ИмяЛиста); ВсегоСтрок = Лист.UsedRange.Rows.Count; //ВсегоСтрок = ВходЭксель.ActiveSheet.UsedRange.Rows.Count; Т = СоздатьОбъект("Таблица"); Т.ВывестиСекцию("Шапка"); Для Сч = стрНачало По ВсегоСтрок Цикл КодФилиала = СокрЛП(Лист.Cells(сч,колКодФилиала).Value); Если ПустоеЗначение(КодФилиала)=1 Тогда Продолжить; КонецЕсли; Состояние("строка № "+Сч); Если СпрК.НайтиПоКоду(КодФилиала)=0 Тогда Сообщить("Не найден филиал с кодом "+КодФилиала+". Пропускаем...","!!!"); Продолжить; КонецЕсли; |
|||
15
Старуха Шапокляк
26.05.10
✎
16:10
|
(14) спасибо, но я с 8-кой тоже пока не особо "дружу"...
|
|||
16
Старуха Шапокляк
26.05.10
✎
16:26
|
Ап!
|
|||
17
FN
26.05.10
✎
16:34
|
офф:
(14) Если давно пользуешься то поправь: КодФилиала = СокрЛП(Лист.UsedRange.Cells(сч,колКодФилиала).Value); и пропускать пустые строки перестанет |
|||
18
Старуха Шапокляк
26.05.10
✎
16:53
|
Пробую по другому, в отладчике все равно показывает ВсегоКоличестовСтрок = 1184. Ничего не понимаю, откуда такая цифра???
Вот код: Попытка Ексель = новый COMОбъект("Excel.Application"); Исключение Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel."); Возврат; КонецПопытки; Ексель.WorkBooks.close(); Попытка Ексель.Workbooks.Open(ФайлЗагрузки); Колонки =1; Строки =2; //заголовок не берем КоличествоСтраниц = 1; Для ТекНомер = 1 По КоличествоСтраниц Цикл //сколько непустых строк ВсегоКоличестовСтрок = Ексель.Sheets(ТекНомер).UsedRange.row + Ексель.Sheets(ТекНомер).UsedRange.Rows.Count - 1; для н= 1 по ВсегоКоличестовСтрок -1 цикл Ключ = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки).Value; Название = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +1).Value; ИНН = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +2).Value; КПП = Ексель.Sheets(ТекНомер).Cells(Строки,Колонки +3).Value; ... Строки = Строки +1; КонецЦикла; КонецЦикла; исключение Сообщить(ОписаниеОшибки()); Ексель.ActiveWorkbook.Close(); Ексель.Application.Quit(); конецПопытки; P.S. Может быть у меня структура файла не правильная? Сейчас строчка заполнена вся, но в ней некоторые колонки могут быть пустыми, например КПП - пусто: Ключ Наименование ИНН КПП ЮрАдрес 10001 ООО Восток 7702158475 г.Ставрополь, ул.Лесная Такой файл пойдет для загрузки из Эксель в 1С, или там хоть что-то должно быть, чтобы не было зацикливания??? |
|||
19
FN
26.05.10
✎
17:05
|
Сделай:
Сообщить(ксель.Sheets(ТекНомер).UsedRange.Rows.Count) - если покажет больше чем надо, то открой файлик в Екселе и нажми Ctrl-End - где курсор установится? |
|||
20
Старуха Шапокляк
26.05.10
✎
17:11
|
(19) Вы были правы: при нажатии Ctrl+End в файле курсор остановился как раз на строчке под этим номером 1184. Из-за чего это происходит и как исправить???
|
|||
21
FN
26.05.10
✎
17:17
|
(20) Физически в файле удали строки с последней заполненной до 1184 и пересохрани файлик.
|
|||
22
Старуха Шапокляк
26.05.10
✎
17:29
|
(21) СПАСИБО! Буду пробовать!!!
|
|||
23
Aswed
26.05.10
✎
17:31
|
В файле нажимаешь Ctrl+End и смотришь куда переходит курсор. Вполне может быть в какой нить ячейке на 1184 строке какие о остаточные данные, не видимые для тебя.
|
|||
24
Ковычки
26.05.10
✎
17:58
|
весь код на помойку
|
|||
25
Ковычки
26.05.10
✎
17:59
|
(21) а форматирование коли нужно тоже удалять и так в 150-и файлах ?
пофих, есть правильный метод нахождения последней ячейки |
|||
26
Ковычки
26.05.10
✎
18:00
|
(23) и это пофих
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |