请教一个关于数据库导入导出到Excel的问题?

lihongxing2002 2003-08-05 11:53:59
请问用BCB怎么实现SQL2000的数据导出到Excel里面呢?还有类似将Excel里的数据导入到数据库中呢?
...全文
146 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rurama 2003-08-11
  • 打赏
  • 举报
回复
//Write Excel
try
{
DataTotal->ADOQueryExBcs->Close();
DataTotal->ADOQueryExBcs->SQL->Clear();
DataTotal->ADOQueryExBcs->SQL->Add("Select * from ExName");
DataTotal->ADOQueryExBcs->Open();
DataTotal->ADOQueryExBcs->First();
while ( !DataTotal->ADOQueryExBcs->Eof )
{
AnsiString strDataName,strSQL,strExName;
strExName = Trim(DataTotal->ADOQueryExBcs->FieldByName("c_ex_name")->AsString);
strDataName = Trim(DataTotal->ADOQueryExBcs->FieldByName("c_data_name")->AsString);

strSQL = "Select * from "+strDataName+" order by totid";
DataTotal->ADOQueryExData->Close();
DataTotal->ADOQueryExData->SQL->Clear();
DataTotal->ADOQueryExData->SQL->Add(strSQL);
DataTotal->ADOQueryExData->Open();
DataTotal->ADOQueryExData->First();
AnsiString str;

DataTotal->ADOQueryExData->First();
int iLineR = DataTotal->ADOQueryExData->RecordCount; //行
int iLineL = DataTotal->ADOQueryExData->FieldCount; //列
iLineL--;

int iLineRGo,iLineLGo,iLineRExName;
iLineRGo = 2;
iLineLGo = 1;
AnsiString strDataAdd ;

str = ExtractFileDir(Application->ExeName);
str +="\\Excelres\\"+strExName;
AnsiString strDataHtitle = Trim(DataTotal->ADOQueryExData->Fields->FieldByName("Htitle")->AsString);
AnsiString strExcelHtitle ;
myExcel->OpenExcelFile(str,false,false);
DataTotal->ADOQueryExData->First();
for ( int i=0;i<iLineR;i++ )
{
for ( int j=3;j<=iLineL+1;j++ )
{
if ( Trim(DataTotal->ADOQueryExData->Fields->FieldByNumber(j)->AsString)!="" )
{
strDataAdd = DataTotal->ADOQueryExData->Fields->FieldByNumber(j)->AsString;

myExcel->SetCellValue(i+2,j-2,strDataAdd.c_str());
myExcel->WorkBookSave();
}
else
{
if ( j == 3 )
{
strDataAdd = " ";
}
else
{
strDataAdd = 0;
}
myExcel->SetCellValue(i+2,j-2,strDataAdd.c_str());
myExcel->WorkBookSave();
}
}
DataTotal->ADOQueryExData->Next();
}
myExcel->QuitExcel();
DataTotal->ADOQueryExBcs->Next();
f_progress->progress->Progress++;
}
AnsiString str1 = ExtractFileDir(Application->ExeName);
str1 +="\\Excelres\\";
str1 = "数据汇总完毕,结果存于"+str1+"中";
Application->MessageBox(str1.c_str(),"信息提示",MB_ICONINFORMATION+MB_OK );
}
catch(...)
{
DataTotal->ADOQueryExBcs->Close();
DataTotal->ADOQueryExData->Close();
myExcel->QuitExcel();
}
Rurama 2003-08-11
  • 打赏
  • 举报
回复
#include <vcl.h>
#pragma hdrstop
#include "OperateExcel2k.h"

void OperateExcel::OpenExcel()
{
ExcelApp =Variant::CreateObject("Excel.Application");
ExcelApp.OlePropertySet ("visible",true);
Workbook=ExcelApp.OlePropertyGet("ActiveWorkBook");
}
//---------------------------------------------------------------------------
void OperateExcel::OpenExcelFile(AnsiString str_ExcelFileName,bool Visibled,bool IfReadOnly)
{
//创建excel对象

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

ExcelApp.OlePropertyGet("WorkBooks").OleProcedure("Open",str_ExcelFileName,NULL,IfReadOnly);
ExcelApp.OlePropertySet ("visible",Visibled);
Workbook=ExcelApp.OlePropertyGet("ActiveWorkBook");
WorkSheet=Workbook.OlePropertyGet("ActiveSheet");
}
//---------------------------------------------------------------------------

