Excel编程问题,求助(读取数据问题),急急!

centerarea 2003-10-09 01:32:13
我要将Excel中的数据导出到StringGrid中,事先想知道Excel数据中有多少行和列,如果有现例代码的朋友,请共享下,分全给你了,虽能不多,但是我仅有的分了。
...全文
471 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shiufurong007 2004-03-07
  • 打赏
  • 举报
回复
up
shiufurong007 2004-02-24
  • 打赏
  • 举报
回复
p
ccrun.com 2003-10-30
  • 打赏
  • 举报
回复
获取Excel当前Sheet中有多少行和多少列:

Sheet1.PG("UsedRange").PG("Columns").PG("Count"); //列数
Sheet1.PG("UsedRange").PG("Rows").PG("Count"); //行数
andy_qhz 2003-10-30
  • 打赏
  • 举报
回复

---- 运行C++Builder,在Form1中加上Data Access的三个控件:Database1、 DataSource1、Table1,加入Database1的目的是为了避免打开数据库时出现登录框,为此双击此控件弹出一对话框,在Alias name中选ODBC数据源名(本例为Excel01),在Name中填上一新的别名(本例取Excel02),再点“Defaults” 出现一批参数缺省值,最后取消Options中的两项“Login prompt"与"Keep inactive connect”,点OK退出;

---- 4.设置其它控件属性:

---- 将Table1的属性DatabaseName选为步骤3中的新别名Excel02,再将另一属性TableName选为步骤1的表名(本例为ABC);将控件DataSource1的属性 DataSet选为Table1;双击Form1,在FormCreate事件子程序内加上一句 Table1- >Open( );

---- 5.查看数据库内容:

---- 为了直接看到Excel数据,在Form1中再加上Data Controls的控件DBGrid1 和DBNavigator1,将两者的属性DataSource都选为DataSource1,双击Table1 的属性Active将值改为true,等待数秒就可看到DBGrid1中出现数据,最后恢复Tabel1- >Active为false;

---- 注意:程序编译前,必须将刚打开的表关闭,即:使Table1- >Active为false, 否则程序运行时报告出错,因为Excel表总是被ODBC以“独占”方式打开;

//指定列宽

vTmpCentral=vExcelApp.OlePropertyGet("ActiveSheet");

vTmpCentral.OlePropertyGet("Columns","A").OlePropertySet("ColumnWidth",4.5);

vTmpCentral.OlePropertyGet("Columns","B").OlePropertySet("ColumnWidth",12.13);

vTmpCentral.OlePropertyGet("Columns","C").OlePropertySet("ColumnWidth",8.25);

vTmpCentral.OlePropertyGet("Columns","D").OlePropertySet("ColumnWidth",7.88);

vTmpCentral.OlePropertyGet("Columns","E").OlePropertySet("ColumnWidth",14.25);

vTmpCentral.OlePropertyGet("Columns","F").OlePropertySet("ColumnWidth",9.75);

vTmpCentral.OlePropertyGet("Columns","G").OlePropertySet("ColumnWidth",12.75);

vTmpCentral.OlePropertyGet("Columns","H").OlePropertySet("ColumnWidth",11.75);


vTmpCentral.OlePropertyGet("Columns","I").OlePropertySet("ColumnWidth",20);

vTmpCentral.OlePropertyGet("Columns","J").OlePropertySet("ColumnWidth",9.75);

vTmpCentral.OlePropertyGet("Columns","K").OlePropertySet("ColumnWidth",17.00);

vTmpCentral.OlePropertyGet("Columns","L").OlePropertySet("ColumnWidth",10.13);

vTmpCentral.OlePropertyGet("Columns","M").OlePropertySet("ColumnWidth",11.13);

vTmpCentral.OlePropertyGet("Columns","N").OlePropertySet("ColumnWidth",13.13);

vTmpCentral.OlePropertyGet("Columns","O").OlePropertySet("ColumnWidth",13);

vTmpCentral.OlePropertyGet("Columns","P").OlePropertySet("ColumnWidth",13);

vTmpCentral.OlePropertyGet("Columns","Q").OlePropertySet("ColumnWidth",16.75);

vTmpCentral.OlePropertyGet("Columns","R").OlePropertySet("ColumnWidth",10);


