【整理】Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR: https://www.cnblogs.com/goed/archive/2011/11/11/2245702.html
1、新建MFC application工程,改为dialog based
2、http://www.cnblogs.com/xianyunhe/archive/2011/09/25/2190485.html
project>MFC Class Wizard 红色箭头找到add class from typelib 然后添加选excel 添加类
excel接口 | 导入类 | 头文件 | 说明 |
_Application | CApplicaton | Application.h | Excel应用程序。 |
Workbooks | CWorkbooks | Workbooks.h | 工作簿的容器,里面包括了Excel应用程序打开的所有工作簿。 |
_Workbook | CWorkbook | Workbook.h | 单个工作簿。 |
Worksheets | CWorksheets | Worksheets.h | 单个工作簿中的Sheet表格的容器,包括该工作簿中的所有Sheet。 |
_Worksheet | CWorksheet | Worksheet.h | 单个Sheet表格。 |
Range | CRange | Range.h | 一定数量的单元格,可对单元格进行单个或多个单元格进行操作。 |
可以在类视图中看到已经加上了这些类。
3、回到主界面,拖动一个button到上面,右击property,修改caption为 打开Excel文件,
增加点击的相应函数。右击打开class wizard
4、在ReadExcelDlg.cpp中引入这些.h,并将这些第三行的import直接注释掉
然后将CRange.h 335行改为VARIANT _DialogBox() 加一个下划线 避免了冲突 不然报错
5、多行缩进:
首先,选中需要缩进的行代码:
1、增大缩进:“Tab”键
2、减小缩进:“Shift”键 + “Tab”键
复制以下代码段进入void CReadExcelDlg::OnClickedButton1()
CFileDialog dlg(TRUE,NULL,NULL,OFN_OVERWRITEPROMPT,_T("excel (*.xlsx)|*.xlsx|excel (*.xls)|*.xls|All Files (*.*)|*.*|"),NULL);
char buffer[255];
GetCurrentDirectory(sizeof(buffer),(LPWSTR)buffer);//当前目录作为默认文件路径
dlg.m_ofn.lpstrInitialDir = (LPWSTR)buffer;
dlg.DoModal();
CString strFileName=dlg.GetPathName();
if(strFileName=="")
{
MessageBox(_T("还没有选择文件呢"));
return;
}
//MessageBox(strFileName);
//复杂应用程序多个对象定义
CApplication app;
CWorkbook book;
CWorkbooks books;
CWorksheet sheet;
CWorksheets sheets;
CRange range;
//创建Excel 服务器(启动Excel)
if (!app.CreateDispatch(_T("Excel.Application")))
{
MessageBox(_T("启动失败"));
}
COleVariant vResult;//存放临时单元格内容
COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
LPDISPATCH lpDisp;//结构体 用于单元格显示数据
books.AttachDispatch(app.get_Workbooks()); //启动app, 打开books工作簿
lpDisp = books.Open(strFileName, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional, covOptional, covOptional, covOptional,
covOptional, covOptional);//为了获得工作簿是谁
//得到Workbook
book.AttachDispatch(lpDisp);//通过lpDisp,打开book
//得到Worksheets
sheets.AttachDispatch(book.get_Worksheets());//sheets
sheet = sheets.get_Item(COleVariant((short)1));
//得到当前活跃sheet
//如果有单元格正处于编辑状态中,此操作不能返回,会一直等待
lpDisp = book.get_ActiveSheet();
sheet.AttachDispatch(lpDisp);
//读取Cells信息
range.AttachDispatch(sheet.get_Cells());
//第一变量是行,第二个变量是列,即第二行第一列
range.AttachDispatch(range.get_Item(COleVariant((long)1), COleVariant((long)5)).pdispVal);
vResult = range.get_Value2();
CString str;
str = vResult.bstrVal;//bVal对数值进行处理
//MessageBox(str);
//为什么这里任务管理器里面还有Excel?
//range.AttachDispatch(sheet.get_Cells());
//range.AttachDispatch(range.get_Item(COleVariant((long)1), COleVariant((long)1)).pdispVal);
// vResult = range.get_Value2();
//str = vResult.bstrVal;
//MessageBox(str);
range.AttachDispatch(sheet.get_UsedRange());
range.AttachDispatch(range.get_Rows());
long iRow = range.get_Count(); //得到行数
range.AttachDispatch(range.get_Columns());
long iCol = range.get_Count();//得到列数
//CString str;
str.Format(_T("%ld行 %ld列"),iRow,iCol);
//MessageBox(str);
CString *name = new CString[iRow-1];
int *depart = new int[iRow-1];
CString *tel = new CString[iRow-1];
MessageBox(_T("即将开始导入"));
for(int i=2;i<=iRow;i++)
{
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)i), COleVariant((long)6)).pdispVal);
vResult = range.get_Value2();
name[i-2] = vResult.bstrVal;
//str = vResult.bstrVal;
//MessageBox(str);
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)i), COleVariant((long)7)).pdispVal);
vResult = range.get_Value2();
depart[i-2] = (int)vResult.dblVal;//vResult.dblVal;
//str.Format(_T("%d"),(int)vResult.dblVal);
//MessageBox(str);
int posi = 0;
range.AttachDispatch(sheet.get_Cells());
range.AttachDispatch(range.get_Item(COleVariant((long)i), COleVariant((long)12)).pdispVal);
vResult = range.get_Value2();
//tel[i-2].Format(_T("%f"),vResult.dblVal);
//MessageBox(tel[i-2]);
str.Format(_T("%f"), vResult.dblVal);
posi = str.Find('.');
tel[i-2] = str.Left(posi);
//MessageBox(tel[i-2]);
}
//ListControl中展示数据
int nItem = 0;//m_List.GetItemCount();
CString de;//department用于转换,只有CString才可以传入控件中显示
for(int i=1;i<iRow-1;i++)
{
nItem = m_List.GetItemCount();//获得当前的行数
m_List.InsertItem(nItem,_T(""));
m_List.SetItemText(nItem,0,name[i]);
de.Format(_T("%d"),depart[i]);
m_List.SetItemText(nItem,1,de);
m_List.SetItemText(nItem,2,tel[i]);
}
UpdateData(0);//UpdateData(FALSE) 拷贝 变量 值到控件显示。
//退出
range.ReleaseDispatch();
sheet.ReleaseDispatch();
sheets.ReleaseDispatch();
book.ReleaseDispatch();
books.ReleaseDispatch();
app.Quit();
app.ReleaseDispatch();
在ReadExcel.RC中建一个 List Control。改icon为Report形式。
在BOOL CDialogXLSDlg::OnInitDialog()中输入以下代码
// TODO: 在此添加额外的初始化代码
m_List.ModifyStyle(0L,LVS_SHOWSELALWAYS);
DWORD dwStyle = m_List.GetExtendedStyle();
dwStyle |= LVS_EX_FULLROWSELECT;//选中某行使整行高亮(只适用与report风格的listctrl)
dwStyle |= LVS_EX_GRIDLINES;//网格线(只适用与report风格的list control)
dwStyle |= LVS_EX_CHECKBOXES;//item前生成checkbox控件
m_List.SetExtendedStyle(dwStyle);
m_List.InsertColumn(0,_T("姓名"),LVCFMT_CENTER,100);
m_List.InsertColumn(1,_T("系"),LVCFMT_CENTER,50);
m_List.InsertColumn(2,_T("联系方式"),LVCFMT_CENTER,200);
6、此项目基本完成。