void OperateExcel::SetCellValue(int iRowNO, int iColumnNO, Variant Value)
{
WorkSheet.OlePropertyGet("Cells",iRowNO,iColumnNO).OlePropertySet("Value",Value);
}
//---------------------------------------------------------------------------
void OperateExcel::SetCellValue(int iRowNO, int iColumnNO, char* Value)
{
WorkSheet.OlePropertyGet("Cells",iRowNO,iColumnNO).OlePropertySet("Value",Value);
}
//---------------------------------------------------------------------------
void OperateExcel::WorkBookSave()
{
Workbook.OleProcedure("Save");
}
//---------------------------------------------------------------------------
void OperateExcel::WorkBookClose()
{
Workbook.OleProcedure("Close");
}
//---------------------------------------------------------------------------
void OperateExcel::WorkBookSaveAs(AnsiString str_FileName)
{
Workbook.OleProcedure("Close",str_FileName);
}
//---------------------------------------------------------------------------
void OperateExcel::ResetArray1D()
{
memset(str_DataArray1D, 0, 16 );
}
//---------------------------------------------------------------------------
void OperateExcel::ResetArray2D()
{
memset(str_DataArray2D, 0, 16 );
}
//---------------------------------------------------------------------------
void OperateExcel::SetRowValue(int iRowNO, int iColumnNO, int iElementsNum)
{
int i=0;
while(i<iElementsNum)
{
SetCellValue(iRowNO,i,str_DataArray1D[i]);
i++;
}
}
//---------------------------------------------------------------------------
void OperateExcel::SetColumnValue(int iRowNO, int iColumnNO, int iElementsNum)
{
int i=0;
while(i<iElementsNum)
{
SetCellValue(i,iColumnNO,str_DataArray1D[i]);
i++;
}
}
//---------------------------------------------------------------------------
AnsiString OperateExcel::GetValueFromCell(int iRowNO, int iColumnNO)
{
AnsiString str_Value;
str_Value=WorkSheet.OlePropertyGet("cells",iRowNO,iColumnNO).OlePropertyGet("Value");
return str_Value;
}
//---------------------------------------------------------------------------
bool OperateExcel::CellMerged(int iRowNO,int iColumnNO)
{
return WorkSheet.OlePropertyGet("Cells",iRowNO,iColumnNO).OlePropertyGet("MergeCells");
}
//---------------------------------------------------------------------------
void OperateExcel_v2::ReadValueByRow(int iTop, int iLeft, int iBottom, int iRight)
{
int i=0;
int iCount=0;
AnsiString temp;
for(int iRowNO=iTop;iRowNO<=iBottom;iRowNO++,i++)
{
int iColumnNO=iLeft;
int j=0;
while(iColumnNO<=iRight)
{
temp=GetValueFromCell(iRowNO,iColumnNO) ;
str_DataArray2D[i][j]=temp;
if(CellMerged(iRowNO,iColumnNO)==false)
{j++;iColumnNO++;}
else if(CellMerged(iRowNO,iColumnNO)==true)
{
iCount=WorkSheet.OlePropertyGet("Cells",iRowNO,iColumnNO).OlePropertyGet("MergeArea").OlePropertyGet("Count");
for(int num=0;num<iCount;num++,j++,iColumnNO++)
str_DataArray2D[i][j]=temp+":"+AnsiString(num);
}
}
}
}
//---------------------------------------------------------------------------
void OperateExcel_v2::SendDataToDataSet(TDataSet* pDataSet,int iColumnsNumber,int iRowsNumber)
{
for(int iRowNo=0;iRowNo<iRowsNumber;iRowNo++)
{
pDataSet->Insert();
for(int iColumnNo=1;iColumnNo<=iColumnsNumber;iColumnNo++)
{
pDataSet->Fields->FieldByNumber(iColumnNo)->Value=str_DataArray2D[iRowNo][iColumnNo-1];

}
}
pDataSet->Post();
}
//---------------------------------------------------------------------------
int OperateExcel::GetUsedRowCount()
{
return WorkSheet.OlePropertyGet("UsedRange").OlePropertyGet("Rows").OlePropertyGet("Count");

}
//---------------------------------------------------------------------------
int OperateExcel::GetUsedColCount()
{
return WorkSheet.OlePropertyGet("UsedRange").OlePropertyGet("Columns").OlePropertyGet("Count");
}
//---------------------------------------------------------------------------
void OperateExcel::QuitExcel()
{
if(!ExcelApp.IsEmpty())
ExcelApp.OleProcedure("Quit") ;
}
//---------------------------------------------------------------------------
Rurama 2003-08-11
  • 打赏
  • 举报
回复

#ifndef OperateExcel2kH
#define OperateExcel2kH
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>

#include "vcl\utilcls.h"

