C++怎么操作EXCEL

 我来答
xj2012hzq
2012-03-14
知道答主
回答量:24
采纳率:0%
帮助的人:11.1万
展开全部
首先把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

  在Form1.cpp的文件头中加入

#pragma link Excel_2K_SRVR

  主要代码如下:

void __fastcall TForm1:: SaveButtonClick(TObject *Sender)
{
try
{
SaveButton->Enabled = false;
ReadButton->Enabled = false;//使两个按钮无效

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

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

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

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

AnsiString strPtrDate; file://存放当前日期,作为制表日期
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 = 报表标题;//报表标题
file://将报表标题置于第一行第一列。在此之前,应将报表文件的标题格式设定好。
Sheet.OlePropertyGet(Cells,1,1).OlePropertySet(Value,
strData.c_str());
file://将制表日期置于表格第二行的右侧。
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);
file://画表格边框,在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++;
file://从数据库中取数据(略),假设数据集放入Query1中。
Query1->Open();//打开数据集
file://循环取数
while(!Query1->Eof)
{
file://循环取字段的数据放到Excel表对应的行列中
for(iCols=1;iCols<7;iCols++)
{
strRowTemp = Query1->Fields->Fields[iCols-1]->AsString;
Sheet.OlePropertyGet(Cells,iRows,iCols).OlePropertySet(Value,
strRowTemp.c_str());
}
file://画该行的表格边框
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
file://定义目标文件名
AnsiString DestinationFile =
GetCurrentDir()+\\report\\table.xls;
file://将刚刚修改的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结束
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
{
file://指定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;
}
file://使Excel可见
Ex.OlePropertySet(Visible,true);
file://打开Excel表格文件Table.xls
Ex.OlePropertyGet(WorkBooks).OleProcedure(Open,ExcelFileName.c_str());
}
catch(...)
{
Application->MessageBox(操作Excel表格错误!,错误,MB_ICONSTOP|MB_OK);
Ex.OleFunction(Quit);
}
}
chineseboytom
2012-03-07 · 超过15用户采纳过TA的回答
知道答主
回答量:45
采纳率:0%
帮助的人:32.2万
展开全部
习惯了Qt编程,看是否适用.如果只是用于数据导出,不建议用Excel,可直接使用CSV格式(excel同样支持),参考http://baike.baidu.com/view/468993.html?wtp=tt

用QAxWidget进行COM操作
QAxWidget excel("Excel.Application");
1、 显示当前窗口:
excel.setProperty("Visible", true);
2、 更改 Excel 标题栏:
excel.setProperty("Caption", "Invoke Microsoft Excel");
3、添加新工作簿:
QAxObject * workbooks = excel.querySubObject("WorkBooks");
workbooks->dynamicCall("Add");
4、打开已存在的工作簿:
workbooks->dynamicCall("Open (const QString&)", QString("c:/test.xls"));
5、获取活动工作簿:
QAxObject * workbook = excel.querySubObject("ActiveWorkBook");
6、获取所有的工作表:
QAxObject * worksheets = workbook->querySubObject("WorkSheets");
7、 获取工作表数量:
int intCount = worksheets->property("Count").toInt();
8、获取第一个工作表:
QAxObject * worksheet = workbook->querySubObject("Worksheets(int)", 1);
9、获取cell的值:
QAxObject * range = worksheet->querySubObject("Cells(int,int)", 1, 1 );
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
holykloud
2012-02-20 · TA获得超过156个赞
知道答主
回答量:70
采纳率:0%
帮助的人:89.7万
展开全部
读写excel文件么?可以用微软的com接口,或者用第三方库,比如Libxl
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一点设计演示
高粉答主

推荐于2016-09-15 · 职场/教育各类模板,衷于原创
一点设计演示
采纳数:874 获赞数:83615

向TA提问 私信TA
展开全部
一、新建EXCEL表

COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

app.CreateDispatch("EXCEL.Application");

app.SetVisible(false); //设置表可见性

app.SetDisplayFullScreen(false); //设置不全屏显示

app.SetDisplayAlerts(false); //屏蔽警告

二、打开EXCEL表

char path[MAX_PATH];

GetCurrentDirectory(MAX_PATH,path); //获取当前目录

CString strPath = path;

strPath += "\\计算结果";

books.AttachDispatch(app.GetWorkbooks(),true);

book.AttachDispatch(books.Add(_variant_t(strPath)));

三、获取工作表

sheets = book.GetWorksheets();

sheet = sheets.GetItem(COleVariant((short)1));

四、新建工作表

sheets = book.GetWorksheets();

