您的位置:首页 > 其它

用ADO控件操作Excel的.xls文件的最详细的教程(2013.11.29首发)

2013-11-29 08:57 926 查看
用ADO控件操作Excel的.xls文件

用ADO操作Excel的.xls文件有速度快,可以在一定条件下突破Excel的总行数限制(超过这个行数限制在Excel中操作可能会有问题),操作具有真正的隐秘性等优点。

而用OLE操作Excel文件有两个弊端,一是操作的效率较低占用资源较大,二是需要安装Office中的Excel或WPS Office的WPS表格。

但用ADO如数据库一般操作Excel的.xls文件使用的人较少,为此我将ADO操作Excel的.xls文件的方法及注意事项整理如下,供广大初学者研究和使用:

  第一步:准备Excel文件:

  1)新建一个Excel文件;

  2)在文件的一个工作簿的第一行逐个输入列名称;

  3)用鼠标选取第一行包含列名称的单元格;注意:选中有列名称的单元格就可以了,否则运行时输入数据出错,并且只能操作和显示选中行数减一的行;

  4)在菜单“插入->名称->定义”中弹出的对话框中输入表名称;

  5)保存Excel文件的修改。

  说明:第一行(列名称所在的行)可以选择隐藏,不影响使用。

  第二步:设置ADOTable控件(ADOQuery等亦可,此处仅以ADOTable为例)的连接串:

  (1)添加一个ADOTable控件至窗体上,单击ConnectionString属性右方的对话框按钮,打开数据库连接对话框;

  (2)单击Use Connection String单选按钮中的Build..按钮;

  (3)选取Microsoft Jet 4.0 OLE DB Provider驱动程序(该驱动除了可以连接*.mdb的Access文件外,还可以连接*.xls的Excel文件);

  (4)单击[数据连接属性]对话框里[提供者]选项卡的[下一步]按钮,在里面选择要连接的Excel文件;

  (5)单击[数据连接属性]对话框里的[所有]选项卡标签,来修改里面的Extended Properties:

  双击Extend Properties属性,在文本框里输入“Excel 8.0”,这代表我们要利用Microsoft Jet 4.0 OLE DB Provider驱动程序来连接Excel文件而不是Access文件!

  (6)把ADOTable组件的TableName属性选定为要打开的工作表;注意:带“$”的不是真正的表名称,不要选,否则出错。

  注:用ADOQuery等控件可以这样打开:SELECT * FROM [书籍销售$]; // 要加$?

  第三步:在.cpp文件里添加如下代码:

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
  //ADOTable1->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BOOK.xls;Extended Properties=Excel 8.0;Persist Security Info=False"; // 典型连接串
  ADOTable1->Open();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  ADOTable1->Close();
}

// 连接例子①:-----------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ADOQuery1->Close();
  ADOQuery1->SQL->Clear(); // 用于清空ADOQuery
  ADOQuery1->ConnectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=工作表.xls;Extended Properties=Excel 8.0;Persist Security Info=False";
  //ADOQuery1->Connection=ADOConnection1;
  //ADOQuery1->Filtered=false; // 关闭过滤
  ADOQuery1->SQL->Add("SELECT * FROM [编码];");
  ADOQuery1->Open();
  //ADOQuery1->ExecSQL(); // 写入删除或修改数据时使用
}

// 完整例子②:将SQLServer中的数据写入Excel数据库:---------------------------

⑴ 在.cpp文件中添加:-------------------------

extern PACKAGE TForm1 *Form1;
  extern PACKAGE AnsiString iADOcs1; // 主要数据库的连接串
  extern PACKAGE AnsiString iADOcs2; // 主要数据库的连接串
//---------------------------------------------------------------------------
#endif

⑵ 在.h文件中添加:---------------------------

#pragma resource "*.dfm"
TForm1 *Form1;
  AnsiString iADOcs1; // 主要数据库的连接串
  AnsiString iADOcs2; // 主要数据库的连接串
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  iADOcs1="Provider=SQLOLEDB.1;Password=qazxsw21;Persist Security Info=True;User ID=pdm;Initial Catalog=pdm;Data Source=wdserver3";
  iADOcs2="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=工作表.xls;Extended Properties=Excel 8.0;Persist Security Info=False";
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  ADOQuery1->Close();
  ADOQuery1->SQL->Clear(); // 用于清空ADOQuery
  ADOQuery1->ConnectionString=iADOcs1;
  ADOQuery1->SQL->Add("SELECT oid,name,doctype,createtime,creater FROM pdmDocmaster ORDER BY createtime DESC;");
  ADOQuery1->Open();
  ADOQuery1->First();
  ADOCommand1->ConnectionString=iADOcs2; // 连接字符串
  AnsiString iT1,iT2,iT3,iT4,iT5;

  ProgressBar1->Max=ADOQuery1->RecordCount; // 设置最大值
  ProgressBar1->Position=0; // 设置进度条进度
  ProgressBar1->Left=(Form1->Width-ProgressBar1->Width)/2; // 设置进度条的横向位置在中间
  ProgressBar1->Visible=true; // 显示进度条

    while(!ADOQuery1->Eof)//如果不为空
    {
      iT1=ADOQuery1->FieldByName("oid")->AsString.Trim();
      iT2=ADOQuery1->FieldByName("name")->AsString.Trim();
      iT3=ADOQuery1->FieldByName("doctype")->AsString.Trim();
      iT4=ADOQuery1->FieldByName("createtime")->AsString.Trim();
      iT5=ADOQuery1->FieldByName("creater")->AsString.Trim();
      ADOCommand1->CommandText="INSERT INTO 编码(编码,名称,类别,时间,人员)VALUES('"+iT1+"','"+iT2+"','"+iT3+"','"+iT4+"','"+iT5+"');";
      ADOCommand1->Execute();
      ADOQuery1->Next();
      ProgressBar1->Position++; // 进度条进度增加
    }
  ProgressBar1->Visible=false; // 隐藏进度条
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: