mfc对Excel的操作
配置环境
首要条件:安装好Office
引入Excel资源类
在解决方案资源管理器中右击项目:添加->新建项
选择MFC->TypeLib中的MFC类
实现接口的位置选文件
,位置选择EXCEL.EXE
(从Office安装目录中找),实现接口选择_Application
、_Workbook
、_Worksheet
、Range
、Workbooks
、Worksheets
。
在解决方案资源管理器的头文件中会出现.h
文件。
在项目的头文件下引入Excel
类的头文件。
#include "CApplication.h"
#include "CRange.h"
#include "CWorkbook.h"
#include "CWorkbooks.h"
#include "CWorksheet.h"
#include "CWorksheets.h"
在刚引入的头文件中注释一下代码:
//#import "D:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace
进入CRange.h
文件中
将DialogBox改为_DialogBox
配置完成。
对Excel操作
从Excel中导入数据操作
将Excel
中的数据导入到List Control
中显示出来。
// 按下导入数据按钮
void CDialogTest::ImportData()
{
// 选择合适的文件读入数据
//
//设置过滤器
TCHAR szFilter[] = _T("Excel文件(*.xls/*.xlsx)|*.xls*|所有文件(*.*)|*.*||");
CFileDialog fileDlg(TRUE, _T("doc"), _T(""), OFN_OVERWRITEPROMPT, szFilter, this);
CString sExcelFile;
// 构造打开文件对话框
if (IDOK == fileDlg.DoModal())
{
// 如果点击了文件对话框上的“打开”按钮,则将选择的文件路径存储到strFilePath中
sExcelFile = fileDlg.GetPathName();
//MessageBox(sExcelFile, _T("Output")); // 输出打开文件所在的路径
}
if (sExcelFile == "") return;
//读取Excel中的数据
ReadAllItem(sExcelFile);
}
// 读出Excel所有内容,将其所有内容显示在list上
void CDialogTest::ReadAllItem(CString sExcelFile) // 读取Excel文本
{
CApplication App;//创建应用实例
CWorkbooks Books;//工作簿,多个Excel文件
CWorkbook Book;//单个工作簿
CWorksheets sheets;//多个sheets页面
CWorksheet sheet;//单个sheet页面
CRange range;//操作单元格
CRange iCell;
LPDISPATCH lpDisp;
COleVariant vResult; //COleVariant类是对VARIANT结构的封装
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
if (!App.CreateDispatch(_T("Excel.Application"), NULL))
{
AfxMessageBox(_T("无法启动Excel服务器!"));
return;
}
Books.AttachDispatch(App.get_Workbooks());
lpDisp = Books.Open(sExcelFile, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional);
//得到Workbook
Book.AttachDispatch(lpDisp);
//得到Worksheets
sheets.AttachDispatch(Book.get_Worksheets());
//得到当前活跃sheet
//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待
lpDisp = Book.get_ActiveSheet();
sheet.AttachDispatch(lpDisp);
//获取行列号
range = sheet.get_UsedRange();
range = range.get_Rows();
long rows = range.get_Count();
range = range.get_Columns();
long columns = range.get_Count();
// 清空List数据
m_List.DeleteAllItems(); //清空所有表项
// 设置Id的值
CString strSql = _T("select * from UserInfo;");
CString strLastId;
int lastId = RowToId[m_rows - 1] + 1;
for (long i = 2; i < rows + 1; i++) // 从第二行开始读数据,第一行是表头的信息
{
CStringArray strListData; // 存储放在List中的Data信息
for (long j = 1; j < columns + 1; j++)
{
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant(i), COleVariant((long)j)).pdispVal); //第一变量是行,第二个变量是列,即第i行第j列
vResult = range.get_Value2();
CString str;
if (vResult.vt == VT_BSTR) //字符串
{
str = vResult.bstrVal;
strListData.Add(str);
}
else if (vResult.vt == VT_R8) //8字节的数字
{
str.Format(_T("%.lf"), vResult.dblVal);
strListData.Add(str);
}
else // 若Excel有个单元格为空时会出现错误
{
strListData.Add(_T(""));
}
}
m_List.InsertItem(i - 2, strListData[0]);
m_List.SetItemText(i - 2, 1, strListData[1]);
m_List.SetItemText(i - 2, 2, strListData[2]);
}
Books.Close();
App.Quit();
//释放对象
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
Book.ReleaseDispatch();
Books.ReleaseDispatch();
App.ReleaseDispatch();
}
将数据导出Excel操作
将List Control
的数据导入Excel
。
// 导出所有数据
void CDialogTest::ExportData(CString sExcelFile)
{
COleVariant
covTrue((short)TRUE),
covFalse((short)FALSE),
covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
CApplication app;
CWorkbooks books;
CWorkbook book;
CWorksheets sheets;
CWorksheet sheet;
CRange range;
if (!app.CreateDispatch(_T("Excel.Application")))
{
MessageBox(_T("创建失败!"));
return;
}
books = app.get_Workbooks();
book = books.Add(covOptional);
sheets = book.get_Worksheets(); //得到books
sheet = sheets.get_Item(COleVariant((short)1));
//得到全部Cells
range.AttachDispatch(sheet.get_Cells());
CString sText[] = { _T("id"), _T("Account"), _T("Pass") };
for (int setnum = 0; setnum < m_List.GetItemCount() + 1; setnum++) //GetItemCount()列表的里面的条目数量, 横着的 行
{
for (int num = 0; num < 3; num++)
{
if (!setnum)
{
range.put_Item(_variant_t((long)(setnum + 1)), variant_t((long)(num + 1)),
_variant_t(sText[num]));
}
else
{
range.put_Item(_variant_t((long)(setnum + 1)), _variant_t((long)(num + 1)),
_variant_t(m_ListData.GetItemText(setnum - 1, num)));//GetItemText()获取第setnum-1行,num列的文本
}
}
}
//保存
book.SaveCopyAs(COleVariant(sExcelFile)); //SaveCopyAs在strFile路径下保存为指定格式.xlsx的文件
book.put_Saved(true); //将Workbook的保存状态设置为已保存,即不让系统提示是否人工保存
app.put_Visible(true); //设置表可见性
//释放对象
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.ReleaseDispatch();
app.Quit();
}