Лист 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 выдает массив колонок, а не строк, что логично, такой массив меньше размером.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 2

  1. makfromkz:

    Вопрос: Если на сервере нет мелкософта, сработает ли:
    ТабДок.Прочитать(ИмяФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);
    ???

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *