Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 сен 2024, 06:16

Не открывается файл XLSX

Автор magnifico61, 26 апр 2017, 11:20

0 Пользователей и 1 гость просматривают эту тему.

Dethmontt

я не знаю что можно не так сделать в этом запросе...
ТекстЗапроса = "SELECT Лист.* FROM [Лист1$] as Лист";
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

magnifico61

Даже этот запрос не выполняется

СтрЗапроса = "SELECT Лист.* FROM [Лист1$] as Лист";

Об_РекордСет = Новый COMОбъект("ADODB.Recordset");
Попытка
Об_РекордСет=Об_Конект.Execute(СтрЗапроса);
Исключение
Сообщить("Не удалось выполнить запрос к файлу Excel");
Возврат;
КонецПопытки;

Dethmontt

Нимфостарт

    Connection = Новый COMОбъект("ADODB.Connection");
    Connection.ConnectionString =  СтрокаСоединения;

    Попытка
        Connection.Open();
    Исключение
        Сообщить ("Проблемы с подключением к Excel" );
        Возврат Неопределено;
    КонецПопытки;

    RS = Новый COMОбъект("ADODB.Recordset");

    ТекстЗапроса =
    "SELECT
    |    Лист.*
    |FROM
    |    [" + пЛист + "$] as Лист";

    Попытка
        RS.Open(ТекстЗапроса, Connection);
    Исключение
        Сообщить ("Проблемы с выполнением запроса");
        Возврат Неопределено;
    КонецПопытки;

    Таблица = Новый ТаблицаЗначений;

    Если СтруктураКолонок = Неопределено Тогда

        Для Счетчик = 1 По RS.Fields.Count Цикл
            Поле = RS.Fields.Item(Счетчик - 1);
            Колонка = Таблица.Колонки.Добавить("К" + Счетчик, , Поле.Name);
        КонецЦикла;

    Иначе

        Для каждого КлючИЗначение Из СтруктураКолонок Цикл
            Колонка = Таблица.Колонки.Добавить(КлючИЗначение.Ключ);
        КонецЦикла;

    КонецЕсли;

    НомерСтроки = 0;
    КолвоСтрок  = RS.RecordCount;

    Пока RS.EOF() = 0 Цикл

        НомерСтроки = НомерСтроки + 1;

        #Если Клиент Тогда
        Состояние("Чтение файла: " + Формат(НомерСтроки) + " из " + Формат(КолвоСтрок));
        ОбработкаПрерыванияПользователя();
        #КонецЕсли

        Если НомерСтроки < НачСтрока Тогда
            RS.MoveNext();
            Продолжить;
        КонецЕсли;

        Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
            Прервать;
        КонецЕсли;

        НоваяСтрока = Таблица.Добавить();

        Если СтруктураКолонок = Неопределено Тогда

            Для Счетчик = 1 По RS.Fields.Count Цикл

                Поле = RS.Fields.Item(Счетчик - 1);
                НоваяСтрока["К" + Счетчик] = Поле.Value;

            КонецЦикла;

        Иначе

            Для каждого КлючИЗначение Из СтруктураКолонок Цикл

                Поле = RS.Fields.Item(КлючИЗначение.Значение - 1);
                НоваяСтрока[КлючИЗначение.Ключ] = Поле.Value;

            КонецЦикла;

        КонецЕсли;

        // Обработка других полей
        RS.MoveNext();

    КонецЦикла;

    // Завершение работы

    RS.Close();
    Connection.Close()

Добавлено: 27 апр 2017, 15:44


http://infostart.ru/public/19783/
Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

magnifico61

Это открытие по названию листа, а мне нужно по номеру, так как название листа изменено.

Dethmontt

Если долго всматриваться в учебник...то в голову может прийти мысль его открыть!

Z.spb

Цитата: magnifico61 от 27 апр 2017, 10:39
Цитата: magnifico61 от 26 апр 2017, 14:34Provider=Microsoft.Jet.OLEDB.12.0;

Разобрался, ошибка была в этой строке.

Добавлено: 27 апр 2017, 13:31


А есть ли возможность при такой схеме чтения файла указать какую страницу читать из файла Excel?

По первой проблеме добавлю, что при чтении по Ado файлов "xlsx" (именно xlsx, с xls всё ок), с ошибкой "Внешняя таблица не имеет предполагаемый формат" вы ещё можете повстречаться и не раз. Особенно если эти файлы были выгружены из 1С. Т.к. 1С не совсем корректно сохраняет в данный формат. Если такой "нечитаемый" файл открыть в Excel, нажать кнопочку сохранить, и выйти из программы, то файл сразу начинает читаться без проблем. У него даже внутренняя структура меняется (можно архиватором открыть и посмотреть). У меня на этот случай написана процедура, которая создаёт Новый COMОбъект("Excel.Application") открывает файл и сохраняет его по новому адресу. После чего попытка Open() происходит ещё раз, уже с новым файлом.

По второй проблеме, у меня используется параметр "НомерИлиИмяЛиста" который может быть как Именем (строка) так и номером (число).
axCatalog = Новый COMОбъект("ADOX.Catalog");                                               
axCatalog.ActiveConnection = Соединение; //у Вас это ADO_Connection
ИмяТаблицы = "";

//Получим или проверим имя листа Excel
Если ТипЗнч(НомерИлиИмяЛиста) = Тип("Число") Тогда
сч=1;
Для каждого Лист ИЗ axCatalog.Tables Цикл
Если сч = НомерИлиИмяЛиста Тогда
ИмяТаблицы = Лист.Name;
Прервать;
КонецЕсли;
сч = сч+1;
КонецЦикла;
Иначе
Для каждого Лист ИЗ axCatalog.Tables Цикл
Если Лист.Name = НомерИлиИмяЛиста
ИЛИ Лист.Name = НомерИлиИмяЛиста + "$" Тогда
ИмяТаблицы = НомерИлиИмяЛиста;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;


Ну и дальше если ИмяТаблицы заполнено, то вы её нашли и к ней делаете запрос, а если нет, то вызываете исключение.

ТекстЗапросаSQL выглядит так: "SELECT * FROM [" + ИмяТаблицы + Диапазон + "]";
У имени таблицы на конце обязательно должен быть знак "$". Если его нет, то предварительно добавляете.
Диапазон это (если кто не знал) читаемый диапазон, т.е. вы сразу можете ограничить выборку, например "А1:C5" - это первые 3 колонки и 5 строк.
Вместо "*" можно написать конкретные имена столбцов, например "[Номенклатура],[Количество]"

   

magnifico61

Цитата: ilyay от 26 апр 2017, 15:45
Драйвера установлены?
Пуск - Панель управления - Администрирование - Источники данных (ODBC)

Обновили сервер 1С на х64. Теперь опять ошибка открытия файла. Как установить драйвер для х64 сервера?
Добавлено: 16 июн 2017, 10:42


Может быть дело в том что Excel х32?
Добавлено: 16 июн 2017, 11:53


неужели никто не может помочь в данном вопросе?

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск