Как связать Perl с файлом Excel (*.xlsx или *.xls) с помощью ODBC?

Меня попросили изучить возможность использования ODBC в качестве драйвера базы данных, чтобы иметь возможность использовать SQL в книге Excel. Я видел много людей, использующих OLE в качестве драйвера, но единственные пошаговые руководства по ODBC, которые я видел, относятся к подключению к серверу MSSQL или MySQL.

Я подтвердил, что у меня есть установка ODBC и что ниже приведены доступные мне драйверы ODBC. Может ли кто-нибудь пролить свет на подключение к файлу XLS?

Доступные драйверы:

DBI Drivers:
Chart, DBM, ExampleP, File, ODBC, Oracle, Proxy, SQLite, SQLite2, Sponge, mysql

ODBC Drivers:
DBI:ODBC:MS Access Database
DBI:ODBC:Excel Files
DBI:ODBC:dBASE Files
DBI:ODBC:Visio Database Samples
DBI:ODBC:Xtreme Sample Database 2003
DBI:ODBC:Xtreme Sample Database 2008

внутри test.pl

my $dbh = DBI->connect('DBI:ODBC:Driver{Excel Files}MyExcelFile');

person Bob_Gneu    schedule 12.07.2011    source источник
comment
Этот синтаксис - это то, что я ищу: Driver={Excel Files};workbook=c:\x.xls;something=somethingelse; Это будет (в конечном итоге) включено в существующую утилиту создания отчетов, и я не думаю, что создание записи DNS обязательно сработает. Я хотел бы объединить это с более поздним ответом, если это возможно, но сейчас я плохо изучу это для своего POC. Я проголосую, если хоть один из них сработает.   -  person Bob_Gneu    schedule 13.07.2011


Ответы (3)


Для подключения вам нужна строка подключения. Там вы можете использовать описанную версию DSN или показать, какой драйвер вы можете использовать, и использовать определенные свойства драйвера. Для Excel это может выглядеть так:

Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=C:\MyExcel.xls;DefaultDir=c:\mypath;

Дополнительные примеры можно найти по адресу: http://www.connectionstrings.com/excel#p86.

person Michał Niklas    schedule 13.07.2011
comment
Просто чтобы уточнить, мой ответ даст вам строку, которую вы цитируете, после которой вы можете (если хотите) удалить DSN. - person bohica; 13.07.2011
comment
Поразительнй! Спасибо тебе за это! Работает отлично. - person Bob_Gneu; 14.07.2011

Я сейчас не перед компьютером с Windows, но это примерно то, что вам нужно сделать. Найдите администратора ODBC и, в зависимости от того, будете ли вы единственным, кто запускает ваш Perl или другие, также создайте USER или SYSTEM DSN. Выберите Excel в качестве драйвера из списка и нажмите «Добавить», затем заполните все необходимые поля, которые вас просят — по крайней мере, расположение файла Excel. Дайте DSN имя.

Теперь используйте DBI->connect('dbi:ODBC:DSN=name_you_gave_DSN');

После подключения прочитайте об атрибуте odbc_out_connect_string, который возвращает строку подключения ODBC out. Это будет выглядеть примерно так:

Driver={Excel Files};workbook=c:\x.xls;something=somethingelse;

Теперь вы можете использовать эту строку вместо DSN=name_you_have_DSN в вызове подключения, и вам больше не понадобится созданный вами DSN — так называемое соединение без DSN.

После этого есть множество руководств по использованию DBD::ODBC, в том числе на http://www.easysoft.com/developer/languages/perl/index.html

person bohica    schedule 13.07.2011
comment
Мне не удалось заставить ваш пример работать, и я уже был на веб-сайтах easysoft. Хотя за идеи спасибо. Помогли с другой проблемой, которая у нас была. - person Bob_Gneu; 14.07.2011
comment
Мне не удалось подключиться к файлу xls с помощью предоставленной вами строки подключения. Однако это было очень близко к нужной строке, поэтому +1 для вас. - person Bob_Gneu; 15.07.2011

Я использую описанный здесь драйвер Microsoft Excel в так называемом "DSN. -less connection", где указан только драйвер, и вы указываете файл Excel в качестве параметра в самой строке подключения: http://www.connectionstrings.com/excel-2007-odbc/

    my $file = 'c:\temp\myfile.xslx';
    my $dbh = DBI->connect('dbi:ODBC:driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ='.$file.';');

    my $sth = $dbh->prepare( "SELECT * FROM [Sheet1\$]" );

    $sth->execute();

    while (my $row = $sth->fetchrow_hashref) {
        print Dumper( \$row );
    }

Будьте осторожны, если вы используете 64-битный perl и вам нужен доступ к 32-битному драйверу ODBC. Вы не можете смешивать такие биты и должны прибегать к использованию 32-битного perl или какого-либо моста ODBC: Могу ли я использовать 32-битный драйвер ODBC для моего 64-битного приложения

Совсем недавно мне пришлось установить распространяемый пакет Microsoft Access, чтобы получить драйвер Excel в Windows 10: https://stackoverflow.com/a/54757113/74585

person Matthew Lock    schedule 20.10.2015