//***********************如何从Excel中取数据*****************************************************

MyExcel:=createoleobject('Excel.Application');
MyWorkbook:=MyExcel.Workbooks.Open(datamodule2.OpenDialog1.FileName);
MyExcel.Visible:=false;
myworksheet1:=myexcel.activesheet;
for bom_cell:=1 to myworksheet1.usedrange.columns.Count do
begin
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='类别' then
fuxiang_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='产品编码' then
type_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='型号' then
name_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='出口国家' then
guige_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='周计划' then //材料
cailiao_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='上次欠产' then
danwei_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='单位' then
danhao_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='当日' then
gongxu_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='累计' then
plat_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='备注' then
danhao_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='欠产' then
gongxu_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='分厂名称' then
plat_field:=bom_cell;
if varastype(myworksheet1.cells.item[1,bom_cell],varstring)='数据日期' then
plat_field:=bom_cell;
end;
//执行存储过程
dm.adoq1.Close;
dm.adoq1.SQL.Clear;
dm.adoq1.SQL.add('');
dm.adoq1.ExecSQL;
try For bom_cell:=2 To myworksheet1.usedrange.Rows.Count do
begin
dm.ADOQ1.Close;
dm.ADOQ1.SQL.Clear;
上面说明了怎么取excel中的数据
//***************************************************************************************************


一 引言

C++ builder 5.0是Inprise公司推出的基于C++语言的可视化开发语言,不仅具有新颖的可视化设计工具,还配有数据库引擎,可以通过SQL连接或ODBC访问多种数据库,并具有开发基于Client/Server模式的数据库应用程序的能力。当我们进行数据库软件开发的时候,一般要进行大量报表设计,尤其当涉及到设计多重报表或交叉报表时,我们会觉得力不从心。利用EXCEL强大的电子表格处理功能,可以解决C++ Builder 自带报表工具功能少的缺陷。

C++ Builder调用Excel常用的方法有两种:一种是利用OLE技术调用Excel。OLE(对象的连接和嵌入)是微软公司提出的标准,它提供了一种用源于不同应用程序的信息创建复合文档的强有力方法。第二种是利用ODBC数据库技术调用Excel。第一种方法比较简单,方便,本文讨论的是第一种方法。

二 系统功能要求

随着电子化办公的推广和保险业务的全面开展,账本式的管理方法已不能对数据庞大的电子化设备进行合理有效的管理,这就要求电子化的管理方式,通过计算机和公司局域网实现对设备进行管理。我们开发的电子化管理软件由电子化设备管理数据库、电子化设备耗材管理数据库组成,信息技术管理人员可以对本数据库进行添加、删除、修改、查询等操作,并且可以打印各种查询表格,表格按照EXCEL格式进行打印,并且保存归档。

C++Builder软件自带创建报表工具,如QReport控件。但是相对于EXCEL强大的电子表格处理功能和方便的操作而言,QReport控件功能就显得很苍白。在该管理软件中,我们将查询结果自动生成EXCEL表格,然后在EXCEL环境下进行打印或者保存文件。具体函数实现在下面的段落中进行详细说明,并且都给出示例。

三 函数的实现

要在应用程序中控制Excel2000的运行,首先必须在编制自动化客户程序时使其头文件要包含Comobj.hpp和Utilcls.h。

即:#include<Comobj.hpp>

#include<Utilcls.h>

C++ Builder开发者把Excel自动化对象的功能包装在下面的四个Ole Object Class函数中,应用人员可以很方便地进行调用。

设置对象属性:Variant OlePropertySet(属性名,参数……);

获得对象属性:void OlePropertyGet(属性名,参数……);

调用对象方法:1) Variant OleFunction(函数名,参数……);

2) void OleProcedure(过程名,参数……);

C++ Builder中使用OLE控制Excel2000,必须掌握Excel2000的自动化对象及Microsoft Word Visual Basic帮助文件中的关于Excel的对象、方法和属性。对象是一个Excel元素,属性是对象的一个特性或操作的一个方面,方法是对象可以进行的动作。

1、Excel中常用的对象是:Application,Workbooks,Worksheets等。

(1) 创建应用对象:如:

Variant ex;

ex=Variant::CreateObject ("Excel.Application");

