Лист Excel не читается целиком
В листе Excel 5067 строк, но Excel.Application упорно выдает, что в файле 4872 строки.
Я обнаружил это не сразу, сначала думал, проблема в алгоритме загрузки, ведь там у меня удалялись дубли строк. Но тем не менее, заметил этот момент.
Если перезаписать вручную в Excel последнюю ячейку по совету с Мисты, то видит нормально размер:
Но это ненадежно, ведь пользователь не знает, корректно считается Excel или нет и может забыть перезаписать.
Переписал чтение Excel на чтение табличного документа и столкнулся с ошибкой, что формат файла XLS не поддерживается.
Кстати, об этом можно было догадаться и раньше, ведь при попытке открыть файл в 1С выдавалась ошибка:
Покопавшись, я нашел что проблема в Excel 95.
Поэтому предложил пользователю конвертировать файл в формат Excel 97-2003:
Это решило проблему.
Кстати, там использовалось чтение файла через Range, пришлось сэмулировать, чтобы не переписывать дальнейший код.
У меня:
&НаКлиенте Функция ПрочитатьExcel(ВыбИмяФайла) Ф = Новый Файл(ВыбИмяФайла); ДД = Новый ДвоичныеДанные(ВыбИмяФайла); Возврат ПрочитатьExcelНаСервере(ДД, Ф.Расширение); КонецФункции &НаСервере Функция ПрочитатьExcelНаСервере(ДД, Расширение) Р = Новый Структура("ВсегоСтрок, ВсегоКолонок"); ТабДок = Новый ТабличныйДокумент(); ИмяФайла = ПолучитьИмяВременногоФайла(Расширение); ДД.Записать(ИмяФайла); ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст); Р.ВсегоСтрок = ТабДок.ВысотаТаблицы; Р.ВсегоКолонок = ТабДок.ШиринаТаблицы; Р.Вставить("Данные", Новый Массив()); //Нужен массив колонок а не строк //Для Стр = 1 По Р.ВсегоСтрок Цикл // М = Новый Массив(); // Для Кол = 1 По Р.ВсегоКолонок Цикл // М.Добавить(ТабДок.Область(Стр, Кол).Текст); // КонецЦикла; // Р.Данные.Добавить(М); //КонецЦикла; Для Кол = 1 По Р.ВсегоКолонок Цикл М = Новый Массив(); Для Стр = 1 По Р.ВсегоСтрок Цикл М.Добавить(ТабДок.Область(Стр, Кол).Текст); КонецЦикла; Р.Данные.Добавить(М); КонецЦикла; Возврат Р; КонецФункции
До меня:
&НаКлиенте Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт Если ЛистЭксель = Неопределено Тогда ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application"); КонецЕсли; Если ВсегоСтрок = 0 Тогда ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row; КонецЕсли; Если ВсегоКолонок = 0 Тогда ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column; КонецЕсли; Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок)); Данные = Область.Value.Выгрузить(); ЛистЭксель = Неопределено; СтруктураДанныхЛиста = Новый Структура; СтруктураДанныхЛиста.Вставить("Данные",Данные); СтруктураДанныхЛиста.Вставить("ВсегоСтрок",ВсегоСтрок); СтруктураДанныхЛиста.Вставить("ВсегоКолонок",ВсегоКолонок); Возврат СтруктураДанныхЛиста; КонецФункции
Кстати, Excel выдает массив колонок, а не строк, что логично, такой массив меньше размером.
Вопрос: Если на сервере нет мелкософта, сработает ли:
ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);
???
да, там Excel читается средствами 1с.