C++怎么操作EXCEL
如果数据简单的话,可以使用CSV(逗号分隔值)格式的文件。CSV格式的文件可以用Office Excel 打开。比如有要保存的一张表格是这样的:
----------------表格开始-------------------
编号 姓名 性别
1 A 男
2 B 女
3 C 男
---------------表格结束--------------------
那么在保存CSV文件里面数据格式是这样的:
----------------内容开始----------------
编号,姓名,性别
1, A, 男
2, B, 女
3, C, 男
----------------内容结束----------------
用Excel打开是这样的:
下面是示例程序:
#include
struct Student
{
int id;
char name[10];
char gender[3];
};
int main(int argc, char *argv[])
{
// 在程序所在目录下面,可以看见一个名为 student.csv 的文件
FILE * file=fopen("student.csv","w");
struct Student studens[]=
{
{1,"A","男"},
{2,"B","女"},
{3,"C","男"},
};
int studensAmount=sizeof(studens)/sizeof(struct Student);
int i;
if(file)
{
fprintf(file,"%s%,%s,%s
","编号","姓名","性别");
for(i=0;i<studensAmount;i++)
{
fprintf(file,"%d%,%s,%s
",studens[i].id,studens[i].name,studens[i].gender);
}
}
fclose(file);
return 0;
}
鼠标模拟和键盘模拟
首先把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);
}
}
习惯了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 );
读写excel文件么?可以用微软的com接口,或者用第三方库,比如Libxl
一、新建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();
Exc格且保留所有内容
在Excel中合并单元格时,通常会遇到信息丢失的问题,尤其是当合并后只能保留最左上角的数据。然而,有解决方法可以让你在合并单元格的同时保留所有内容。首先,尝试在Word文档中操作。将需要合并的Excel单元格内容复制到Word,选择“粘贴为文本”,这样可以消除单元格间的空格。接着,使用Ctrl+F搜索并替换...
EXC数详解
EXC中的MATCH函数是一个强大的工具,用于在指定数组中查找特定值的位置。该函数的语法是MATCH(lookup_value, lookup_array, match_type),其中lookup_value是你需要查找的数值,lookup_array是你查找范围的连续单元格区域,match_type则是1(查找小于或等于的值)、0(查找等于的第一个值)或-1(查找...
怎样将Exc文档
要将Excel文档转换为Word格式,操作流程相对简单。首先,打开你的Excel表格文件,找到菜单栏顶部的“文件”选项,点击它,接着选择“另存为”。在弹出的“保存文件”对话框中,确保“保存类型”被设置为“网页”格式,然后点击“保存”按钮。这样,Excel文件就已经以网页形式被保存到你的电脑上。找到这个...
EXC字加1
对于数字处理,我们可以借助Excel的便捷功能来实现加1的操作,这里有两种常用的方法供您参考。首先,来看选择性粘贴的步骤:1. 选择性粘贴: 当您需要给单元格添加1,可以选择需要的数值,然后使用Excel的"选择性粘贴"功能,这通常适用于快速对单一数值进行改动。点击放大图片,您将看到详细的步骤演示。另一...
EXC表格公式怎么去除
直接选复制并且以粘贴值为粘贴就可以了。下面我就演示一下详细的操作步骤:(电脑型号:MacBook Air,软件版本:Excel 2021)1、打开Excel,点击上面的【复制】;2、在粘贴右边点击【倒三角形】;3、弹出浅灰色框,点击【粘贴值】;4、EXCEL表格公式去除操作完成啦!以上就是EXCEL表格公式怎么去除的教程...
excel如何打正负数,怎么操作?
Excel正负数公差的输入,在一行中打上下两排数,可通过插入公式符号实现。方法步骤如下:1、打开需要操作的EXCEL表格,在插入选项卡中点击“公式”。2、找到“上下标”,并选择一个同时包含上下标的公式符号插入。3、在插入的各个小方框输入对应的文本数值即可。【输入一个上\/下标后,可通过方向键切换上...
EXC表格中怎么把文字和网站链接分开放在两个单元格中?
B列放置网站文字,在B2单元格输入公式:=MID(A2,2,FIND("】",A2)-2);C列放置网站链接:在C2单元格输入公式:=RIGHT(A2,LEN(A2)-FIND("http",A2)+1)。向下拉即可。B列网站文字 C列网站链接
exc式转换问题
在Excel中,如果你想将日期和时间格式转换成特定的数字格式,可以按照以下步骤操作。如果你需要将日期格式如"2009\/05\/15"转换为"20090515"这种四位数的形式,首先选中包含日期的单元格,然后右键点击,选择"设置单元格格式"。在弹出的菜单中,选择"数字"选项,再选择"自定义",在"类型"框中输入"yyyy-mm...
excel行间距怎么设置在哪里设置
Excel行间距可以在直接拉动或输入数值调整。Excel行间距可以在直接拉动或输入数值调整。以下方法先以直接拖动为例,具体步骤如下:1,移动鼠标,首先将鼠标移动到Excel表格需要调整行距的那一行最左侧的下方,例如以下表格的第一行。2,拉动鼠标,当出现黑色十字的时候按下鼠标左键上下拉动。3,调整,直到...
exc表格怎么合并单元格
Excel小技巧
钦骅莱阳: 首先把Excel报表文件保存到一个指定目录下,最好放在可执行程序的子目录下,作为模板文件.可以把报表标题、表头等设置好.这里是保存在trpt子目录下.然后建一个report目录,作为报表目标文件夹,存放填好数据的报表,可以由用户直...
饶平县14727101850: C++怎么操作EXCEL - ?
钦骅莱阳: 一、新建EXCEL表 COleVariant covOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR); app.CreateDispatch("EXCEL.Application"); app.SetVisible(false); //设置表可见性 app.SetDisplayFullScreen(false); //设置不全屏显示 app....
饶平县14727101850: C++怎么操作excel文件? - ?
钦骅莱阳: 如果是要操作excel文件的话,建议使用已经封装好了的类,功能强大也好用 一种是使用excel.h和excel.cpp 还可以使用CSpreadSheet.h这个文件 这几个文件网上都有的下的,也有相应的使用说明,很好用的
饶平县14727101850: 如何用c++写一个程序处理excel文件 - ?
钦骅莱阳: 如果是生成表格形式的,建议写cvs文件 如果读,并很熟可以使用 COM 的Excel 对象 ~~~~~~~
饶平县14727101850: C/C++如何读取Excel的数据,并进行操作? - ?
钦骅莱阳: 1、Excel导出CSV或XML,C/C++作为文本/XML文件来读取. 2、在C/C++中使用COM,引用Microsoft Office Excel Library,通过WorkSheet接口来操作Excel工作表. 3、其它第三方的Excel操作库.
饶平县14727101850: 怎么用vc++控制EXCEL - ?
钦骅莱阳: 第一步:建立一个自动化工程 启动VC 6.0,打开新建对话框,新建一个MFC AppWizard(exe)工程,这里工程明设置为TestExcel.进入MFC 应用程序向导,选择 基本对话框,直接点击完成:打开MFC ClassWizard窗口(查看—>建立类向导)...
饶平县14727101850: 用c++程序如何使用excel中的数据 - ?
钦骅莱阳: 使用读入函数
饶平县14727101850: 怎么用c++从excel中读入数据 - ?
钦骅莱阳: 使用Visual C++的扩展指令#import:#import "C:\\Program Files\\Common Files\\microsoft shared\\OFFICE14\\MSO.DLL" \ rename("RGB","MsoRGB") \ rename("SearchPath","MsoSearchPath")#import "C:\\Program Files\\Common ...
饶平县14727101850: 使用c++怎么能够调取excel中的数据并且进行运算 - ?
钦骅莱阳: 基于Excel的类库excel9.h/cpp文件中定义的类和函数,即可操作Excel.常用有_EApplication/_Worksheet等类.获取excel9.h/cpp方法,网上搜,或从excel安装目录获取,如下方法:1 . 使用VC++新建立一个基于MFC的EXE工程2 . 点击菜单"查...
饶平县14727101850: 我现在excel里面有很多数据,我想使用C++一次读取里面的数据并且能够进行相应的运算,我要怎么操作啊, - ?
钦骅莱阳: Office 主互操作程序集 ; com自动化,建议搜索相关内容.