RWExcelDlg.cpp
上传用户:xiuanze55
上传日期:2013-06-16
资源大小:85k
文件大小:11k
源码类别:

其他数据库

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////////////
  2. //类名:CRWExcelDlg
  3. //功能:直接通过ODBC读、写Excel文件示例实现对话框
  4. //作者:徐景周(jingzhou_xu@163.net)
  5. //组织:未来工作室(Future Studio)
  6. //日期:2002.9.1
  7. /////////////////////////////////////////////////////////////////////////////
  8. #include "stdafx.h"
  9. #include "RWExcel.h"
  10. #include "RWExcelDlg.h"
  11. #ifdef _DEBUG
  12. #define new DEBUG_NEW
  13. #undef THIS_FILE
  14. static char THIS_FILE[] = __FILE__;
  15. #endif
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CAboutDlg dialog used for App About
  18. class CAboutDlg : public CDialog
  19. {
  20. public:
  21. CAboutDlg();
  22. // Dialog Data
  23. //{{AFX_DATA(CAboutDlg)
  24. enum { IDD = IDD_ABOUTBOX };
  25. CPictureEx m_Flag; //GIF动态图像显示
  26. CHyperLink m_Mail; //超链接形式显示EMAIL
  27. CWBButton m_OK; //位图按钮
  28. //}}AFX_DATA
  29. // ClassWizard generated virtual function overrides
  30. //{{AFX_VIRTUAL(CAboutDlg)
  31. protected:
  32. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  33. //}}AFX_VIRTUAL
  34. // Implementation
  35. protected:
  36. //{{AFX_MSG(CAboutDlg)
  37. virtual BOOL OnInitDialog();
  38. //}}AFX_MSG
  39. DECLARE_MESSAGE_MAP()
  40. };
  41. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  42. {
  43. //{{AFX_DATA_INIT(CAboutDlg)
  44. //}}AFX_DATA_INIT
  45. }
  46. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  47. {
  48. CDialog::DoDataExchange(pDX);
  49. //{{AFX_DATA_MAP(CAboutDlg)
  50. DDX_Control(pDX, IDC_FLAG, m_Flag);
  51. DDX_Control(pDX, IDC_STATIC_MAIL, m_Mail);
  52. DDX_Control(pDX, IDOK, m_OK);
  53. //}}AFX_DATA_MAP
  54. }
  55. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  56. //{{AFX_MSG_MAP(CAboutDlg)
  57. //}}AFX_MSG_MAP
  58. END_MESSAGE_MAP()
  59. //////////////////////////////////////////////////////////////////////////////
  60. //名称:OnInitDialog
  61. //功能:初始化"关于"对话框
  62. //作者:徐景周(jingzhou_xu@163.net)
  63. //组织:未来工作室(Future Studio)
  64. //日期:2001.12.1
  65. /////////////////////////////////////////////////////////////////////////////
  66. BOOL CAboutDlg::OnInitDialog() 
  67. {
  68. CDialog::OnInitDialog();
  69. //设置“关于”对话框的位图按钮显示
  70. m_OK.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
  71. //加入EMAIL的超连接
  72.     m_Mail.SetURL(_T("mailto:jingzhou_xu@163.net"));
  73. m_Mail.SetUnderline(FALSE);
  74. //显示动态GIF图像logo
  75. if(m_Flag.Load(MAKEINTRESOURCE(IDR_FLAG),_T("GIF")))
  76. {
  77. m_Flag.SetBkColor(RGB(160,180,220));
  78. m_Flag.Draw();
  79. }
  80. return TRUE;  // return TRUE unless you set the focus to a control
  81.               // EXCEPTION: OCX Property Pages should return FALSE
  82. }
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CRWExcelDlg dialog
  85. CRWExcelDlg::CRWExcelDlg(CWnd* pParent /*=NULL*/)
  86. : CDialog(CRWExcelDlg::IDD, pParent)
  87. {
  88. //{{AFX_DATA_INIT(CRWExcelDlg)
  89. //}}AFX_DATA_INIT
  90. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  91. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  92. }
  93. void CRWExcelDlg::DoDataExchange(CDataExchange* pDX)
  94. {
  95. CDialog::DoDataExchange(pDX);
  96. //{{AFX_DATA_MAP(CRWExcelDlg)
  97. DDX_Control(pDX, IDC_ABOUT, m_About);
  98. DDX_Control(pDX, IDC_LISTEXCEL, m_ExcelList);
  99. DDX_Control(pDX, IDOK, m_OK);
  100. DDX_Control(pDX, IDC_WRITEEXCEL, m_Write);
  101. DDX_Control(pDX, IDC_READEXCEL, m_Read);
  102. //}}AFX_DATA_MAP
  103. }
  104. BEGIN_MESSAGE_MAP(CRWExcelDlg, CDialog)
  105. //{{AFX_MSG_MAP(CRWExcelDlg)
  106. ON_WM_SYSCOMMAND()
  107. ON_WM_PAINT()
  108. ON_WM_QUERYDRAGICON()
  109. ON_BN_CLICKED(IDC_READEXCEL, OnReadexcel)
  110. ON_BN_CLICKED(IDC_WRITEEXCEL, OnWriteexcel)
  111. ON_BN_CLICKED(IDC_ABOUT, OnAbout)
  112. //}}AFX_MSG_MAP
  113. END_MESSAGE_MAP()
  114. /////////////////////////////////////////////////////////////////////////////
  115. // CRWExcelDlg message handlers
  116. //////////////////////////////////////////////////////////////////////////////
  117. //名称:OnInitDialog
  118. //功能:初始化对话框
  119. //作者:徐景周(jingzhou_xu@163.net)
  120. //组织:未来工作室(Future Studio)
  121. //日期:2002.9.1
  122. /////////////////////////////////////////////////////////////////////////////
  123. BOOL CRWExcelDlg::OnInitDialog()
  124. {
  125. CDialog::OnInitDialog();
  126. // Add "About..." menu item to system menu.
  127. // IDM_ABOUTBOX must be in the system command range.
  128. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  129. ASSERT(IDM_ABOUTBOX < 0xF000);
  130. CMenu* pSysMenu = GetSystemMenu(FALSE);
  131. if (pSysMenu != NULL)
  132. {
  133. CString strAboutMenu;
  134. strAboutMenu.LoadString(IDS_ABOUTBOX);
  135. if (!strAboutMenu.IsEmpty())
  136. {
  137. pSysMenu->AppendMenu(MF_SEPARATOR);
  138. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  139. }
  140. }
  141. // Set the icon for this dialog.  The framework does this automatically
  142. //  when the application's main window is not a dialog
  143. SetIcon(m_hIcon, TRUE); // Set big icon
  144. SetIcon(m_hIcon, FALSE); // Set small icon
  145. //初始置窗体位于最顶层
  146. SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
  147. //设置位图按钮显示
  148. m_OK.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
  149. m_About.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
  150. m_Write.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
  151. m_Read.LoadBitmaps(IDB_BUTTON,5, 5, 5, 5, 4 );
  152. return TRUE;  // return TRUE  unless you set the focus to a control
  153. }
  154. void CRWExcelDlg::OnSysCommand(UINT nID, LPARAM lParam)
  155. {
  156. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  157. {
  158. CAboutDlg dlgAbout;
  159. dlgAbout.DoModal();
  160. }
  161. else
  162. {
  163. CDialog::OnSysCommand(nID, lParam);
  164. }
  165. }
  166. // If you add a minimize button to your dialog, you will need the code below
  167. //  to draw the icon.  For MFC applications using the document/view model,
  168. //  this is automatically done for you by the framework.
  169. void CRWExcelDlg::OnPaint() 
  170. {
  171. if (IsIconic())
  172. {
  173. CPaintDC dc(this); // device context for painting
  174. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  175. // Center icon in client rectangle
  176. int cxIcon = GetSystemMetrics(SM_CXICON);
  177. int cyIcon = GetSystemMetrics(SM_CYICON);
  178. CRect rect;
  179. GetClientRect(&rect);
  180. int x = (rect.Width() - cxIcon + 1) / 2;
  181. int y = (rect.Height() - cyIcon + 1) / 2;
  182. // Draw the icon
  183. dc.DrawIcon(x, y, m_hIcon);
  184. }
  185. else
  186. {
  187. CDialog::OnPaint();
  188. }
  189. }
  190. // The system calls this to obtain the cursor to display while the user drags
  191. //  the minimized window.
  192. HCURSOR CRWExcelDlg::OnQueryDragIcon()
  193. {
  194. return (HCURSOR) m_hIcon;
  195. }
  196. //////////////////////////////////////////////////////////////////////////////
  197. //名称:OnReadexcel
  198. //功能:从Excel文件中读取相应数据并显示出来
  199. //作者:徐景周(jingzhou_xu@163.net)
  200. //组织:未来工作室(Future Studio)
  201. //日期:2002.9.1
  202. /////////////////////////////////////////////////////////////////////////////
  203. void CRWExcelDlg::OnReadexcel() 
  204. {
  205. CDatabase database;
  206.     CString sSql;
  207.     CString sItem1, sItem2;
  208.     CString sDriver;
  209.     CString sDsn;
  210.     CString sFile,sPath;
  211.                                     
  212. //获取主程序所在路径,存在sPath中
  213. GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
  214. sPath.ReleaseBuffer ();
  215.     int nPos;
  216. nPos=sPath.ReverseFind ('\');
  217. sPath=sPath.Left (nPos);
  218. sFile = sPath + "\Demo.xls";  // 将被读取的Excel文件名
  219.     // 检索是否安装有Excel驱动 "Microsoft Excel Driver (*.xls)" 
  220.     sDriver = GetExcelDriver();
  221.     if (sDriver.IsEmpty())
  222.     {
  223.         // 没有发现Excel驱动
  224.         AfxMessageBox("没有安装Excel驱动!");
  225.         return;
  226.     }
  227.     
  228.     // 创建进行存取的字符串
  229.     sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s", sDriver, sFile);
  230.     TRY
  231.     {
  232.         // 打开数据库(既Excel文件)
  233.         database.Open(NULL, false, false, sDsn);
  234.         
  235.         CRecordset recset(&database);
  236.         // 设置读取的查询语句.
  237.         sSql = "SELECT Name, Age "       
  238.                "FROM Exceldemo " ;                
  239.                "ORDER BY Name ";
  240.     
  241.         // 执行查询语句
  242.         recset.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly);
  243.         // 获取查询结果
  244.         while (!recset.IsEOF())
  245.         {
  246.             //读取Excel内部数值
  247.             recset.GetFieldValue("Name", sItem1);
  248.             recset.GetFieldValue("Age", sItem2);
  249. //显示记取的内容
  250. m_ExcelList.AddString( sItem1 + " --> "+sItem2 );
  251.             // 移到下一行
  252.             recset.MoveNext();
  253.         }
  254.         // 关闭数据库
  255.         database.Close();
  256.                              
  257.     }
  258.     CATCH(CDBException, e)
  259.     {
  260.         // 数据库操作产生异常时...
  261.         AfxMessageBox("数据库错误: " + e->m_strError);
  262.     }
  263.     END_CATCH;
  264. }
  265. //////////////////////////////////////////////////////////////////////////////
  266. //名称:GetExcelDriver
  267. //功能:获取ODBC中Excel驱动
  268. //作者:徐景周(jingzhou_xu@163.net)
  269. //组织:未来工作室(Future Studio)
  270. //日期:2002.9.1
  271. /////////////////////////////////////////////////////////////////////////////
  272. CString CRWExcelDlg::GetExcelDriver()
  273. {
  274.     char szBuf[2001];
  275.     WORD cbBufMax = 2000;
  276.     WORD cbBufOut;
  277.     char *pszBuf = szBuf;
  278.     CString sDriver;
  279.     // 获取已安装驱动的名称(涵数在odbcinst.h里)
  280.     if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut))
  281.         return "";
  282.     
  283.     // 检索已安装的驱动是否有Excel...
  284.     do
  285.     {
  286.         if (strstr(pszBuf, "Excel") != 0)
  287.         {
  288.             //发现 !
  289.             sDriver = CString(pszBuf);
  290.             break;
  291.         }
  292.         pszBuf = strchr(pszBuf, '') + 1;
  293.     }
  294.     while (pszBuf[1] != '');
  295.     return sDriver;
  296. }
  297. //////////////////////////////////////////////////////////////////////////////
  298. //名称:OnWriteexcel
  299. //功能:创建并写入数据到Excel文件中
  300. //作者:徐景周(jingzhou_xu@163.net)
  301. //组织:未来工作室(Future Studio)
  302. //日期:2002.9.1
  303. /////////////////////////////////////////////////////////////////////////////
  304. void CRWExcelDlg::OnWriteexcel() 
  305. {
  306.   CDatabase database;
  307.   CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; // Excel安装驱动
  308.   CString sExcelFile,sPath; 
  309.   CString sSql;
  310.     
  311.   //获取主程序所在路径,存在sPath中
  312.   GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);
  313.   sPath.ReleaseBuffer ();
  314.   int nPos;
  315.   nPos=sPath.ReverseFind ('\');
  316.   sPath=sPath.Left (nPos);
  317.   sExcelFile = sPath + "\Demo.xls";  // 要建立的Excel文件
  318.   TRY
  319.   {
  320.     // 创建进行存取的字符串
  321.     sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB="%s";DBQ=%s",sDriver, sExcelFile, sExcelFile);
  322.     // 创建数据库 (既Excel表格文件)
  323.     if( database.OpenEx(sSql,CDatabase::noOdbcDialog) )
  324.     {
  325.       // 创建表结构(姓名、年龄)
  326.       sSql = "CREATE TABLE Exceldemo (Name TEXT,Age NUMBER)";
  327.       database.ExecuteSQL(sSql);
  328.       // 插入数值
  329.       sSql = "INSERT INTO Exceldemo (Name,Age) VALUES ('徐景周',26)";
  330.       database.ExecuteSQL(sSql);
  331.       sSql = "INSERT INTO Exceldemo (Name,Age) VALUES ('徐志慧',22)";
  332.       database.ExecuteSQL(sSql);
  333.       sSql = "INSERT INTO Exceldemo (Name,Age) VALUES ('郭徽',27)";
  334.       database.ExecuteSQL(sSql);
  335.     }      
  336.     // 关闭数据库
  337.     database.Close();
  338. AfxMessageBox("Excel文件写入成功!");
  339.   }
  340.   CATCH_ALL(e)
  341.   {
  342.     TRACE1("Excel驱动没有安装: %s",sDriver);
  343.   }
  344.   END_CATCH_ALL;
  345. }
  346. //////////////////////////////////////////////////////////////////////////////
  347. //名称:OnAbout
  348. //功能:弹出"关于"对话框
  349. //作者:徐景周(jingzhou_xu@163.net)
  350. //组织:未来工作室(Future Studio)
  351. //日期:2002.9.1
  352. /////////////////////////////////////////////////////////////////////////////
  353. void CRWExcelDlg::OnAbout() 
  354. {
  355. CAboutDlg AboutDlg;
  356. AboutDlg.DoModal();
  357. }