class OperateExcel
{
protected:
Variant ExcelApp,Workbook,WorkSheet,Cell;
public:
Variant & excelApp(){};
Variant & workbook(){return Workbook;}
Variant & workSheet(){return WorkSheet;}
Variant & cell(){return Cell;}
OperateExcel(){ }
~OperateExcel(){}
AnsiString str_DataArray1D[100];
AnsiString str_DataArray2D[100][100];

public:
virtual void OpenExcel();
virtual void OpenExcelFile(AnsiString str_ExcelFileName,bool Visibled=true,bool IfReadOnly=false);
/*打开一个excel文件(文件路径及名称,是否可视,是否只读)*/
virtual void SetCellValue(int iRowNO, int iColumnNO, Variant Value);//给单元格赋值
virtual void SetCellValue(int iRowNO, int iColumnNO, char* Value); //给单元格赋值
virtual void WorkBookSave(); //存盘当前路径
virtual void WorkBookSaveAs(AnsiString str_FileName); //文件另存
virtual void WorkBookClose(); //关闭文件
virtual void ResetArray1D();
virtual void ResetArray2D();
virtual void SetRowValue(int iRowNO, int iColumnNO, int iElementsNum); //给某行赋值 (起始单元格下标,元素个数)
virtual void SetColumnValue(int iRowNO, int iColumnNO, int iElementsNum);//给某列赋值 (起始单元格下标,元素个数)
virtual AnsiString GetValueFromCell(int iRowNO, int iColumnNO);//从某一单元格取值
virtual bool CellMerged(int iRowNO,int iColumnNO);
virtual int GetUsedRowCount();
virtual int GetUsedColCount();
virtual void QuitExcel();
};

class OperateExcel_v2:public OperateExcel
{
public:
void ReadValueByRow(int iTop, int iLeft, int iBottom, int iRight);
void virtual SendDataToDataSet(TDataSet * pDataSet,int iColumnsNumber,int iRowsNumber);



};



#endif
RamjetZhang 2003-08-10
  • 打赏
  • 举报
回复
楼主:
找到一个VC的,
http://www.csdn.net/develop/article/14/14926.shtm
直接通过ODBC读、写Excel表格文件
译者:徐景周

想要通过ODBC直接读、写Excel表格文件,首先,应确保ODBC中已安装有Excel表格文件的驱动"MICROSOFT EXCEL DRIVER (*.XLS)"。然后,可根据下面步骤进行:
1. 在StdAfx.h文件中加入:
include <afxdb.h>
include <odbcinst.h>