或者 ex=CreateOleObject ("Excel.Application");

(2) 创建工作簿对象:

Variant wb;

wb=ex.OlePropertyGet("ActiveWorkBook");

(3) 创建工作表对象:

Variant sheet;

sheet=wb.OlePropertyGet("ActiveSheet");

(4) 创建区域对象:

Variant range;

range=sheet.OlePropertyGet("Range","A1:A10");
andy_qhz 2003-10-30
  • 打赏
  • 举报
回复
catch(...)
{
Application->MessageBox("操作Excel表格失败!",
"错误",MB_ICONSTOP|MB_OK);
Wb.OleProcedure("Close");
Ex.OleFunction("Quit");
SaveButton ->Enabled = true;
ReadButton ->Enabled=false;
}
}
至此,完成报表数据的写入工作。如果要对完成的Excel表进行操作,可以点击“打开Excel表文件按钮”(ReadButton),进行修改,保存,打印等操作。ReadButton的单击事件如下实现:
void __fastcall TForm1:: ReadButtonClick(TObject *Sender)
{
try
{
//指定report目录下的报表文件用于用户操作
AnsiString ExcelFileName =
GetCurrentDir();+"\\report\\table.xls";

if(!FileExists(ExcelFileName))
{
Application->MessageBox("Excel表文件不存在,无法打开!",
"错误",MB_ICONSTOP|MB_OK);
return;
}

try
{
Ex = Variant::CreateObject("Excel.Application");
}
catch(...)
{
Application->MessageBox("无法启动Excel","错误",MB_ICONSTOP|MB_OK);
return;
}
//使Excel可见
Ex.OlePropertySet("Visible",true);
//打开Excel表格文件Table.xls
Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",ExcelFileName.c_str());
}
catch(...)
{
Application->MessageBox("操作Excel表格错误!","错误",MB_ICONSTOP|MB_OK);
Ex.OleFunction("Quit");
}
}

AnsiString EditText = Edit1->Text;
Label1->Caption = "";
for (int i=1;i<=EditText.Length();i++)
{
Label1->Caption = Label1->Caption + IntToHex(EditText[i],2) + " ";

}




---- 一.用OLE技术操纵Excel

---- OLE(对象链接与嵌入)是微软提出的标准,是应用程序间交换数据、相互操作的一种方式,MS OFFICE 提供了很强的 OLE 服务功能,VB、Delphi 及C++Builder等语言都可以以客户方式向Excel提交命令,以存取其数据,其中VB和Delphi最为简单,在语法上就采用类VBA的语句,本报九九年第48期的《在Delphi中操作Excel》一文曾介绍了Delphi的做法。我们原以为C++Builder照搬Delphi,结果语法编译都未能通过,查不到这方面具体介绍的资料。经反复试验方知:原来C++Builder采用间接的办法,利用变体类Variant所提供的四个“方法”向OLE服务程序提交操纵命令:

Variant Variant::OlePropertyGet(属性名,参数….);
// 取对象属性
Void Variant::OlePropertySet(属性名,参数….);
// 设置对象属性
Variant Variant::OleFunction(函数名,参数….);
// 运行对象的函数
void Variant::OleProcedure(过程名,参数….);
// 运行对象的过程

其头文件“vcl\utilcls.h”必须嵌在用户程序中,
对于这四个长长的方法名可在程序中用宏语句重新定义一下:
#define PG OlePropertyGet
#define PS OlePropertySet
#define FN OleFunction
#define PR OleProcedure

