Ну если ты до данных ячейки добрался, то в чем проблема?
Код:
for i := VarArrayLowBound(Mass, 1) to VarArrayHighBound(Mass, 1) do
begin
ADOTable1.Append;
ADOTable1.Fields[0].AsString := VarAsType(Mass[i, VarArrayLowBound(Mass, 2)], VarOleStr);
ADOTable1.Fields[0].AsString := VarAsType(Mass[i, VarArrayLowBound(Mass, 2)+1], VarOleStr);
ADOTable1.Fields[0].AsString := VarAsType(Mass[i, VarArrayLowBound(Mass, 2)+2], VarOleStr);
//... сколько у тебя там ячеек...
ADOTable1.Post;
end;
А вообще можно попроще сделать.
Тут всавка в MemTable, но это не принципиально, с ADOTable будет работать точно так же.
Это собственно чтение из Экселя:
Код:
procedure XlsLoad(AFileName : String; ACallBack : TLoadCallBack);
var
ExcelApp : OleVariant;
WrkBook : OleVariant;
I : Integer;
ASheet : String;
ARowFrom, ARowTo : Integer;
RI : TRequirementInfo;
RS : TRequirementSchema;
begin
If @ACallBack = Nil Then Raise Exception.Create('Callback doesn''t set.');
If Not FileExists(AFileName) Then Raise Exception.Create('File doesn''t exist.');
ExcelApp := CreateOleObject('Excel.Application');
Try
WrkBook := ExcelApp.Workbooks.Open(AFileName);
Try
If Not GetSheet(ExcelApp,ASheet,RS) Then Exit;
If Not GetRange(WrkBook, ASheet, ARowFrom, ARowTo)
Then Raise Exception.Create('Can''t find cells range.');
If (ARowTo - ARowFrom) < 1 Then Raise Exception.Create('Cells range is empty.');
For I := ARowFrom To ARowTo Do
Begin
If GetRequirement(WrkBook,ASheet,I,RS,RI)
Then ACallBack(RI);
End;
Finally
WrkBook := NULL;
End;
Finally
ExcelApp.Quit;
ExcelApp := NULL;
End;
end;
function GetRequirement(Book : OleVariant; Sheet : String; Row : Integer; Schema : TRequirementSchema; var RI : TRequirementInfo) : Boolean;
var
Buf : String;
begin
Result := False;
Try
RI.Number := StrToInt(Book.WorkSheets[Sheet].Range['A'+IntToStr(Row)].Text);
RI.ReqName := Book.WorkSheets[Sheet].Range['B'+IntToStr(Row)].Text;
RI.TgtName := Trim(Book.WorkSheets[Sheet].Range['C'+IntToStr(Row)].Text);
Buf := Trim(Book.WorkSheets[Sheet].Range['D'+IntToStr(Row)].Text);
ParseType(Buf,RI.TgtType,RI.TgtTypeLen,RI.TgtTypeLenDec);
RI.SrcName := Trim(Book.WorkSheets[Sheet].Range['I'+IntToStr(Row)].Text);
Buf := Trim(Book.WorkSheets[Sheet].Range['J'+IntToStr(Row)].Text);
ParseType(Buf,RI.SrcType,RI.SrcTypeLen,RI.SrcTypeLenDec);
Buf := Book.WorkSheets[Sheet].Range['K'+IntToStr(Row)].Text;
Buf := Trim(UpperCase(Buf));
RI.Nulls := (Buf = 'YES') Or (Buf = 'Y') Or (Buf = 'NULL');
RI.Normalize := False;
// Fix empty logical name
If Trim(RI.ReqName) = '' Then RI.ReqName := RI.TgtName;
Result := True;
Except
End;
end;
А вот функция, которая будет вызываться из вышеприведенной (соственно вставка):
Код:
procedure TMainForm.AddRow(RI: TRequirementInfo);
var
Buf : String;
bGo : Boolean;
begin
mdReqs.Append;
Try
// Exclude lines with empty ('', n/a, derived) source field.
Buf := AnsiUpperCase(Trim(RI.SrcName));
bGo := Not((Buf = '') Or (Buf = 'N/A') Or (Buf = 'DERIVED'));
mdReqs.FieldByName('Go').AsBoolean := bGo;
mdReqs.FieldByName('Num').AsInteger := RI.Number;
mdReqs.FieldByName('Name').AsString := RI.ReqName;
mdReqs.FieldByName('TgtName').AsString := RI.TgtName;
mdReqs.FieldByName('TgtType').AsString := RI.TgtType;
mdReqs.FieldByName('TgtTypeLen').AsInteger := RI.TgtTypeLen;
mdReqs.FieldByName('TgtTypeLenDec').AsInteger := RI.TgtTypeLenDec;
mdReqs.FieldByName('SrcName').AsString := RI.SrcName;
mdReqs.FieldByName('SrcType').AsString := RI.SrcType;
mdReqs.FieldByName('SrcTypeLen').AsInteger := RI.SrcTypeLen;
mdReqs.FieldByName('SrcTypeLenDec').AsInteger := RI.SrcTypeLenDec;
mdReqs.FieldByName('Nulls').AsBoolean := RI.Nulls;
mdReqs.FieldByName('Normalize').AsBoolean := RI.Normalize;
mdReqs.FieldByName('ExtValues').AsString := '';
mdReqs.Post
Except
mdReqs.Cancel;
End;
end;
mdReqs - это наследник TTable (ну если по простому...)
Не смотри, что так сложно сделано, там не просто так все, нужно было еще кучу всего проверить и т.д.
Пойми принцип работы, тогда можно переписать короче и проще.