关于EXCEL操作一些方法!

一: 利用BasicExcel类 com方式访问EXCEL

http://www.codeproject.com上搜,在其回复的消息内有一个MFC的示例,是已经修改过并处理过编码问题的。我测试一切正常!

二: 利用CSpreadSheet类  ODBC方式访问EXCEL

百度搜一下CSpreadSheet有示例!

 

建意用BasicExcel类使用很方便,大家都说好,特别是MFC的示例解决的编码问题得以解决(这个问题让我郁闷了几天!),现在好了!

感谢,只有这两字!!

以上两个类对于excel 2.1版本格式的文件不支持,已测试,不能读取也不能连接,需要用高版本的EXECL打开后保存一下,EXCEL就自动进行了转换。。。(这个问题,让我郁闷了三天。。。)最后给EXECL写了个外挂,模拟键盘操作进行了保存。。。汗!!

 

如果你看到此信息在笑我的笨方式的同时,请在下面回复一下,你的做法,以便与学习交流!

 

 

 

读取Excel文件,将文件内容存储在数组中。

 

首先利用Visual C++ 6.0,建立一个MFC基于对话框的工程项目,共享DLL,Win32平台。工程名称ExcelTest。在主对话框中加入一个按钮,
ID IDC_EXCELTEST
Caption Test Excel
双击该按钮,增加成员函数void CExcelTestDlg::OnExceltest()。
在BOOL CExcelTestApp::InitInstance()中,dlg.DoModal();之前增加代码:
if (CoInitialize(NULL)!=0)
{
AfxMessageBox("初始化COM支持库失败!");
exit(1);
}
在return FALSE; 语句前,加入:
CoUninitialize();
选择Menu->View->ClassWizade,打开ClassWizade窗口,选择Add Class->From a type library,选择C:/Program Files/Microsoft Office/office/Excel9.OLB(c:/Program Files/Microsoft Office/是本机上Microsoft Office 2000的安装目录,可根据个人机器上的实际安装目录修改)。选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,分别为_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,头文件Excel9.h,源文件Excel9.cpp。
在ExcelTestDlg.cpp文件的头部,#include "ExcelTestDlg.h"语句之下,增加 :

#i nclude "Excel9.h"
在void CExcelTestDlg::OnExceltest() 函数中增加如下代码:
void CExcelTestDlg::OnExceltest()
{

 CFileDialog  filedlg(TRUE,"*.xls",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Xls文件 (*.xls)|*.xls");  
 filedlg.m_ofn.lpstrTitle="打开文件";
 CString strFilePath;
 if (IDOK==filedlg.DoModal())
 {
  strFilePath=filedlg.GetPathName();
 } 
 else
 {
  return;
 }

///
 _Application excelapp;
 Workbooks books;
 _Workbook book;
 Worksheets sheets;
 _Worksheet sheet;
 
 Range range;
 Range usedRange;
 LPDISPATCH lpDisp;   
 COleVariant vResult;
 COleVariant
        covTrue((short)TRUE),
        covFalse((short)FALSE),
        covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
 
 
 if(!excelapp.CreateDispatch("Excel.Application"))
 {
  MessageBox("确认是否安装了Excel");
 }
 
 books.AttachDispatch(excelapp.GetWorkbooks());
 //打开Excel
 lpDisp = books.Open(strFilePath,     
  covOptional, covOptional, covOptional, covOptional, covOptional,
  covOptional, covOptional, covOptional, covOptional, covOptional,
  covOptional, covOptional );
 book.AttachDispatch(lpDisp);
 sheets.AttachDispatch(book.GetWorksheets());
 lpDisp = book.GetActiveSheet();
 sheet.AttachDispatch(lpDisp);
 
 //读取已经使用区域的信息,包括已经使用的行数、列数、起始行、起始列
 usedRange.AttachDispatch(sheet.GetUsedRange());
 range.AttachDispatch(usedRange.GetRows());
 //取得已经使用的行数
 long iRowNum = range.GetCount();         
 range.AttachDispatch(usedRange.GetColumns());
 //取得已经使用的列数
 long iColNum = range.GetCount();         
 //取得已使用区域的起始行,从1开始
 long iStartRow = usedRange.GetRow();
 //取得已使用区域的起始列,从1开始
 long iStartCol = usedRange.GetColumn();
 
 CString sarrays[100][100];//按行列号存储excel文件内容,可以根据需求自己定义动态数组
 for(int i=iStartRow;i<=iRowNum;i++)
 {
  for(int j=iStartCol;j<=iColNum;j++)
  {
   //读取单元格的值
   range.AttachDispatch(sheet.GetCells());
   range.AttachDispatch(range.GetItem (COleVariant((long)i),
    COleVariant((long)j)).pdispVal);
   vResult = range.GetValue();
   CString str,stry,strm,strd;
   SYSTEMTIME st;
   if(vResult.vt == VT_BSTR)     //若是字符串
   {
    str = vResult.bstrVal;
   }
   else if (vResult.vt == VT_R8) //8字节的数字
   {
    str.Format("%f",vResult.dblVal);
   }
   else if(vResult.vt == VT_DATE) //时间格式
   {
    VariantTimeToSystemTime(vResult.date, &st);
    stry.Format("%d",st.wYear);
    strm.Format("%d",st.wMonth);
    strd.Format("%d",st.wDay);
    str = stry+"-"+strm+"-"+strd;
   }
   else if(vResult.vt == VT_EMPTY) //单元为空
   {
    str="";
   }
   sarrays[i-1][j-1] = str;
   
  }
 }

 range.ReleaseDispatch();
 sheet.ReleaseDispatch();
 sheets.ReleaseDispatch();
 book.ReleaseDispatch();
 books.ReleaseDispatch();
 excelapp.ReleaseDispatch();
 book.Close(covOptional,COleVariant(strFilePath),covOptional);
 books.Close();     
 excelapp.Quit();

}

    到此, sarrays[][]数组将整个Excel文件内容保存下来,可以将数组声明放在.h文件中。用户可以随时将文件内容放入数据库或其他文件中.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值