Показать сообщение отдельно
  #2  
Старый 23.12.2018, 01:54
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,593
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну если ты до данных ячейки добрался, то в чем проблема?
Код:
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 (ну если по простому...)
Не смотри, что так сложно сделано, там не просто так все, нужно было еще кучу всего проверить и т.д.
Пойми принцип работы, тогда можно переписать короче и проще.
Ответить с цитированием