Имя: Пароль:
1C
 
Как быстро читать не значения, а текст ячейки excel?
0 Hipocrisy2013
 
04.10.19
09:06
Вот через этот способ мы получаем значение ячеек, а есть ли быстрый способ чтения текста ячеек? Перебирать через цикл "Sheet.Cells(Счетчик1, Счетчик2).Text" очень долго.

Попытка
    EXCELApplication               = Новый COMОбъект("EXCEL.Application");
    EXCELApplication.Visible       = Ложь;
    EXCELApplication.DisplayAlerts = Ложь;
Исключение
    Попытка
        EXCELApplication.Application.Quit();
    Исключение
    КонецПопытки;
    EXCELApplication = Неопределено;
    Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
    Возврат;
КонецПопытки;
    
Если НЕ ЗначениеЗаполнено(Объект.ПутьКФайлу) Тогда
    Сообщить("Не выбран файл!");
    Возврат;        
КонецЕсли;    
    
Book        = EXCELApplication.WorkBooks.Open(Объект.ПутьКФайлу);
Sheet       = Book.WorkSheets(1);
ВсегоСтрок  = Sheet.Cells(1,1).SpecialCells(11).Row;
                
Область = Sheet.Range(Sheet.Cells(НачатьСоСтроки, НачатьСКолонки), Sheet.Cells(ВсегоСтрок, ЗакончитьДоКолонки));
Данные  = Область.Value.Выгрузить();
        
Попытка
    EXCELApplication.Application.Quit();
Исключение
КонецПопытки;
    
EXCELApplication = Неопределено;
1 lEvGl
 
гуру
04.10.19
09:14
adodb
2 Hipocrisy2013
 
04.10.19
09:57
(1) Ну и как через adodb вытаскивать текст ячеек? Способы описанные в инете, также вытаскивают значение
3 lEvGl
 
гуру
04.10.19
10:11
аа, текст
тогда шаманить под конкретные условия
4 Hipocrisy2013
 
04.10.19
10:16
Connection = Новый COMОбъект("ADODB.Connection");
    СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""";
    
    Попытка
        Connection.Open(СтрокаПодключения);
    Исключение
        Сообщить(ОписаниеОшибки());
        Возврат Неопределено;
    КонецПопытки;
    
    Command   = Новый COMОбъект("ADODB.Command");
    axCatalog = Новый COMОбъект("ADOX.Catalog");
    axCatalog.ActiveConnection = Connection;
    
    Для Каждого Лист Из axCatalog.Tables Цикл
        ИмяТаблицы = Лист.Name;
        Прервать;
    КонецЦикла;
    
    RecordSet = Новый COMОбъект("ADODB.RecordSet");
    Command.ActiveConnection = Connection;
    Command.CommandText = "SELECT COUNT(*) FROM ["+ИмяТаблицы+"]";
    Command.CommandType = 1;
    RecordSet = Command.Execute();
    КоличествоСтрок = RecordSet.Fields(0).Value;
    Command.CommandText = "SELECT * FROM ["+ИмяТаблицы+"]";
    Command.CommandType = 1;
    Попытка
        RecordSet = Command.Execute();
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    RecordSet.MoveNext();
    ФайлВФормеМассива = Новый Массив;
    
    Пока RecordSet.EOF() = 0 Цикл
        МассивСтроки = Новый Массив;
        Для НомерПоля = 1 По RecordSet.Fields.Count Цикл
            МассивСтроки.Добавить(RecordSet.Fields(НомерПоля - 1).Value);
        КонецЦикла;
        ФайлВФормеМассива.Добавить(МассивСтроки);
        RecordSet.MoveNext();
    КонецЦикла;
    RecordSet.Close();
    Connection.Close();


что тут нужно поменять чтобы текст ячейки был я не значение RecordSet.Fields(НомерПоля - 1).text - такого свойства нету.
5 xenos
 
04.10.19
10:18
Сохранить в CSV и читать чистый текст.
6 Cyberhawk
 
04.10.19
10:24
В общем случае это невозможно, т.к. отображаемый в ячейках текст может формироваться динамически при открытии (отображении) содержимого файла на экране. Например, даты и числа в разных форматах в зависимости от контекста (региональных настроек) ОС.
7 Hipocrisy2013
 
04.10.19
10:26
(5) Да быстрее через цикл "Sheet.Cells(Счетчик1, Счетчик2).Text" перебрать чем, сохранять файл, потом его же открывать читать и т.д., тем более мне нужно считывать текст только с одной колонке, а с других как раз значение нужно.
8 Cyberhawk
 
04.10.19
10:29
Что там за текст хочешь считывать, что считывание значений не устраивает?
А вообще пользуйся Гугл Шитс АПИ, там можно и то, и другое по желанию получать.
9 3achem
 
04.10.19
10:36
(0) Мне нравится такой вариант (8.3.13.1513)

ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ПутьКФайлу, СпособЧтенияЗначенийТабличногоДокумента.Текст);        
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область(1, 1, ТабДок.ВысотаТаблицы, 6));
Построитель.Выполнить();
ТаблицаЗначений = Построитель.Результат.Выгрузить();

20 тысяч строк читает за секунду
10 lEvGl
 
гуру
04.10.19
12:02
(9) действительно текст считывает с форматированием и остальной хренью или значения?
11 lEvGl
 
гуру
04.10.19
12:05
кстати, наверно форматированное можно в xml перегнать, потом читать