VC读写EXCEL
2011-07-19 09:41
225 查看
经过网络上的相关资源测试验证,编写了一个函数,可以进行EXCEL数据文件的读数据和写入数据操作。
详细代码: 首先加上EXCEL的头文件:#include "comdef.h"
#include "excel.h"
void CExcelTestDlg::OnExceltest()
{
// TODO: Add your control notification handler code here
BOOL bOpen = FALSE;//TRUE 读取 FALSE写入
//文件保存对话框
static char BASED_CODE szFilter[] = "Worksheet Files (*.xls)|*.xls|Chart Files (*.xlc)|*.xlc|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";
CFileDialog fDlg(bOpen, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
fDlg.DoModal();
if(fDlg.GetFileName().IsEmpty())
{
MessageBox("没有选择文件");
return ;
}
CString strPath = fDlg.GetPathName();
//变量申明和定义
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
_Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range rgMyRge;
LPDISPATCH lpDisp;
CString str;
//创建Excel 2000服务器(启动Excel)
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("Create Excel service failure!");
return;
}
ExcelApp.SetVisible(false);
//文件进行打开操作(打开已有文件或者新建文件)
if(bOpen)
{
//利用已有的文件进行打开操作
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks());
lpDisp = wbsMyBooks.Open(strPath, covOptional, covOptional, covOptional, covOptional,\
covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,\
covOptional,covOptional,covOptional);
wbMyBook.AttachDispatch(lpDisp);
}
else
{
//利用模板文件建立新文档
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
wbMyBook = wbsMyBooks.Add(covOptional);
}
//得到Worksheets
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);
//得到当前活跃的SHEET
lpDisp = wbMyBook.GetActiveSheet();
wsMysheet.AttachDispatch(lpDisp);
//读取已经使用区域的信息,包括已使用的行数 列数 起始行 起始列
Range usedRange;
usedRange.AttachDispatch(wsMysheet.GetUsedRange());
rgMyRge.AttachDispatch(usedRange.GetRows());
long iRowNum = rgMyRge.GetCount(); //已使用的行数
rgMyRge.AttachDispatch(usedRange.GetColumns());
long iColNum = rgMyRge.GetCount(); //已使用的列数
long iStartRow = usedRange.GetRow(); //已使用的起始行数
long iStartCol = usedRange.GetColumn(); //已使用的起始列数
str.Format("%d %d %d %d", iRowNum, iColNum, iStartRow, iStartCol);
MessageBox(str);
//得到sheet1
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
//得到全部Cells,此时,rgMyRge是cells的集合
rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);
if(bOpen)
{
//读取X行Y列的单元的值
rgMyRge.AttachDispatch(rgMyRge.GetItem(_variant_t((long)3),_variant_t((long)4)).pdispVal);
COleVariant vResult = rgMyRge.GetValue2();
if(vResult.vt == VT_BSTR)
{ //字符串
str = vResult.bstrVal;
}
else if (vResult.vt == VT_R8)
{
str.Format("%f", vResult.dblVal);
}else if (vResult.vt == VT_DATE)
{
SYSTEMTIME st;
VariantTimeToSystemTime(vResult.date, &st);
}else if (vResult.vt == VT_I4)
{
str.Format("%d", vResult.lVal);
}else if (vResult.vt == VT_EMPTY)
{
str = "";
}
MessageBox(str);
}
else
{
//设置X行Y列的单元的值
rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("test"));
for (int i = 2; i < 5; i++)
{
for (int j = 1; j < 8; j++)
{
rgMyRge.SetItem(_variant_t((long)i),_variant_t((long)j),_variant_t((long)(2000+i+j)));
}
}
//设置单元格字体颜色
Font oFont;
rgMyRge = wsMysheet.GetRange(COleVariant("A2"), COleVariant("G2")); // 获得A1:D1的Range
oFont = rgMyRge.GetFont(); // 获得Range的字体
oFont.SetBold(COleVariant((short)TRUE)); // 设置是否粗体
oFont.SetColor(COleVariant((long)RGB(255, 0, 0))); // 设置字体颜色
oFont.SetName(COleVariant("楷体")); // 设置字体类型
rgMyRge = rgMyRge.GetEntireColumn(); // 获得全部的单元格
rgMyRge.AutoFit(); // 自动适合尺寸
//设置单元格公式
rgMyRge = wsMysheet.GetRange(COleVariant("D2"), covOptional); // 获得D2 Range
rgMyRge = rgMyRge.GetResize(COleVariant((long)1), COleVariant((long)1)); // 重新设置D2的大小
rgMyRge.SetFormula(COleVariant("=LEFT(TEXT(C2,10),2)")); // 给D2:D21设置公式
//合并单元格
/* Range unionRange;
unionRange = wsMysheet.GetRange(COleVariant("A1"), COleVariant("C1"));
COleVariant vResult = unionRange.GetMergeCells();
unionRange = unionRange.GetResize(COleVariant((long)2), COleVariant((long)3)); //合并单元格行数和列数
unionRange.Merge(COleVariant((long)0)); //合并单元格
unionRange.SetRowHeight(COleVariant((short)30)); //设置单元格的高度
unionRange.SetHorizontalAlignment(COleVariant((long)-4108)); // 水平居中对齐
*/ //向单元格中插入图片(支持BMP、JPG格式,其他没试)
Shapes shapes = wsMysheet.GetShapes(); // 从Sheet对象上获得一个Shapes
rgMyRge = wsMysheet.GetRange(COleVariant("B6"),COleVariant("J22")); // 获得Range对象,用来插入图片
shapes.AddPicture("D:\\009.jpg" , false , true ,
(float)rgMyRge.GetLeft().dblVal, (float)rgMyRge.GetTop().dblVal, // 从本地添加一个图片
(float)rgMyRge.GetWidth().dblVal, (float)rgMyRge.GetHeight().dblVal);
ShapeRange sRange = shapes.GetRange(_variant_t(long(1)));
sRange.SetHeight(float(500));
sRange.SetWidth(float(500));
//保存文件
wbMyBook.SetSaved(TRUE); // 将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存
wbMyBook.SaveAs(_variant_t(strPath), covOptional,covOptional,covOptional,covOptional,covOptional,0,covOptional,covOptional,covOptional,covOptional,covOptional);
}
ExcelApp.SetVisible(false);
ExcelApp.Quit();
//释放对象
rgMyRge.ReleaseDispatch();
wsMysheet.ReleaseDispatch();
wssMysheets.ReleaseDispatch();
wbMyBook.ReleaseDispatch();
wbsMyBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();
}
详细代码: 首先加上EXCEL的头文件:#include "comdef.h"
#include "excel.h"
void CExcelTestDlg::OnExceltest()
{
// TODO: Add your control notification handler code here
BOOL bOpen = FALSE;//TRUE 读取 FALSE写入
//文件保存对话框
static char BASED_CODE szFilter[] = "Worksheet Files (*.xls)|*.xls|Chart Files (*.xlc)|*.xlc|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";
CFileDialog fDlg(bOpen, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter);
fDlg.DoModal();
if(fDlg.GetFileName().IsEmpty())
{
MessageBox("没有选择文件");
return ;
}
CString strPath = fDlg.GetPathName();
//变量申明和定义
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
_Application ExcelApp;
Workbooks wbsMyBooks;
_Workbook wbMyBook;
Worksheets wssMysheets;
_Worksheet wsMysheet;
Range rgMyRge;
LPDISPATCH lpDisp;
CString str;
//创建Excel 2000服务器(启动Excel)
if (!ExcelApp.CreateDispatch("Excel.Application",NULL))
{
AfxMessageBox("Create Excel service failure!");
return;
}
ExcelApp.SetVisible(false);
//文件进行打开操作(打开已有文件或者新建文件)
if(bOpen)
{
//利用已有的文件进行打开操作
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks());
lpDisp = wbsMyBooks.Open(strPath, covOptional, covOptional, covOptional, covOptional,\
covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,covOptional,\
covOptional,covOptional,covOptional);
wbMyBook.AttachDispatch(lpDisp);
}
else
{
//利用模板文件建立新文档
wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);
wbMyBook = wbsMyBooks.Add(covOptional);
}
//得到Worksheets
wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);
//得到当前活跃的SHEET
lpDisp = wbMyBook.GetActiveSheet();
wsMysheet.AttachDispatch(lpDisp);
//读取已经使用区域的信息,包括已使用的行数 列数 起始行 起始列
Range usedRange;
usedRange.AttachDispatch(wsMysheet.GetUsedRange());
rgMyRge.AttachDispatch(usedRange.GetRows());
long iRowNum = rgMyRge.GetCount(); //已使用的行数
rgMyRge.AttachDispatch(usedRange.GetColumns());
long iColNum = rgMyRge.GetCount(); //已使用的列数
long iStartRow = usedRange.GetRow(); //已使用的起始行数
long iStartCol = usedRange.GetColumn(); //已使用的起始列数
str.Format("%d %d %d %d", iRowNum, iColNum, iStartRow, iStartCol);
MessageBox(str);
//得到sheet1
wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);
//得到全部Cells,此时,rgMyRge是cells的集合
rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);
if(bOpen)
{
//读取X行Y列的单元的值
rgMyRge.AttachDispatch(rgMyRge.GetItem(_variant_t((long)3),_variant_t((long)4)).pdispVal);
COleVariant vResult = rgMyRge.GetValue2();
if(vResult.vt == VT_BSTR)
{ //字符串
str = vResult.bstrVal;
}
else if (vResult.vt == VT_R8)
{
str.Format("%f", vResult.dblVal);
}else if (vResult.vt == VT_DATE)
{
SYSTEMTIME st;
VariantTimeToSystemTime(vResult.date, &st);
}else if (vResult.vt == VT_I4)
{
str.Format("%d", vResult.lVal);
}else if (vResult.vt == VT_EMPTY)
{
str = "";
}
MessageBox(str);
}
else
{
//设置X行Y列的单元的值
rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("test"));
for (int i = 2; i < 5; i++)
{
for (int j = 1; j < 8; j++)
{
rgMyRge.SetItem(_variant_t((long)i),_variant_t((long)j),_variant_t((long)(2000+i+j)));
}
}
//设置单元格字体颜色
Font oFont;
rgMyRge = wsMysheet.GetRange(COleVariant("A2"), COleVariant("G2")); // 获得A1:D1的Range
oFont = rgMyRge.GetFont(); // 获得Range的字体
oFont.SetBold(COleVariant((short)TRUE)); // 设置是否粗体
oFont.SetColor(COleVariant((long)RGB(255, 0, 0))); // 设置字体颜色
oFont.SetName(COleVariant("楷体")); // 设置字体类型
rgMyRge = rgMyRge.GetEntireColumn(); // 获得全部的单元格
rgMyRge.AutoFit(); // 自动适合尺寸
//设置单元格公式
rgMyRge = wsMysheet.GetRange(COleVariant("D2"), covOptional); // 获得D2 Range
rgMyRge = rgMyRge.GetResize(COleVariant((long)1), COleVariant((long)1)); // 重新设置D2的大小
rgMyRge.SetFormula(COleVariant("=LEFT(TEXT(C2,10),2)")); // 给D2:D21设置公式
//合并单元格
/* Range unionRange;
unionRange = wsMysheet.GetRange(COleVariant("A1"), COleVariant("C1"));
COleVariant vResult = unionRange.GetMergeCells();
unionRange = unionRange.GetResize(COleVariant((long)2), COleVariant((long)3)); //合并单元格行数和列数
unionRange.Merge(COleVariant((long)0)); //合并单元格
unionRange.SetRowHeight(COleVariant((short)30)); //设置单元格的高度
unionRange.SetHorizontalAlignment(COleVariant((long)-4108)); // 水平居中对齐
*/ //向单元格中插入图片(支持BMP、JPG格式,其他没试)
Shapes shapes = wsMysheet.GetShapes(); // 从Sheet对象上获得一个Shapes
rgMyRge = wsMysheet.GetRange(COleVariant("B6"),COleVariant("J22")); // 获得Range对象,用来插入图片
shapes.AddPicture("D:\\009.jpg" , false , true ,
(float)rgMyRge.GetLeft().dblVal, (float)rgMyRge.GetTop().dblVal, // 从本地添加一个图片
(float)rgMyRge.GetWidth().dblVal, (float)rgMyRge.GetHeight().dblVal);
ShapeRange sRange = shapes.GetRange(_variant_t(long(1)));
sRange.SetHeight(float(500));
sRange.SetWidth(float(500));
//保存文件
wbMyBook.SetSaved(TRUE); // 将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存
wbMyBook.SaveAs(_variant_t(strPath), covOptional,covOptional,covOptional,covOptional,covOptional,0,covOptional,covOptional,covOptional,covOptional,covOptional);
}
ExcelApp.SetVisible(false);
ExcelApp.Quit();
//释放对象
rgMyRge.ReleaseDispatch();
wsMysheet.ReleaseDispatch();
wssMysheets.ReleaseDispatch();
wbMyBook.ReleaseDispatch();
wbsMyBooks.ReleaseDispatch();
ExcelApp.ReleaseDispatch();
}
相关文章推荐
- CMenuXP系统菜单美化,odbc读写excel,提示框--vc6
- VC++读写打开Excel文档(代码备份)
- VC用OLE方式读写Excel
- VC读写Excel MFC读写Excel 考勤数据
- VC用OLE方式读写Excel
- 通过Vc大批量读写excel文件时,若此时打开其它EXCEL文件,则出现批量读写excel文件时发生阻塞?
- 转贴:vc读写excel中的数据
- VC 读写Excel (第三方类CSpreadSheet)
- VC++读写打开Excel文档数据
- VC读写Excel 速度问题
- 用VC直接读写excel中的数据
- VC操作word和excel文件,查询与读写[依赖office环境]
- vc读写excel
- VC用OLE方式读写Excel
- vc中读写excel(数据库找不到搜索引擎对象)
- 通过vc中的CDatabase类来直接通过ODBC读写Excel表格文件
- VC读写excel(使用CSpreadSheet类方法)
- VC++如何读写excel
- vc读写Excel的方法,text,copy,paste,value
- VC读写EXCEL文件类(已安装excel)