Есть ли способ заставить ADODB работать с Excel для Mac 2011? - PullRequest
6 голосов
/ 14 марта 2012

Я не могу заставить мою книгу Excel (используя ADODB) работать с Excel Mac 2011. Я использую код ADODB. Доступны ли надстройки? Даже от стороннего? Кто-нибудь заставил это работать?

Ответы [ 3 ]

4 голосов
/ 05 августа 2014

ADODB НЕ поддерживается в Mac Excel 2011, но ODBC работает в сочетании с драйвером стороннего производителя.

Я получил драйверы ODBC от ActualTech . Скачайте и установите их программу, и у вас будут необходимые драйверы для подключения к SQL-серверам и базам данных (бесплатно, 35 долларов США).

Следующий код создает соединение с базой данных mySQL и возвращает информацию из базы данных в ячейку A1:

Dim connstring as String
Dim sqlstring as String

connstring = "ODBC;DRIVER={Actual Open Source Databases};" _
& "SERVER=<server_location>;DATABASE=<database>;" _
& "UID=<userID>;PWD=<password>;Port=3306"
sqlstring = "select * from <database_table>"

With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstring)
  .BackgroundQuery = False
  .Refresh
End With
3 голосов
/ 14 марта 2012

Доступны ли надстройки?Даже от стороннего производителя?

Надеюсь, эти ссылки для загрузки помогут?

Драйверы ODBC, совместимые с Excel для Mac


Цитируется из MSKB на случай, если связь прекратится

Драйверы ODBC, совместимые с Excel для Mac

Если вы хотите импортировать данные в Excel для Mac из базы данных, вам необходим драйвер Open Database Connectivity (ODBC) , установленный на вашем Mac.Получаемый вами драйвер зависит от того, какая у вас версия Excel для Mac.

Excel для Mac 2011

В этой версии Excel отсутствует драйвер ODBC.Вы должны установить его самостоятельно.Драйверы, совместимые с Excel для Mac 2011, доступны от следующих компаний:

OpenLink Software

Actual Technologies

Simba Technologies

После установки драйвера для своего источника вы можете использовать Microsoft Query для создания новых запросов или обновления существующих запросов, которые были созданы в других версиях Excel, таких как Excel X, Excel2004 и Excel для Windows.Для получения дополнительной информации см. Импорт данных из базы данных в Excel для Mac 2011 .

Excel 2016 для Mac

Эта версия Excel предоставляетдрайвер ODBC для подключения к базам данных SQL Server.На вкладке Данные нажмите Новый запрос к базе данных > ODBC для SQL Server .Затем используйте диалоговые окна для импорта данных.

Если вы подключаетесь к другим источникам данных ODBC (например, FileMaker Pro), вам необходимо установить драйвер ODBC для источника данных на вашем Mac,Драйверы, совместимые с Excel для Mac, доступны в следующих компаниях:

Программное обеспечение OpenLink

Actual Technologies

Кто-нибудь заставил это работать?

Извините, я никогда не использовал его.

0 голосов
/ 04 октября 2018

Есть два способа заставить Mac Excel запрашивать MySQL: (1) VBA и (2) драйвер ODBC.


(1) VBA для создания таблицы из запроса (и обновления ее новым запросом):

Option Explicit

Sub WaitQueryTableRefresh(ByVal qt As QueryTable)
    While qt.Refreshing
        Application.Wait (Now + TimeValue("0:00:01"))
    Wend
End Sub

Sub ErrorIfQueryTableOverflowed(ByVal qt As QueryTable)
    If qt.FetchedRowOverflow Then
        err.Raise 5, "ErrorIfQueryTableOverflowed", _
            "QueryTable '" & qt.ListObject.Name & "' returned more rows than can fit in the spreadsheet range"
    End If
End Sub

' Create a table from scratch
Function CreateTableFromSql( _
 ByVal table_sheet As Worksheet, _
 ByVal table_range As Range, _
 ByVal table_name As String, _
 ByVal sql As String _
 ) As ListObject
    ' table_range is simply the top-left, corner cell for the table

    'ListObject.SourceType
        'https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.xllistobjectsourcetype?view=excel-pia

    'QueryTable.CommandType
        'https://docs.microsoft.com/en-us/office/vba/api/Excel.QueryTable.CommandType

    'QueryTable.BackgroundQuery
        'https://docs.microsoft.com/en-us/office/vba/api/excel.querytable.backgroundquery

    'QueryTable.RefreshStyle
        'https://docs.microsoft.com/en-us/office/vba/api/excel.xlcellinsertionmode

    'QueryTable.PreserveColumnInfo
        'https://stackoverflow.com/a/28621172
        'https://docs.microsoft.com/en-us/office/vba/api/Excel.QueryTable.PreserveColumnInfo

    Dim global_odbc_str As String
    global_odbc_str = "ODBC;DSN=my_dsn_name;"

    Dim qt As QueryTable
    Set qt = table_sheet.ListObjects.Add( _
        SourceType:=xlSrcExternal, _
        Source:=global_odbc_str, _
        Destination:=table_range _
    ).QueryTable

    With qt
        .ListObject.Name = table_name
        .ListObject.DisplayName = table_name
        .CommandText = sql
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = False
        .Refresh BackgroundQuery:=False
    End With

    Call WaitQueryTableRefresh(qt)
    Call ErrorIfQueryTableOverflowed(qt)

    Set CreateTableFromSql = qt.ListObject
End Function

' Update a table (columns do not have to be the same)
Sub UpdateTableFromSql( _
 ByVal table As ListObject, _
 ByVal sql As String _
 )
    Dim qt As QueryTable
    Set qt = table.QueryTable

    qt.CommandText = sql
    qt.Refresh BackgroundQuery:=False

    Call WaitQueryTableRefresh(qt)
    Call ErrorIfQueryTableOverflowed(qt)
End Sub

(2) Настройка драйвера MySQL ODBC (бесплатно)

Установка в соответствии с MySQL docs :

(a) Установка (зависимость) iODBC Admin: http://www.iodbc.org/dataspace/doc/iodbc/wiki/iodbcWiki/Downloads

(b) Установить драйвер MySQL ODBC: https://dev.mysql.com/downloads/connector/odbc/

(c) Mac требует, чтобы все приложения (включая Excel) были помещены на карантин в изолированную программную среду. Из-за этого вам нужно переместить драйвер MySQL туда, где Excel может получить к нему доступ. Причиной неудачи в этом является то, что соединение DSN будет Test успешно в iODBC, но не будет Test в ODBC Excel.

Переместить драйвер в соответствии с this :

#!/bin/bash

# https://github.com/openlink/iODBC/issues/29
# https://bugs.mysql.com/bug.php?id=89931

base_src_dir="/usr/local"
mysql_odbc_name=$(ls "$base_src_dir" | grep -m 1 "mysql-connector-odbc")
odbc_dir="/Library/ODBC"

src="$base_src_dir/$mysql_odbc_name/lib"
dst="$odbc_dir/$mysql_odbc_name/lib"

echo "creating '$dst'"
sudo mkdir -p "$dst"

echo "copying '$src' to '$dst'"
sudo cp -af "$src/." "$dst"


odbc_ini_path="$odbc_dir/odbc.ini"
odbc_ini_bak_path="$odbc_ini_path.bak"

odbcinst_ini_path="$odbc_dir/odbcinst.ini"
odbcinst_ini_bak_path="$odbcinst_ini_path.bak"

echo "backing up '$odbc_ini_path' to '$odbc_ini_bak_path'"
sudo cp -f "$odbc_ini_path" "$odbc_ini_bak_path"

echo "backing up '$odbcinst_ini_path' to '$odbcinst_ini_bak_path'"
sudo cp -f "$odbcinst_ini_path" "$odbcinst_ini_bak_path"

# https://stackoverflow.com/a/29626460
function replace {
  sudo sed -i '' "s/$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< "$1")/$(sed 's/[&/\]/\\&/g' <<< "$2")/g" "$3"
}

ansi_driver=$(ls "$dst" | grep -m 1 "^lib.*a\.so$")
unicode_driver=$(ls "$dst" | grep -m 1 "^lib.*w\.so$")

old_ansi_path="$src/$ansi_driver"
new_ansi_path="$dst/$ansi_driver"

old_unicode_path="$src/$unicode_driver"
new_unicode_path="$dst/$unicode_driver"

echo "updating '$old_ansi_path' to '$new_ansi_path' in '$odbc_ini_path'"
replace "$old_ansi_path" "$new_ansi_path" "$odbc_ini_path"

echo "updating '$old_ansi_path' to '$new_ansi_path' in '$odbcinst_ini_path'"
replace "$old_ansi_path" "$new_ansi_path" "$odbcinst_ini_path"

echo "updating '$old_unicode_path' to '$new_unicode_path' in '$odbc_ini_path'"
replace "$old_unicode_path" "$new_unicode_path" "$odbc_ini_path"

echo "updating '$old_unicode_path' to '$new_unicode_path' in '$odbcinst_ini_path'"
replace "$old_unicode_path" "$new_unicode_path" "$odbcinst_ini_path"

Выше было проверено на High Sierra с Excel 2016.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...