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 (델파이 코드에서와 같이)를 추가 할 수 있다는 것을 알아 낸 다음 각 매개 변수를 개별적으로 설정하려고했습니다. , 그러나 성공하지 못했습니다.
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;
보시다시피 코드 가독성을 위해 중간 변수를 사용했습니다. 일부는 생략 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다