例如对于VB的提交语句:
Ex.ActiveWorkBook.ActiveSheet.Cells(1,2).Value=3
为便于理解在C++Builder对应的语句可分解为如下四句:
Variant t1=Ex.OlePropertyGet("ActiveWorkBook");
Variant t2=t1.OlePropertyGet("ActiveSheet");
Variant t3=t2.OlePropertyGet("Cells,1,2);
t3.OlePropertySet("Value",3);
可去掉中间变量将这四句合为一句,就是:
Ex.PG("ActiveWorkBook").PG("ActiveSheet").
PG("Cells",1,2).PS("Value",3);
我们将下面的VB程序片段改成对应的C++Builder程序以供参考:
Private Sub Command1_Click() ' Visual Basic程序片段
Dim Ex As Object,Wb As Object, Sh1 As Object
Set Ex = CreateObject("Excel.Application")
Ex.WorkBooks.Open("c:\book1.xls")
Set Wb = Ex.Activeworkbook
Set Sh1 = Wb.ActiveSheet
Text1.Text = Sh1.Cells(1, 1).Value
For i = 1 To 10: For j = 1 To 10
Sh1.Cells(i, j).Value = i * 100 + j
Next j: Next i
Wb.save: Wb.Close: Ex.Quit
End Sub ' - - - - - -- - - - - - - - - - -

#include "Unit1.h" // C++Builder程序片段
#include "vcl\utilcls.h" // util classes实用类说明
// …省写此处原一段代码
// 请在此处插入上面提及的四个宏定义语句
void __fastcall TForm1::Button1Click(TObject *Sender)
{ Variant Ex,Wb,Sh1;
Ex=Variant::CreateObject("Excel.Application");
Ex.PG("WorkBooks").PR("Open","c:\\book1.xls");
Wb=Ex.PG("ActiveWorkBook"); Sh1=Wb.PG("ActiveSheet");
Edit1->Text=Sh1.PG("Cells",1,1).PG("Value");
for (int i=1;i<=10;i++)
for (int j=1;j<=10;j++)
Sh1.PG("Cells",i,j).PS("Value",i*100+j);
Wb.PR("Save"); Wb.PR("Close");
}

---- 使用这种方法的程序运行时,必须保证系统中同时有MS OFFICE;下面我们再介绍另一种脱离MS OFFICE也能存取Excel表格的方法。
---- 二.用ODBC数据库技术存取Excel

---- ODBC就是开放式数据库链接标准,不同种类的数据库只需提供各自的ODBC 驱动程序就可按相同的命令操纵,微软同样为Excel提供了ODBC驱动程序,我们可在程序中象数据库一样存取Excel表格。定义好ODBC数据源后,实际试验中并没有如想象的那样简单,在控件Table的属性TableName中总是检索不到表名,同样也没有相关的资料可供查阅。通过对Excel的分析,终于发现了问题的关键所在:ODBC的表名并不就是Excel的工作表名(如Sheet1),在Excel 表格中必须对要求操作的行列区域定义一个“名称”作为数据库的表名,该区域的首行各列必须是字段名(否则首行数据会当成字段名),可以定义多个表名。具体操作步骤如下:

---- 1.在Excel上定义“表名”:

---- 运行Excel程序,打开或新建一表格,按下鼠标左键选择一片区域(起始行先填上字段名),再将鼠标位置点到左上角的地址栏,输入一表名如ABC,或者在菜单上选:“插入(I)”-“名称(N)”-“定义(D)”,再输入表名(若已定义, 可在此处删除掉),存盘退出(假定文件名取为c:\Book.xls),若嫌字段名行多余,存盘前可隐藏掉;

---- 2.定义ODBC数据源:

---- 从Windows桌面“我的电脑"进入“控制面板”,双击“32位ODBC”图标,运行“用户DSN”中的“添加(D)"后选“Excel Driver(*.xls)", 再点“完成”便弹出对话框,在“数据源名(N)"右边填一名称,如:excel01,在“版本(V)"上选“Excel97", 点中“选项”取消“只读”,在“选定工作目录”中,选定Excel文件名(本例 c:\Book1.xls),再点“确定”直至退出;

---- 3.设置Database控件避免登录检查:
andy_qhz 2003-10-30
  • 打赏
  • 举报
回复
这是我在网上摘抄的,也许对你有帮助的:

在C++Builder中用Ole控制Excel表
利用C++Builder的快速报表做表格是比较麻烦的事儿。如果打出来的表格需要手工修改数据,或者要保存成可以编辑的文件,那怎么办?现在许多单位用的都是Excel表格,如何让程序做出来的报表和Excel兼容,也是问题。那么就可以让C++Builder直接操作Excel表,这样就方便多了。
笔者在实际工作中经常用Excel表做数据报表,大多数表格的数据都要从数据库中读取,这样我就用C++Builder做了一个报表程序,方便了很多,现在把它共享给C++Builder爱好者们,就算为丰富C++Builder的文档资料做点事情吧。
首先把Excel报表文件保存到一个指定目录下,最好放在可执行程序的子目录下,作为模板文件。可以把报表标题、表头等设置好。这里是保存在trpt子目录下。
然后建一个report目录,作为报表目标文件夹,存放填好数据的报表,可以由用户直接操作。
好,现在就来工作吧。
首先确定在你的机器中装有Office。这里一Office2000为例。
在C++Builder中新建一个工程,在窗体Form1上面放一个两个按钮SaveButton和ReadButton,分别用来保存数据到Excel表和显示刚刚保存的Excel表。
在SaveButton按钮的单击事件中把从数据库中取到的数据放入到指定的Excel表中并将改文件拷贝到report目录下。在ReadButto按钮的单击事件中显示report目录下的报表文件,方便用户修改和另外保存。
在Form1.h头文件中定义几个变量:
private:
Variant Ex,Wb,Sheet,ERange,EBorders;
并在文件头中包含如下语句:
#include "Excel_2K_SRVR.h"
#include <OleServer.hpp>
在Form1.cpp的文件头中加入
#pragma link "Excel_2K_SRVR"
主要代码如下:
void __fastcall TForm1:: SaveButtonClick(TObject *Sender)
{
try
{
SaveButton->Enabled = false;
ReadButton->Enabled = false;//使两个按钮无效

//取报表文件CardSend.xls的完整目录名
AnsiString ExcelFileName = GetCurrentDir()+"\\trpt\\table.xls";

if(!FileExists(ExcelFileName))
{
Application->MessageBox("报表模板文件不存在,无法打开!",
"错误",MB_ICONSTOP|MB_OK);
return;
}
//建立Excel的Ole对象Ex
try
{
Ex = Variant::CreateObject("Excel.Application");
}
catch(...)
{
Application->MessageBox("无法启动Excel","错误",MB_ICONSTOP|MB_OK);
return;
}
//设置Excel为不可见
Ex.OlePropertySet("Visible",false);
//打开指定的Excel报表文件。报表文件中最好设定只有一个Sheet。
Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",ExcelFileName.c_str());
Wb = Ex.OlePropertyGet("ActiveWorkBook");
Sheet = Wb.OlePropertyGet("ActiveSheet");//获得当前默认的Sheet

//清空Excel表,这里是用循环清空到第300行。对于一般的表格已经足够了。
AnsiString strRowTemp;
AnsiString strRange;
int iCols,iRows;//记录列数和行数

/*从第三行开始,到第300行止。一般第一行是表标题,第二行是副标题或者制表日期。*/
for(iRows=3;iRows<300;iRows++)
{ //假设只有6列。
for (iCols = 1;iCols < 7; iCols++)
{
//清空行
Sheet.OlePropertyGet("Cells",iRows,iCols).OlePropertySet("Value","");
}
//去掉表格边框
strRange = "A"+IntToStr(iRows)+":F"+IntToStr(iRows);//获取操作范围
ERange = Sheet.OlePropertyGet("Range",strRange.c_str());
EBorders = ERange.OlePropertyGet("Borders");//获取边框对象
EBorders.OlePropertySet("linestyle",xlNone);
}

AnsiString strPtrDate; //存放当前日期,作为制表日期
DateSeparator = '-';
ShortDateFormat = "yyyy/m/d";//设置为年/月/日格式

strPtrDate = DateToStr(Date());//取当前日期

AnsiString strYear = strPtrDate.SubString(1,4);
strPtrDate = strPtrDate.SubString(6,strPtrDate.Length()-5);
AnsiString strMonth = strPtrDate.SubString(1,strPtrDate.Pos("-")-1);
AnsiString strDay =
strPtrDate.SubString(strPtrDate.Pos("-")+1,
strPtrDate.Length()-strPtrDate.Pos("-"));
strPtrDate = strYear+"年"+strMonth+"月"+strDay+"日";

AnsiString strData = "报表标题";//报表标题
//将报表标题置于第一行第一列。在此之前,应将报表文件的标题格式设定好。
Sheet.OlePropertyGet("Cells",1,1).OlePropertySet("Value",
strData.c_str());
//将制表日期置于表格第二行的右侧。
Sheet.OlePropertyGet("Cells",2,5).OlePropertySet("Value",
strPtrDate.c_str());

iRows = 3;//在第三行放置表格的列名
Sheet.OlePropertyGet("Cells",iRows,1).OlePropertySet("Value","列名1");
Sheet.OlePropertyGet("Cells",iRows,2).OlePropertySet("Value","列名2");
Sheet.OlePropertyGet("Cells",iRows,3).OlePropertySet("Value","列名3");
Sheet.OlePropertyGet("Cells",iRows,4).OlePropertySet("Value","列名4");
Sheet.OlePropertyGet("Cells",iRows,5).OlePropertySet("Value","列名5");
Sheet.OlePropertyGet("Cells",iRows,6).OlePropertySet("Value","列名6");
//画表格边框,在A3:F3之间取范围
strRange = "A"+IntToStr(iRows)+":F"+IntToStr(iRows);
ERange = Sheet.OlePropertyGet("Range",strRange.c_str());
EBorders = ERange.OlePropertyGet("Borders");
EBorders.OlePropertySet("linestyle",xlContinuous);
EBorders.OlePropertySet("weight",xlThin);
EBorders.OlePropertySet("colorindex",xlAutomatic);
iRows++;
//从数据库中取数据(略),假设数据集放入Query1中。
Query1->Open();//打开数据集
//循环取数
while(!Query1->Eof)
{
//循环取字段的数据放到Excel表对应的行列中
for(iCols=1;iCols<7;iCols++)
{
strRowTemp = Query1->Fields->Fields[iCols-1]->AsString;
Sheet.OlePropertyGet("Cells",iRows,iCols).OlePropertySet("Value",
strRowTemp.c_str());
}
//画该行的表格边框
strRange = "A"+IntToStr(iRows)+":F"+IntToStr(iRows);
ERange = Sheet.OlePropertyGet("Range",strRange.c_str());
EBorders = ERange.OlePropertyGet("Borders");
EBorders.OlePropertySet("linestyle",xlContinuous);
EBorders.OlePropertySet("weight",xlThin);
EBorders.OlePropertySet("colorindex",xlAutomatic);
iRows++;
Query1->Next();
}//while结束

Wb.OleProcedure("Save");//保存表格
Wb.OleProcedure("Close");关闭表格
Ex.OleFunction("Quit");退出Excel
//定义目标文件名
AnsiString DestinationFile =
GetCurrentDir()+"\\report\\table.xls";
//将刚刚修改的Excel表格文件table.xls拷贝到report目录下
if(!CopyFile(ExcelFileName.c_str(),DestinationFile.c_str(),false))
{
Application->MessageBox("复制文件操作失败,Excel文件可能正在使用中!",
"错误",MB_ICONSTOP|MB_OK);
return;
}
Application->MessageBox("成功完成报表保存!\n可以按\'打开Excel文件\'
按钮进行报表工作","提示",MB_ICONINFORMATION|MB_OK);

SaveButton ->Enabled = true;
ReadButton ->Enabled=true;
}//try结束
huangjuliang 2003-10-09
  • 打赏
  • 举报
回复
AdvStringGrid组件这个控件没有用过,也没有见过!
centerarea 2003-10-09
  • 打赏
  • 举报
回复
因为我设计的StringGrid中的列是动态的,是根据Excel中的列变化而变化,所以我必须从Excel数据中获取列数及行数
centerarea 2003-10-09
  • 打赏
  • 举报
回复
这个我会的,但我不想通过ADO或者其他数据源来实现,不知道你用过AdvStringGrid组件吗,她里面就有这一个功能,直接将Excel数据导入AdvStringGrid中,但我只想通过StringGrid来实现,不只如何做好?
huangjuliang 2003-10-09
  • 打赏
  • 举报
回复
有多少行与多少列?
这与Access是一样的

不知你连接Excel连好了没有?

怎么用Ado或者BDE访问Excel,请看这个贴子!
http://expert.csdn.net/Expert/topic/2319/2319660.xml?temp=.9388544

这样有多少列?
就可以这样来写
ADOQuery1->FieldCount

有多少行?
ADOQuery1->RecordCount
centerarea 2003-10-09
  • 打赏
  • 举报
回复
我急啊,怎么没人解答

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