我想从 Delphi 创建一个新的 Excel 工作簿,但在从 Delphi 打开它之前,我首先要设置与现有 MySQL 数据库的 ODBC 连接,并设置查询。
然后当它打开时,它将立即提取数据。
我尝试的是首先在 Excel 中记录宏,然后查看它是如何在 VBA 中建立连接的。
然后我尝试在 Delphi 中复制 VBA。
这是我尝试过的:
var
xls, wb : OLEVariant;
begin
xls := CreateOLEObject('Excel.Application'); {initialize an instance of Excel}
wb := xls.Workbooks.Add; {create workbook}
//xls.ActiveSheet.ListObjects.Add(SourceType:=0, Source:='ODBC;DSN=MySQL;', Destination:=Range('$A$1')).QueryTable; //this throws a missing operator or semicolon error
xls.Worksheets[1].ListObjects.Add(); //add a listobject
xls.WorkBooks[1].Worksheets[1].ListObjects.Item[1].QueryTable[1].CommandText := 'SELECT 1';
...
end;
但在尝试设置 CommandText 时,我收到 OLE 错误 800A03EC下面是 VBA 代码。
我通过从新工作簿中记录宏来获得它。
在第一行,我尝试了很多关于如何输入连接字符串的组合,最终我发现我可以添加一个 ListObject(就像在我的 Delphi 代码中一样)而不会出现任何错误,然后我尝试分别设置每个参数,但没有成功。
Sub Macro1()
'
' Macro1 Macro
'
'
Application.CutCopyMode = False
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:="ODBC;DSN=MySQL;", _
Destination:=Range("$A$1")).QueryTable
.CommandType = 0
.CommandText = Array("SELECT 1")
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.ListObject.DisplayName = "Table_Query_from_MySQL"
.Refresh BackgroundQuery:=False
End With
End Sub
最佳答案
这是一个几乎直接复制 VBA 代码的解决方案:
procedure TForm1.Button1Click(Sender: TObject);
var
ExcelApplication : Variant;
WorkBook : Variant;
ActiveSheet : Variant;
ListObject : Variant;
Range : Variant;
QueryTable : Variant;
begin
ExcelApplication := CreateOLEObject('Excel.Application');
WorkBook := ExcelApplication.Workbooks.Add;
ActiveSheet := ExcelApplication.ActiveSheet;
Range := ActiveSheet.Range['A1', 'A1'];
ListObject := ActiveSheet.ListObjects.Add(
0, // SourceType,
'ODBC;DSN=MySQL;', // Source,
TRUE, // LinkSource,
xlGuess, //XlListObjectHasHeaders,
Range); // Destination
QueryTable := ListObject.QueryTable;
QueryTable.CommandType := xlCmdSql;
QueryTable.CommandText := 'SELECT 1';
QueryTable.RowNumbers := FALSE;
QueryTable.FillAdjacentFormulas := FALSE;
QueryTable.PreserveFormatting := TRUE;
QueryTable.RefreshOnFileOpen := FALSE;
QueryTable.BackgroundQuery := TRUE;
QueryTable.RefreshStyle := xlInsertDeleteCells;
QueryTable.SavePassword := FALSE;
QueryTable.SaveData := TRUE;
QueryTable.AdjustColumnWidth := TRUE;
QueryTable.RefreshPeriod := 0;
QueryTable.PreserveColumnInfo := TRUE;
QueryTable.ListObject.DisplayName := 'Table_Query_from_MySQL';
QueryTable.Refresh(False); // BackgroundQuery
end;
如您所见,我使用中间变量来提高代码的可读性。你可以省略其中的一些。
关于excel - 如何从 Delphi 在 Excel 中设置 MySQL/ODBC 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63900731/