目前用VC控制excel进行输出应该是没有问题了,读入部分程序通过,但是没有进行验证。
这个是综合了网上的资源,在VS2005下调试通过的版本。
第一步:在VC++6.0中进行。(在VS2005中会出现错误)
导入Excel库文件。
首先打开Class Wizard,点击"Add class"按钮下的"From a type Library"导入 office安装目录下的"excel.exe"(适用于 Excel2003),然后选择需要用的一些类,比如_Application, _Workbook, Workbooks, Worksheets,_Wroksheet,Range,Shapes等。点击确定后,系统会在你的程序目录下生成excel.h和excel.cpp两个文件,在要使用这些导入的类时加入#include "excel.h"即可。
这一步在VS2005中实验会出现错误,网上说在VC++6.0中是OK的。
在VC++6.0并没有实际操作,而是使用了网上下载的一个现成的资源,使用时直接把excel.h和excel.cpp加入工程即可。
第二步:初始化。
//初始化COM组件;但是这一步很奇怪,在自己的工程中会出现已近初始化的错误,去掉之后反而是好使了。
if(!AfxOleInit())
{
AfxMessageBox(_T("无法初始化COM的动态连接库"));
return ;
}
//创建Excel 服务器(启动Excel),定义app的全局或成员变量
_Application app;//定义全局的excel服务器变量
// 启动Excel 服务器
if (!app.CreateDispatch(_T("Excel.Application")))
{
AfxMessageBox(_T("无法启动Excel服务器"));
return ;
}
//设置Excel的状态
app.SetVisible(TRUE); // 使Excel可见
app.SetUserControl(TRUE); // 允许其他用户控制Excel
第三步:编写相应操作代码。
//VC对Excel的操作
// 定义变量
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
LPDISPATCH lpDisp;
Range range;
Range iCell;
Font font;
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
//打开D:\\1.xls
books.AttachDispatch(app.GetWorkbooks());
lpDisp = books.Open(_T("D:\\1.xls"),
covOptional, covOptional, 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);
// 分别向每个单元格添加数据
// Excel2000 用函数SetValue()即可, Excel2003用函数SetValue2()
range = sheet.GetRange(COleVariant(_T("A1")), covOptional); // 获取A1 Range
range.SetValue2( COleVariant(_T("Date"))); // 添加数据
range = sheet.GetRange(COleVariant(_T("B1")), covOptional); // 获取B1 Range
range.SetValue2(COleVariant(_T("Order"))); // 添加数据
//还有另一种方法设置数据
//设置第一个单元格的值"HI,EXCEL!",可以使用循环的方式来写数据
range.SetItem(COleVariant(long(3)),COleVariant(long(1)),COleVariant(_T("HI,EXCEL!")));
//合并单元格
// 思路:1.先获取A1:C1的Range范围,然后重新定义此范围,最后合并
// 2.直接获得A1:C2的Range范围,直接合并。结果和第一种方法一样
Range unionRange;
unionRange = sheet.GetRange(COleVariant(_T("A1")), COleVariant(_T("C1")));
COleVariant vResult = unionRange.GetMergeCells();
unionRange = unionRange.GetResize(COleVariant((long)2), COleVariant((long)3));
unionRange.Merge(COleVariant((long)0)); //合并单元格
unionRange.SetRowHeight(COleVariant((short)30)); //设置单元格的高度
range.SetColumnWidth(COleVariant((short)30)); //设置列宽为40
unionRange.SetHorizontalAlignment(COleVariant((long)-4108));// 水平居中对齐
// 向单元格中添加公式,excel会自动计算
range = sheet.GetRange(COleVariant(_T("E3")), covOptional); // 获得D2 Range
range = range.GetResize(COleVariant((long)1), COleVariant((long)1)); // 重新设置D2的大小
range.SetFormula(COleVariant(_T("=C2*0.07"))); // 给D2:D21设置公式
// 设置单元格的格式
range = sheet.GetRange(COleVariant(_T("A1")), COleVariant(_T("D2"))); // 获得A1:D1的Range
font = range.GetFont(); // 获得Range的字体
font.SetBold(COleVariant((short)TRUE)); // 设置是否粗体
font.SetItalic(COleVariant((short)TRUE)); //斜体
font.SetColor(COleVariant((long)RGB(255, 255, 0))); // 设置字体颜色
font.SetName(COleVariant(_T("黑体"))); // 设置字体类型
range = range.GetEntireColumn(); // 获得全部的单元格
range.AutoFit(); // 自动适合尺寸
font.DetachDispatch(); //释放字体对象
//向单元格中插入图片(支持BMP、JPG格式,其他没试)
Shapes shapes = sheet.GetShapes(); // 从Sheet对象上获得一个Shapes
range = sheet.GetRange(COleVariant(_T("B16")),COleVariant(_T("J22"))); // 获得Range对象,用来插入图片
//shapes.AddPicture(_T("D:\\test1.jpg") , false , true ,
// (float)range .GetLeft().dblVal, (float)range .GetTop().dblVal, // 从本地添加一个图片
// (float)range .GetWidth().dblVal, (float)range .GetHeight().dblVal);
//这种方法的图片根据range的大小缩放,产生形变,所以已知图片大小的情况下,用下面这种
shapes.AddPicture(_T("D:\\test1.jpg") , false , true ,
500, 500, // 从本地添加一个图片
100, 100);
Shape m_oShape;
m_oShape.AttachDispatch( shapes.GetRange( COleVariant((long)1) ), TRUE );
//m_oShape.SetWidth(float(200));
//*****
//读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
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 );
vResult =range.GetValue2();
CString str;
if(vResult.vt == VT_BSTR) //字符串
{
str=vResult.bstrVal;
}
else if (vResult.vt==VT_R8) //8字节的数字
{
str.Format(_T("%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;
}
}
//*****
//将文件保存为2.xls
book.SaveAs(COleVariant(_T("D:\\2.xls")),
covOptional,covOptional, covOptional,covOptional,covOptional,
0,covOptional,covOptional,covOptional,covOptional,covOptional);
//*****
//关闭所有的book,退出Excel
//book.Close (covOptional,COleVariant(OutFilename),covOptional);
//books.Close();
//app.Quit();
book.SetSaved(TRUE); // 将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存
range.ReleaseDispatch(); // 释放Range对象
sheet.ReleaseDispatch(); // 释放Sheet对象
sheets.ReleaseDispatch(); // 释放Sheets对象
book.ReleaseDispatch(); // 释放Workbook对象
books.ReleaseDispatch(); // 释放Workbooks对象
book.Close (covOptional, covOptional,covOptional);// 关闭Workbook对象
books.Close(); // 关闭Workbooks对象
app.Quit(); // 退出_Application
app.ReleaseDispatch (); // 释放_Application