2. 通过ODBC直接创建Excel文件(暂定文件名:Demo.xls)
//创建并写入Excel文件
void CRWExcel::WriteToExcel()
{
CDatabase database;
CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
CString sExcelFile = "c:\\demo.xls"; // 要建立的Excel文件
CString sSql;
TRY
{
whp320 2003-08-10
  • 打赏
  • 举报
回复
我觉得这个问题很有用处。保留。
真如实观 2003-08-10
  • 打赏
  • 举报
回复
建议用ole自动化,ADO连接Excel必须预先建好Excel文件,而且把数据写入Excel较难。
RamjetZhang 2003-08-09
  • 打赏
  • 举报
回复
在ODBC数据源里面连好,(odbcad32.exe),然后用ADO或者BDE,随便做。
不比文本数据库好到哪里去。记住表名前面有个$的(莫名其妙的设计),所以引用的时候是[$sheet1],用table可能连不上,用query没问题。
lihongxing2002 2003-08-09
  • 打赏
  • 举报
回复
to: RamjetZhang(我曾经不是一头猪)
我还是不太明白到底该怎么做,给个例子行吗?先谢谢了
cxlfreefly 2003-08-08
  • 打赏
  • 举报
回复
老兄是否也可以给我一份呢。先表示感谢
cxlfreefly@hotmail.com
nightdays 2003-08-08
  • 打赏
  • 举报
回复
老兄,我也想要一份,多谢了.
nightday@21cn.com
RamjetZhang 2003-08-08
  • 打赏
  • 举报
回复
用ODBC里面的excel驱动。
lo0P 2003-08-08
  • 打赏
  • 举报
回复
我也要lo0P@tom.com
lihongxing2002 2003-08-07
  • 打赏
  • 举报
回复
to: RamjetZhang(我曾经不是一头猪)
用ADO该怎么做呢?有具体的例子吗?包括怎么连接Excel,等等。发一个过来
duduwolf 2003-08-06
  • 打赏
  • 举报
回复
这个不够用你给我发消息留下mail,我给你发过来,太多了
duduwolf 2003-08-06
  • 打赏
  • 举报
回复
我这个函数直接就打开了一个excel,然后将数据显示在excel里面,如果你想要程序自动保存成xls格式的话你可以不要这句ex.OlePropertySet("Visible",(Variant)true); //使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");
2、常用的属性操作:
(1)新建EXCEL文件:
(a):新建系统模板的工作簿
ex.OlePropertyGet("workbooks").OleFunction("Add") //默认工作簿
ex.OlePropertyGet("workbooks").OleFunction("Add",1) //单工作表
ex.OlePropertyGet("workbooks").OleFunction("Add",2) //图表
ex.OlePropertyGet("workbooks").OleFunction("Add",3) //宏表
ex.OlePropertyGet("workbooks").OleFunction("Add",4) //国际通用宏表
ex.OlePropertyGet("workbooks").OleFunction("Add",5) //与默认的相同
ex.OlePropertyGet("workbooks").OleFunction("Add",6) //工作簿且只有一个表
(b):新建自己创建的模板的工作簿
ex.OlePropertyGet("workbooks").OleFunction("Add","C:\\WINDOWS\\Profiles\\test2\\Application Data\\Microsoft\\Templates\\result.xlt"); // 后面写上模板的完全路径,注意“\\”
(2)打开工作簿:
ex.OlePropertyGet("workbooks").OleFunction("open","路径名.xls")
(3)保存工作簿:
wb.OleFunction("Save"); //表格保存
wb..OleFunction("SaveAs","文件名"); //表格保存为,文件路径注意用“\\”
(4)退出EXCEL:
ex.OleFunction ("Quit");
(5)设置字体:
(a):设置单元格字体
sheet.OlePropertyGet("Cells",1,1).OlePropertyGet("Font").OlePropertySet("Name","隶书");
sheet.OlePropertyGet("Cells",2,3).OlePropertyGet("Font").OlePropertySet("size",28);
(b):设置所选区域字体
range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("size",28); range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("Color",
RGB(0,0,255));
其中参数的设置:
Font---Name : “隶书” //字体名称
----Size : 12 //字体大小
----Color : RGB(*,*,*) //颜色
-----Underline : true/false //下划线
-----Italic: true/false //斜体
(6)单元格的合并:
(a) range1=sheet.OlePropertyGet("Range", "A1:A2"); //A1和A2单元格合并
(b) AnsiString Str="A"+IntToStr(j)+":"+"C"+IntToStr(j);
range1=sheet.OlePropertyGet("Range",Str); //可以用变量控制单元格合并
range1.OleFunction("Merge" , false);
(7)赋值语句:
(a):指定单元格赋值
sheet.OlePropertyGet("Cells",3,6).OlePropertySet("Value",str);
sheet.OlePropertyGet("Cells",j,1).OlePropertySet("Value","共查到记录:"+IntToStr(j-6));
(b):所选区域单元格赋值
range.OlePropertyGet("Cells").OlePropertySet("Value",10);
(c):所选区域行赋值
range.OlePropertyGet("Rows",1).OlePropertySet("Value",1234);
(d):工作表列赋值
sheet.OlePropertyGet("Columns",1).OlePropertySet("Value",1234);
(8)取值语句:
AnsiString abc=sheet.OlePropertyGet("Cells",120,1).OlePropertyGet("Value");
(9)区域选择:
range.OlePropertyGet("Cells").OleFunction("Select");
(10)窗口属性:
(a)显示属性
ex.OlePropertySet("Windowstate",3); //最大化显示
参数 1---------xlNormal //正常显示
2---------xlMinimized //最小化显示
3---------xlMaximized //最大化显示
(b)状态栏属性
ex.OlePropertySet ("StatusBar","您好,请您稍等。正在查询!");
ex.OlePropertySet ("StatusBar", false); //还原成默认值
(c)标题属性:
ex.OlePropertySet("Caption","查询系统");
lihongxing2002 2003-08-06
  • 打赏
  • 举报
回复
还有保存到的路径也没有啊
zurong 2003-08-06
  • 打赏
  • 举报
回复
呵呵,坚决使用ADO,支持!!!
RamjetZhang 2003-08-06
  • 打赏
  • 举报
回复
我们的做法是:坚决不使用office的ole自动化
使用ado连接,表名字: $shee1,$yoursheet,两边要加方括号:
[$shhet1], [$yoursheet].
但是要write比较困难,读还是可以的。
gloom 2003-08-06
  • 打赏
  • 举报
回复
我也需要,请发一份到fqf@hicrown.com
谢谢
lihongxing2002 2003-08-06
  • 打赏
  • 举报
回复
谢谢了。我的邮箱:supperman_2002@sina.com
加载更多回复(5)

13,825

社区成员

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

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