如果你是大牛,请帮我指出错误(我知道代码有问题)。如果你是小菜,这些代码可供你参考。如果你介于两者之间,请不要喷我。
在网上找了7、8种方法。拿到我的环境下发现总是有很多问题导致调试不通过。自己写了一下,请帮忙找错,并指出解决方法。
下面是我的代码:编译环境 delphi 2007 +win7
var
  realfile1: string; //excel模板文件所在位置
  sstrs: array of string;
  I, j, m, n: integer; //
begin
  ProgressBar1.Visible := true;
  ProgressBar1.Max := form1.Width;
  ProgressBar1.Min := 0;
  if SaveDialog1.Execute() then
  begin
    realfile1 := SaveDialog1.FileName;
  end;
  try
    ExcelApplication1.Workbooks.Open(realfile1, 0, true, null, null, null, null, null, null, null, null, null, null, 0);
    ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
    ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _worksheet);
    setlength(sstrs, ExcelWorksheet1.UsedRange[1].Columns.Count);
    for j := 0 to ExcelWorksheet1.UsedRange[1].Columns.Count - 1 do
    begin
      sstrs[j] := (ExcelWorkbook1.Worksheets.Item[1] as _WorkSheet).Cells.Item[1, j + 1];
    end;
    ProgressBar1.Step := round(Form1.Width div (ExcelWorksheet1.UsedRange[1].Rows.Count - 1));
    ProgressBar1.Left := 0;
    ProgressBar1.Position := 0;
    table1.Open;
    if (ExcelWorksheet1.UsedRange[1].Columns.Count <> table1.fieldcount) then
    begin
      showmessage('源、目标表的字段数不一致');
      exit;
    end;
    if (ExcelWorksheet1.UsedRange[1].Columns.Count = table1.fieldcount) then
    begin
      for i := 0 to ExcelWorksheet1.UsedRange[1].Columns.Count - 1 do
      begin
        if sstrs[i] <> table1.fields[i].fieldname then
        begin
          showmessage('源、目标表的字段名不一致');
          exit;
        end;
      end;
    end;    for I := 2 to ExcelWorksheet1.UsedRange[1].Rows.Count do
    begin
      for j := 0 to ExcelWorksheet1.UsedRange[1].Columns.Count - 1 do
      begin
        sstrs[j] := (ExcelWorkbook1.Worksheets.Item[1] as _WorkSheet).Cells.Item[i, j + 1];
      end;
      try
        begintrans();
        with Query1 do
        begin
          n := 1;
          close;
          sql.Clear;
          SQL.ADD('select * from sven where ID = ' + sstrs[0] + ' ');
          open;
          if fieldbyname('ID').asstring = '' then
          begin
            close;
            sql.Clear;
            SQL.ADD('INSERT INTO sven VALUES(' + sstrs[0] + ' ');
            while (n < table1.fieldcount) do
            begin
              sql.add('  ,' + sstrs[n] + '  ');
              inc(n);
            end;
            sql.add(' )  ');
            execsql;
            close;
          end;
          if fieldbyname('ID').asstring <> '' then
          begin
            m := 2;
            close;
            sql.Clear;
            SQL.ADD('update sven set ' + table1.fields[1].fieldname + ' = ' + sstrs[1] + ' ');
            while (m < table1.fieldcount) do
            begin
              sql.Add(' ,' + table1.fields[m].fieldname + ' =' + sstrs[m] + ' ');
              inc(m);
            end;
            SQL.ADD('where ' + table1.fields[0].fieldname + ' = ' + sstrs[0] + ' ');
            inputbox('', '', sql.text);
            execsql;
            close;
          end;
        end;
        committrans();
      except
        rollback();
      end;
      ProgressBar1.Position := (i - 1) * ProgressBar1.Step;
    end;  
    ProgressBar1.Position := form1.Width;
  except
    on e: exception do
    begin
      showmessage('打开excel文件出错。' + e.Message);
      exit;
    end;
  end;
  with query1 do
  begin
    close;
    sql.Clear;
    sql.Add('select * from sven order by ID asc');
    open;
  end;
end;