本人刚学delphi不久,现在要求用delphi7写一个oracle导入导出的工具,要求把一张excel表直接导入数据库,并且要有字段的检查,是否匹配,如果一行记录与数据库中的记录主键相同则覆盖它,否则添加到数据库中;导出则要求它的字段宽度与在数据库中的表的字段宽度一样,且可以导出某些字段,即要的字段。
    希望有高手指教,不胜感激,急啊,谢谢。

解决方案 »

  1.   

    导入var
      AStrID : String;
      ARow,ACol,i,j,AMaxCol : Integer;
    begin
      AMaxCol := Col;
      StringGrid.ColCount := 1;
      StringGrid.RowCount := 1;
      FExcelApp := Unassigned;
      FExcelApp := CreateOleObject('Excel.Application');
      FWorkBook := CreateOleObject('Excel.Sheet');
      try
        FWorkBook := FExcelApp.WorkBooks.Open(FileName);
        FWSheet := FWorkBook.Sheets[1];
        ARow := 1;
        ACol := 1;
        AStrID := FWSheet.cells[ARow,CheckCol].value;
        PlShowMsg.Visible := True;
       // FMaxRow := GetMaxRow(FWorkBook.Worksheets[1].UsedRange.Rows.Count);
        while AStrID<>'' do
        begin
          PlShowMsg.Caption :=  '导入条数...'+IntToStr(ARow);
          Application.ProcessMessages;
          if ARow>1 then
            StringGrid.Cells[0,ARow-1] := IntToStr(ARow-1);
          for ACol:=1 to AMaxCol do
          begin
            StringGrid.Cells[ACol,ARow-1] := FWSheet.cells[ARow,ACol].value;
          end;
          Inc(ARow);      AStrID := FWSheet.cells[ARow,CheckCol].value;
        end;
        StringGrid.ColCount := AMaxCol+1;
        StringGrid.RowCount := ARow;
        PlShowMsg.Visible := False;
      finally
        FWorkBook := Unassigned;
        FExcelApp.WorkBooks.Close;
        FExcelApp.Quit;
        FExcelApp := Unassigned;
      end;
    导出  FExcelApp := Unassigned;
      FExcelApp := CreateOleObject('Excel.Application');
      FWorkBook := CreateOleObject('Excel.Sheet');
      try
        FWorkbook := FExcelApp.WorkBooks.Add;
        FWSheet := FWorkBook.ActiveSheet;
        ARow := 1;
        ACol := 1;
        PlShowMsg.Visible := True;
       // 写入数据到Excel中
        for ARow := 0 to StringGrid.RowCount-1 do
        begin
          PlShowMsg.Caption :=  '导入条件...'+IntToStr(ARow+1);
          Application.ProcessMessages;
          for ACol := 1 to StringGrid.ColCount-1 do
          begin
            FWSheet.cells[ARow+1,ACol].value := StringGrid.Cells[ACol,ARow]; 
          end;
        end;
        PlShowMsg.Visible := False;
        ATXT := 'D:D';
    //字段宽度
        FWSheet.Columns[ATXT ].ColumnWidth := 12.63;
    //    ATXT := 'A:N';
    //    FWSheet.Range[ATXT].Select;
    //    FWSheet.Range[ATXT].Colu.AutoFit;
           // FWSheet.Select;
      //  FWSheet.EntireColumn.AutoFit;
        FWorkBook.WorkSheets[1].SaveAs(SaveFilaName);
        FWorkBook.Save;
      finally
        FworkBook.Saved   :=   True;
        FExcelApp.WorkBooks.Close;
        FExcelApp.Quit;
        FExcelApp := Unassigned;
      end;
     只提供参考
      

  2.   

    1、如果Excel表是简单列表,可以通过ADO连接当作一张普通数据库表用SQL语句来读取和写入
    2、如果Excel表格式要求较多,比如有合并单元格、字体格式等需求,则建议通过Excel的OLE接口实现
    3、“字段宽度一样”是指显示格式?