- 新建一个名为ExcelTest1的工程。
- 建立类向导,选择Automation,单击Add Class按钮,选择From a type library...,弹出文件选择对话框,之后定位到Microsoft Office的安装目录,选择EXCEL.exe,弹出Confirm Classes窗口,选择列表中_Application、_Workbook 、Workbooks 、_Worksheet、Worksheets、Rang、Font类,单击OK按钮。此时多了EXCEL.H及EXCEL.CPP两个文件。
- 打开stdafx.h头文件确保包含如下头文件:
#include <afxdisp.h>
#include "excel.h"
- 在ExcelTest1.cpp开头增加以下头文件
#include<comdef.h> //程序里使用_variant_t需要
#include<COMUTIL.H>
#include "shlwapi.h"//创建文件夹时需要包含该头文件与库函数
#pragma comment(lib,"shlwapi.lib")
打开ExcelTest1.cpp文件,修改InitInstance(),加入如下代码:
BOOL CExcelTest1App::InitInstance()
{
if( !AfxOleInit() )
{
AfxMessageBox("初始化Ole出错!");
return FALSE;
}
}
为保证编译时不产生重复定义错误,打开excel.h文件,在文件开始位置加入如下代码:
#if !defined _HEAD_FILE_EXCEL_
#define _HEAD_FILE_EXCEL_
相应的,在文件末尾加入:
#endif
- 操作EXCEL文件
(1)选择ResourceView工作区,打开IDD_EXCELTEST1_DIALOG,添加如下编辑框,
建立类向导,关联如下变量:
(2)选择ResourceView工作区,打开IDD_EXCELTEST1_DIALOG,在对话框中添加一个按钮控件Button1,修改属性名为保存数据,用来保存编辑框数据到Excel。添加一个按钮控件Button2,修改属性名为读取数据,用来将Excel表格数据读取到编辑框。双击Button1,生成一个Button1 Click事件的处理函数,双击Button2,生成一个Button2 Click事件的处理函数:
void CExcelTest1Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
}
void CExcelTest1Dlg::OnButton2()
{
// TODO: Add your control notification handler code here
}
(3)添加“保存数据“代码内容,在OnButton1()函数中,添加代码:
void CTExcelest1Dlg::OnButton1()
{
// TODO: Add your control notification handler code here
_Application app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range; //Excel中针对单元格的操作都应先获取其对应的Range对象
Font font;
Range cols;
UpdateData(TRUE); //更新编辑框
if(m_date==""||m_jihao=="")
{
this->MessageBox("机号和日期不能为空!");
return;
}
if( !app.CreateDispatch("Excel.Application") ){
this->MessageBox("无法创建Excel应用!");
return;
}
else
{
app.SetVisible(FALSE); //Excel窗口不打开
app.SetUserControl(TRUE);//并设置状态为用户可控制
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); //covOptional 可选参数的VARIANT类型
books.AttachDispatch(app.GetWorkbooks());
book.AttachDispatch(books.Add(covOptional));
sheets.AttachDispatch(book.GetWorksheets());
sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")));
Range range;
range.AttachDispatch(sheet.GetCells());
if(!PathFileExists("C:\\data\\"))
//创建文件夹路径,如果不存在则创建data文件夹
CreateDirectory("C:\\data\\",NULL);
int r,c,i=1; //r表示行数,c表示列数
char shuju[200][16];
CString savePath="C:\\data\\"+m_date+"_"+m_jihao;
//这里data存储要写入的数据,savePath为要保存的Excel文件路径
sprintf(shuju[1],"%f",m_edit1);
sprintf(shuju[2],"%f",m_edit2);
sprintf(shuju[3],"%f",m_edit3);
sprintf(shuju[4],"%f",m_edit4);
sprintf(shuju[5],"%f",m_edit5);
sprintf(shuju[6],"%f",m_edit6);
sprintf(shuju[7],"%f",m_edit7);
sprintf(shuju[8],"%f",m_edit8);
range.SetItem(_variant_t((long)1), _variant_t((long)1), _variant_t("数据1"));//第一行写入标题栏
range.SetItem(_variant_t((long)1), _variant_t((long)2), _variant_t("数据2"));
range.SetItem(_variant_t((long)1), _variant_t((long)3), _variant_t("数据3"));
range.SetItem(_variant_t((long)1), _variant_t((long)4), _variant_t("数据4"));
for(r=2;r<=3;r++)
{
for(c=1;c<=4;c++)
{
range.SetItem(_variant_t((long)r), _variant_t((long)c), _variant_t(shuju[i]));//在第r行c列写入数据shuju[],注意行和列都是从1开始
i++;
}
}
book.SaveAs(COleVariant(savePath), covOptional, covOptional,
covOptional, covOptional, covOptional, 0, covOptional,
covOptional, covOptional, covOptional, covOptional);
book.SetSaved(TRUE);
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
app.Quit();
this->MessageBox("数据保存成功!");
}
}
(4)添加“读取数据“代码内容,在OnButton2()函数中,添加代码:
void CExcelTest1Dlg::OnButton2() /////读取Excel数据////
{
// TODO: Add your control notification handler code here
_Application app;
Workbooks books;
_Workbook book;
Worksheets sheets;
_Worksheet sheet;
Range range;
LPDISPATCH lpDisp; //接口指针
COleVariant avar((long)DISP_E_PARAMNOTFOUND,VT_ERROR);
////////////////////////////////////////////////////////////////////////////////////
CString excelPathName; //调用打开文件对话框
CFileDialog dlg(TRUE, //TRUE为OPEN对话框,FALSE为SAVE AS对话框
NULL,
NULL,
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
_T("xlsx Files(*.xlsx)|*.xlsx|*.xls"), //打开xlsx文件
NULL);
if(dlg.DoModal()==IDOK) //选择确定按钮保存文件路径
{
excelPathName=dlg.GetPathName(); //文件名保存在了excelPathName里
}
else return; //选择取消按钮就返回
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if( !app.CreateDispatch("Excel.Application") ){
this->MessageBox("无法创建Excel应用!");
return;
}
books=app.GetWorkbooks();
lpDisp = books.Open(excelPathName,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional
);
book.AttachDispatch( lpDisp );
sheets.AttachDispatch(book.GetWorksheets());
sheet.AttachDispatch(sheets.GetItem(_variant_t("sheet1")));
range.AttachDispatch(sheet.GetCells());
_variant_t var;
// CString tmpStr;//存储每个格子的数据
CString shuju[200];
int r,c,i=1;
for(r=2;r<=3;r++)
{
for(c=1;c<=4;c++)
{
var =range.GetItem(_variant_t((long)r)
,_variant_t((long)c)); //读取第r行c列的数据,注意行和列都是从1开始
shuju[i].Format("%s",(char*)(_bstr_t)var);//转换成CString
i++;
}
}
//将读取的数据存入编辑框内。
int index=excelPathName.GetLength();
int index1=excelPathName.Find("_"); //查找“_”的位置
CString str_date=excelPathName.Mid(3+5,index1-3-5);
CString str_jihao=excelPathName.Mid(index1+1,index-index1-6); //取从“_”开始的n个字符
m_edit1=(FLOAT)atof(shuju[1]);
m_edit2=(FLOAT)atof(shuju[2]);
m_edit3=(FLOAT)atof(shuju[3]);
m_edit4=(FLOAT)atof(shuju[4]);
m_edit5=(FLOAT)atof(shuju[5]);
m_edit6= (FLOAT)atof(shuju[6]);
m_edit7=(FLOAT)atof(shuju[7]);
m_edit8=(FLOAT)atof(shuju[8]);
m_date=str_date;
m_jihao=str_jihao;
UpdateData(FALSE); //更新编辑框内容
book.SetSaved(TRUE);
app.SetUserControl(FALSE);
book.Close(covOptional,covOptional,covOptional);
books.Close();
range.ReleaseDispatch();//注意释放顺序
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
app.Quit();
this->MessageBox("数据读取成功!");
}