sheets.Add(vtMissing,vtMissing,_variant_t((long)5[u1] ),vtMissing);

五、选择工作表某个区域

1、range = sheet.GetRange(COleVariant("A1"),COleVariant("A1"));

2、range.AttachDispatch(sheet.GetRange(_variant_t("K39"),_variant_t("K39")),TRUE);

六、合并单元格

range = sheet.GetRange(COleVariant("A1"),COleVariant("A1")); //先选择区域

range.Merge(_variant_t((long)0)); //再合并

七、设置单元格内容

1、单个单元格赋值

range = sheet.GetRange(COleVariant("A1"),COleVariant("A1")); //先选择区域

range.SetValue2(COleVariant("××")); //再赋值

2、批量赋值

CString sCell; //定义字符串变量

for(int i=0; i<360; i++)

{

sCell.Format("A%d",i+2); //选择单元格

range = sheet.GetRange(COleVariant(sCell[u2] ),COleVariant(sCell[u3] ));

range.SetValue2(COleVariant((short)(1.5*i))); //再赋值

}

八、设定单元格字体,对齐方式,颜色,粗体,斜体,背景色,列宽,行高

Font ft; //定义字体变量

Interior it; //定义背景色变量

range = sheet.GetRange(COleVariant("A1"),COleVariant("A1")); //先选择区域

range.SetHorizontalAlignment(_variant_t((long)-4131)); //水平居中对齐

range.SetVerticalAlignment(_variant_t((long)-4108)); //竖直居中对齐

range.SetColumnWidth(COleVariant("20")); //列宽

range.SetRowHeight(COleVariant("25")); //行高

ft.AttachDispatch(range.GetFont()); //匹配

ft.SetBold(_variant_t((long)0)); //设置粗体,0-不加粗;1-加粗

ft.SetItalic(_variant_t((long)0)); //设置斜体,0-不斜;1-斜

ft.SetSize(_variant_t((long)11)); //字大小

ft.SetColorIndex(_variant_t((long)5)); //字颜色

it.AttachDispatch(range.GetInterior());

it.SetColorIndex(_variant_t((long)8)); //背景色

说明:

对齐方式:(水平)居中:-4108 靠左:-4131 靠右:-4152

(竖直)居中:-4108 靠上:-4160 靠下:-4107

线颜色值:1-黑;2-白;3-红;5蓝;6黄;7-粉红;8-浅蓝;9-灰;10-绿;

九、获取单元格数据

COleVariant rValue,gValue; //定义COleVariant变量

CString quzhi; //定义字符串变量

range = sheet.GetRange(COleVariant("A1"),COleVariant("A1"));

rValue=COleVariant(range.GetValue(gValue)); //取得单元格数据

rValue.ChangeType(VT_BSTR); //数据转换格式

quzhi=rValue.bstrVal; //将单元格数据赋在字符串变量中

十、绘单元格边框

Range rg ; //定义变量

1、绘横线

CString strCell1strCell2,strCell3;

for (i=5;i<21;i++)

{

strCell1.Format("I%d",i*2);

strCell2.Format("K%d",i*2);

rg.AttachDispatch(sheet.GetRange(COleVariant(strCell1),

COleVariant(strCell2)),true);

rg.BorderAround(_variant_t((long)1),_variant_t((long)2),

_variant_t((long)1),vtMissing);

//线型 // 线宽 //颜色

}

2、绘竖线

for(i=0;i<20;i++)

{

strCell1.Format("%c12",(char)('I'+i));

strCell2.Format("%c40",(char)('I'+i));

rg.AttachDispatch(sheet.GetRange(COleVariant(strCell1)

,COleVariant(strCell2)),true);

rg.BorderAround(_variant_t((long)1),_variant_t((long)2),

_variant_t((long)3),vtMissing);

}

3、绘外框

strCell3=(CString)CHAR(i+74)+"40";

rg.AttachDispatch(sheet.GetRange(COleVariant("I10"),

COleVariant(strCell3)),TRUE);

rg.BorderAround(_variant_t((long)1),_variant_t((long)3),

_variant_t((long)5),vtMissing);

十一、保存结果

book.SaveAs(COleVariant(strPath),covOptional,

covOptional,covOptional,

covOptional,covOptional, (long)0,covOptional,covOptional,covOptional,

covOptional,covOptional);

十二、关闭表及释放变量

app.Quit();

sheet.ReleaseDispatch();

sheets.ReleaseDispatch();

book.ReleaseDispatch();

books.ReleaseDispatch();

app.ReleaseDispatch();
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式