特别说明以下代码需要MFC的支持,而且工程中还要包含EXCEL2000的定义文件:EXCEL9.H,EXCEL9.CPP
*****************************************************************************************************************
//*****
//变量定义
_Application app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
Range iCell;
LPDISPATCH lpDisp;
COleVariant vResult;
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//*****
//初始化COM的动态连接库
if(!AfxOleInit())
{
AfxMessageBox("无法初始化COM的动态连接库!");
return ;
}
//*****
//创建Excel 2000服务器(启动Excel)
if(!app.CreateDispatch("Excel.Application"))
{
AfxMessageBox("无法启动Excel服务器!");
return;
}
app.SetVisible(TRUE); //使Excel可见
app.SetUserControl(TRUE); //允许其它用户控制Excel
//*****
//打开c://1.xls
books.AttachDispatch(app.GetWorkbooks());
lpDisp = books.Open("C:////1.xls",
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional );
//*****
//得到Workbook
book.AttachDispatch(lpDisp);
//*****
//得到Worksheets
sheets.AttachDispatch(book.GetWorksheets());
//*****
//得到当前活跃sheet
//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待
lpDisp=book.GetActiveSheet();
sheet.AttachDispatch(lpDisp);
//*****
//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
Range usedRange;
usedRange.AttachDispatch(sheet.GetUsedRange());
range.AttachDispatch(usedRange.GetRows());
long iRowNum=range.GetCount(); //已经使用的行数
range.AttachDispatch(usedRange.GetColumns());
long iColNum=range.GetCount(); //已经使用的列数
long iStartRow=usedRange.GetRow(); //已使用区域的起始行,从1开始
long iStartCol=usedRange.GetColumn(); //已使用区域的起始列,从1开始
//*****
//读取第一个单元格的值
range.AttachDispatch(sheet.GetCells());
range.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );
COleVariant vResult =range.GetValue();
CString str;
if(vResult.vt == VT_BSTR) //字符串
{
str=vResult.bstrVal;
}
else if (vResult.vt==VT_R8) //8字节的数字
{
str.Format("%f",vResult.dblVal);
}
else if(vResult.vt==VT_DATE) //时间格式
{
SYSTEMTIME st;
VariantTimeToSystemTime(&vResult.date, &st);
}
else if(vResult.vt==VT_EMPTY) //单元格空的
{
str="";
}
//*****
//读取第一个单元格的对齐方式,数据类型:VT_I4
//读取水平对齐方式
range.AttachDispatch(sheet.GetCells());
iCell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);
vResult.lVal=0;
vResult=iCell.GetHorizontalAlignment();
if(vResult.lVal!=0)
{
switch (vResult.lVal)
{
case 1: //默认
break;
case -4108: //居中
break;
case -4131 : //靠左
break;
case -4152 : //靠右
break;
}
}
//垂直对齐方式
iCell.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);
vResult.lVal=0;
vResult=iCell.GetVerticalAlignment();
if(vResult.lVal!=0)
{
switch (vResult.lVal)
{
case -4160 : //靠上
break;
case -4108 : //居中
break;
case -4107 : //靠下
break;
}
}
//*****
//设置第一个单元格的值"HI,EXCEL!"
range.SetItem(COleVariant(1),COleVariant(1),COleVariant("HI,EXCEL!"));
//*****
//设置第一个单元格字体颜色:红色
Font font;
range.AttachDispatch(sheet.GetCells());
range.AttachDispatch((range.GetItem (COleVariant(long(1)), COleVariant(long(1)))).pdispVal);
font.SetColor(COleVariant((long)0xFF0000));
//*****
//合并单元格的处理
//包括判断第一个单元格是否为合并单元格,以及将第一个单元格进行合并
Range unionRange;
range.AttachDispatch(sheet.GetCells());
unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );
vResult=unionRange.GetMergeCells();
if(vResult.boolVal==-1) //是合并的单元格
{
//合并单元格的行数
range.AttachDispatch (unionRange.GetRows ());
long iUnionRowNum=range.GetCount ();
//合并单元格的列数
range.AttachDispatch (unionRange.GetColumns ());
long iUnionColumnNum=range.GetCount ();
//合并区域的起始行,列
long iUnionStartRow=unionRange.GetRow(); //起始行,从1开始
long iUnionStartCol=unionRange.GetColumn(); //起始列,从1开始
}
else if(vResult.boolVal==0)
{//不是合并的单元格}
//将第一个单元格合并成2行,3列
range.AttachDispatch(sheet.GetCells());
unionRange.AttachDispatch(range.GetItem (COleVariant((long)1),COleVariant((long)1)).pdispVal );
unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)2),COleVariant((long)3)));
unionRange.Merge(COleVariant((long)0)); //合并单元格
//*****
//将文件保存为2.xls
book.SaveAs(COleVariant("C:////2.xls"),covOptional,covOptional, //
covOptional,covOptional,covOptional,0,//
covOptional,covOptional,covOptional,covOptional);
//*****
//关闭所有的book,退出Excel
book.Close (covOptional,COleVariant(OutFilename),covOptional);
books.Close();
app.Quit();
--------------------------------------------------------------------------------
// Excel保存
了能使得输出到Excel中的数据显示表格,可以调用事先设置好的模板,但是不灵活。我花了一个中午的时间摸索出如何设置它了。
具体代码如下:
LPDISPATCH pRange;
CString cell;
int c,c1,c2;
_variant_t vRange1; // 设置单元格的线;
_variant_t vRange2;
_variant_t vRange3;
_variant_t vRange4;
c='A';
c1=j/26;
c2=j%26;
if(c1==0)
cell.Format("%c%d",c2+c,i+1); // i+1 :表示从第二行开始关联
else
cell.Format("%c%c%d",c1+c-1,c2+c-1,i+1);
VERIFY(pRange = m_worksheet.GetRange(COleVariant(cell)));
m_range.AttachDispatch(pRange);
//对齐方式
Var.vt = VT_I2;
Var.iVal=-4108;
m_range.SetHorizontalAlignment(Var);
m_range.SetVerticalAlignment(Var);
//
// 设置单元格的线;
vRange1.vt =VT_I2;
vRange1.lVal =1; // 线的样式:0- no line; 1-solid; 2-big dot;3-small dot;4-dash dot; 5-dash dot dot;
vRange2.vt =VT_I2;
vRange2.lVal =3; // 线的粗细程度;
vRange3.vt =VT_I2;
vRange3.lVal =1; // 1-black;2-white;3-red;4-green;5-blue; 6-yellow; 7-pink;8-dark blue;
vRange4.vt = VT_UI4;
vRange4.uintVal =RGB(0,0,0); // 我测试后认为,没有实际意义,只有vRange3起作用
m_range.BorderAround(vRange1,vRange2,vRange3,vRange4);
//
//
strValue=m_book.GetTextRC(i,j+2);
strValue.TrimLeft(" ");
strValue.TrimRight(" ");
if(!strValue.IsEmpty())
{
m_range.SetValue(COleVariant(strValue));
}
m_range.ReleaseDispatch();
//
虽然没有什么高深的技术含量,只是为了让后面需要的人少走点弯路。
不当之处,还望指正。
相关推荐
转自老外做的一个CSpreadSheet.h文件,并将其中的类定义与类实现做了分解,在VC中直接添加就可以应用,具体例子参考网上文章。比如:http://hi.baidu.com/caiweiguo/blog/item/fe070cadffd26c044a36d65a.html
用VC实现对excel文件的读操作和写操作。
摘要:生成报表和打印输出是数据处理中经常需要完成的功能,也是在VC 编程过程中比较麻烦的地方。...究了VC 实现Excel 操作自动化的方法,并详细介绍了一个常用报表的实现过程。用此方法可以实现一些复杂报表 的处理。
本工程样例中,使用VC++实现将数据在Excel中的存取操作,简洁易用。
针对Excel表格文件操作的编程实现 .VC实现对EXCEL操作
介绍了VC中实现读取Excel表数据总结。包括对excel的基本操作。
简单实现VC操作Excel选择性粘贴的例子。选择性粘贴在日常Excel处理时经常用到,而用VC操作的步骤和参数的问题,本例子正好说明。
VC中实现读取Excel表数据总结 利用VC对Excel进行操作。可以对一个目录下的所有Excel表进行处理
vc操作excel,读写excel,包括图片操作.
一个在VC中操作Excel的类,能实现对字体、颜色、背景、合并单元格等的操作,功能较完整 为了提高兼容性,我修改了其中的一处类声明,防止与comdef.h中的Font结构体冲突
vc2005开发环境,C#语言实现对Excel文件的操作
vc6.0环境里建立mfc工程,实现对excel数据的读取、保存。读取特定列,根据checkbox选中状态,保存所选行到新的excel。响应点击函数,一次选择多行。涉及对话框操作。
经典VC操作Excel表格实例程序,读写Excel表格数据,Excel与CSV格式转换。
自己封装的类,可以实现对Excel的创建、保存、设置单元格式、设置字体、设置列宽、合并单元格、粘贴、增加减少sheet、另存为txt等功能,附带了两个文件夹,主要区别在于excel9.h和excel9.cpp,简单版的只封装了常用的...
VC对Excel技术文档汇总
VC操作EXCEL,用最简单的自带函数实现对sheet的定位写入。还实现了对EXCEL进程的资源释放。
可扩展类vc操作excel表格,可以很方便实现一些基本操作.建表,插入,查询 行 列 删除 插入单元格元素
通过excel.h excel.cpp实现excel的各种操作,初学者适用!
通过VC 对excel进行操作。 实现excel的对于数据的保存和写入,并能够实现excel的报表功能实现
本源码实现了基于mfc对话框的按钮操作,实现了操作.xls文件的功能~