ExcelAccessDlg.cpp
上传用户:jinq198
上传日期:2014-05-21
资源大小:111k
文件大小:14k
源码类别:

文件操作

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////////////
  2. //类名:CExcelAccessDlg
  3. //功能:对Excel文件进行新建、读写、内部数据行、列、单元格进行
  4. //      查询,插入,替换等操作,对已有文件进行手工添加的也可以
  5. //      正确读取等的示例实现
  6. //作者:徐景周(jingzhou_xu@163.net)
  7. //组织:未来工作室(Future Studio)
  8. //日期:2003.5.1
  9. /////////////////////////////////////////////////////////////////////////////
  10. #include "stdafx.h"
  11. #include "ExcelAccess.h"
  12. #include "ExcelAccessDlg.h"
  13. #include "CSpreadSheet.h"
  14. #ifdef _DEBUG
  15. #define new DEBUG_NEW
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. /////////////////////////////////////////////////////////////////////////////
  20. // CAboutDlg dialog used for App About
  21. class CAboutDlg : public CDialog
  22. {
  23. public:
  24. CAboutDlg();
  25. // Dialog Data
  26. //{{AFX_DATA(CAboutDlg)
  27. enum { IDD = IDD_ABOUTBOX };
  28. CXPButton m_OK;
  29. //}}AFX_DATA
  30. // ClassWizard generated virtual function overrides
  31. //{{AFX_VIRTUAL(CAboutDlg)
  32. protected:
  33. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  34. //}}AFX_VIRTUAL
  35. // Implementation
  36. protected:
  37. //{{AFX_MSG(CAboutDlg)
  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, IDOK, m_OK);
  51. //}}AFX_DATA_MAP
  52. }
  53. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  54. //{{AFX_MSG_MAP(CAboutDlg)
  55. // No message handlers
  56. //}}AFX_MSG_MAP
  57. END_MESSAGE_MAP()
  58. /////////////////////////////////////////////////////////////////////////////
  59. // CExcelAccessDlg dialog
  60. CExcelAccessDlg::CExcelAccessDlg(CWnd* pParent /*=NULL*/)
  61. : CDialog(CExcelAccessDlg::IDD, pParent)
  62. {
  63. //{{AFX_DATA_INIT(CExcelAccessDlg)
  64. m_strRow = _T("");
  65. m_strColumn = _T("");
  66. //}}AFX_DATA_INIT
  67. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  68. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  69. }
  70. void CExcelAccessDlg::DoDataExchange(CDataExchange* pDX)
  71. {
  72. CDialog::DoDataExchange(pDX);
  73. //{{AFX_DATA_MAP(CExcelAccessDlg)
  74. DDX_Control(pDX, IDC_EDIT_ROW, m_edRow);
  75. DDX_Control(pDX, IDC_EDIT_COLUMN, m_edColumn);
  76. DDX_Control(pDX, IDOK, m_OK);
  77. DDX_Control(pDX, IDCANCEL, m_Cancel);
  78. DDX_Control(pDX, ID_WRITEEXCEL, m_Write);
  79. DDX_Control(pDX, ID_QUERY, m_Query);
  80. DDX_Control(pDX, ID_ABOUT, m_About);
  81. DDX_Control(pDX, IDC_CHECK1, m_Check);
  82. DDX_Control(pDX, IDC_LISTACCESS, m_AccessList);
  83. DDX_Text(pDX, IDC_EDIT_ROW, m_strRow);
  84. DDX_Text(pDX, IDC_EDIT_COLUMN, m_strColumn);
  85. //}}AFX_DATA_MAP
  86. }
  87. BEGIN_MESSAGE_MAP(CExcelAccessDlg, CDialog)
  88. //{{AFX_MSG_MAP(CExcelAccessDlg)
  89. ON_WM_SYSCOMMAND()
  90. ON_WM_PAINT()
  91. ON_WM_QUERYDRAGICON()
  92. ON_BN_CLICKED(ID_WRITEEXCEL, OnWriteexcel)
  93. ON_BN_CLICKED(ID_QUERY, OnQuery)
  94. ON_BN_CLICKED(ID_ABOUT, OnAbout)
  95. ON_WM_CTLCOLOR()
  96. //}}AFX_MSG_MAP
  97. END_MESSAGE_MAP()
  98. /////////////////////////////////////////////////////////////////////////////
  99. // CExcelAccessDlg message handlers
  100. //////////////////////////////////////////////////////////////////////////////
  101. //名称:OnInitDialog
  102. //功能:初始化对话框
  103. //作者:徐景周(jingzhou_xu@163.net)
  104. //组织:未来工作室(Future Studio)
  105. //日期:2003.5.1
  106. /////////////////////////////////////////////////////////////////////////////
  107. BOOL CExcelAccessDlg::OnInitDialog()
  108. {
  109. CDialog::OnInitDialog();
  110. // Add "About..." menu item to system menu.
  111. // IDM_ABOUTBOX must be in the system command range.
  112. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  113. ASSERT(IDM_ABOUTBOX < 0xF000);
  114. CMenu* pSysMenu = GetSystemMenu(FALSE);
  115. if (pSysMenu != NULL)
  116. {
  117. CString strAboutMenu;
  118. strAboutMenu.LoadString(IDS_ABOUTBOX);
  119. if (!strAboutMenu.IsEmpty())
  120. {
  121. pSysMenu->AppendMenu(MF_SEPARATOR);
  122. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  123. }
  124. }
  125. // Set the icon for this dialog.  The framework does this automatically
  126. //  when the application's main window is not a dialog
  127. SetIcon(m_hIcon, TRUE); // Set big icon
  128. SetIcon(m_hIcon, FALSE); // Set small icon
  129. // 创建阴影工具提示,并与相应提示控件联系起来
  130. m_tooltip.Create(this);
  131. m_tooltip.AddTool(GetDlgItem(IDOK), _T("<b><ct=0x0000FF><al_c>读取</b><br><ct=0x00AA00><hr=100%></ct><br>Excel表格数据"),IDI_PINFORMATION);
  132. m_tooltip.AddTool(GetDlgItem(ID_WRITEEXCEL), _T("<b><ct=0x0000FF><al_c>写入</b><br><ct=0x00AA00><hr=100%></ct><br>新建并写入Excel表格数据"),IDI_PINFORMATION);
  133. m_tooltip.AddTool(GetDlgItem(ID_ABOUT), _T("关于"));
  134. m_tooltip.AddTool(GetDlgItem(IDCANCEL), _T("退出"));
  135. m_tooltip.AddTool(GetDlgItem(ID_QUERY), _T("<b><ct=0x0000FF><al_c>查询</b><br><ct=0x00AA00><hr=100%></ct><br>Excel表格中行、列、单元格数据"),IDI_PINFORMATION);
  136. m_tooltip.AddTool(GetDlgItem(IDC_LISTACCESS), _T("<b><ct=0x0000FF><al_c>显示</b><br><ct=0x00AA00><hr=100%></ct><br>Excel表格数据"),IDI_PINFORMATION);
  137. m_tooltip.AddTool(GetDlgItem(IDC_CHECK1), _T("<b><ct=0x0000FF><al_c>转换</b><br><ct=0x00AA00><hr=100%></ct><br>另存为其它文本格式文件"),IDI_PINFORMATION);
  138. m_tooltip.AddTool(GetDlgItem(IDC_EDIT_ROW), _T("<b><ct=0x0000FF><al_c>行号</b><br><ct=0x00AA00><hr=100%></ct><br>查询该行数据"),IDI_PINFORMATION);
  139. m_tooltip.AddTool(GetDlgItem(IDC_EDIT_COLUMN), _T("<b><ct=0x0000FF><al_c>列号</b><br><ct=0x00AA00><hr=100%></ct><br>查询该列数据"),IDI_PINFORMATION);
  140. // 显示图标或位图及字体属性
  141. m_tooltip.SetNotify();
  142. m_tooltip.SetDefaultFont();
  143. // 设置背景效果及渐变色
  144. // m_tooltip.SetColor(CPPToolTip::PPTOOLTIP_COLOR_BK_BEGIN, RGB(255, 255, 255));
  145. // m_tooltip.SetColor(CPPToolTip::PPTOOLTIP_COLOR_BK_MID,RGB(240, 247, 250));
  146. // m_tooltip.SetColor(CPPToolTip::PPTOOLTIP_COLOR_BK_END, RGB(192, 192, 200));
  147. // m_tooltip.SetEffectBk(14, 10);
  148. m_tooltip.SetColor(CPPToolTip::PPTOOLTIP_COLOR_BK_BEGIN, RGB(255, 255, 223));
  149. m_tooltip.SetColor(CPPToolTip::PPTOOLTIP_COLOR_BK_MID,RGB(192, 192, 172));
  150. m_tooltip.SetColor(CPPToolTip::PPTOOLTIP_COLOR_BK_END, RGB(128, 128, 112));
  151. m_tooltip.SetEffectBk(13, 10);
  152. // 多行显示提示信息
  153. m_tooltip.SetBehaviour(PPTOOLTIP_MULTIPLE_SHOW);
  154. // 程序初始启动时,窗体位于最前方
  155. SetWindowPos(&wndTopMost,0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
  156. return TRUE;  // return TRUE  unless you set the focus to a control
  157. }
  158. void CExcelAccessDlg::OnSysCommand(UINT nID, LPARAM lParam)
  159. {
  160. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  161. {
  162. CAboutDlg dlgAbout;
  163. dlgAbout.DoModal();
  164. }
  165. else
  166. {
  167. CDialog::OnSysCommand(nID, lParam);
  168. }
  169. }
  170. // If you add a minimize button to your dialog, you will need the code below
  171. //  to draw the icon.  For MFC applications using the document/view model,
  172. //  this is automatically done for you by the framework.
  173. void CExcelAccessDlg::OnPaint() 
  174. {
  175. if (IsIconic())
  176. {
  177. CPaintDC dc(this); // device context for painting
  178. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  179. // Center icon in client rectangle
  180. int cxIcon = GetSystemMetrics(SM_CXICON);
  181. int cyIcon = GetSystemMetrics(SM_CYICON);
  182. CRect rect;
  183. GetClientRect(&rect);
  184. int x = (rect.Width() - cxIcon + 1) / 2;
  185. int y = (rect.Height() - cyIcon + 1) / 2;
  186. // Draw the icon
  187. dc.DrawIcon(x, y, m_hIcon);
  188. }
  189. else
  190. {
  191. CDialog::OnPaint();
  192. }
  193. }
  194. // The system calls this to obtain the cursor to display while the user drags
  195. //  the minimized window.
  196. HCURSOR CExcelAccessDlg::OnQueryDragIcon()
  197. {
  198. return (HCURSOR) m_hIcon;
  199. }
  200. //////////////////////////////////////////////////////////////////////////////
  201. //名称:OnOK
  202. //功能:读取指定Excel文件内容
  203. //作者:徐景周(jingzhou_xu@163.net)
  204. //组织:未来工作室(Future Studio)
  205. //日期:2003.5.1
  206. ///////////////////////////////////////////////////////////////////////
  207. void CExcelAccessDlg::OnOK() 
  208. {
  209. CSpreadSheet SS("c:\Test.xls", "TestSheet");
  210. CStringArray Rows, Column;
  211. //清空列表框
  212. m_AccessList.ResetContent();
  213. for (int i = 1; i <= SS.GetTotalRows(); i++)
  214. {
  215. // 读取一行
  216. SS.ReadRow(Rows, i);
  217. CString strContents = "";
  218. for (int j = 1; j <= Rows.GetSize(); j++)
  219. {
  220. if(j == 1)
  221. strContents = Rows.GetAt(j-1);
  222. else
  223. strContents = strContents +  " --> " + Rows.GetAt(j-1);
  224. }
  225. m_AccessList.AddString(strContents);
  226. }
  227. }
  228. //////////////////////////////////////////////////////////////////////////////
  229. //名称:OnWriteexcel
  230. //功能:新建并写入Excel文件内容
  231. //作者:徐景周(jingzhou_xu@163.net)
  232. //组织:未来工作室(Future Studio)
  233. //日期:2003.5.1
  234. ///////////////////////////////////////////////////////////////////////
  235. void CExcelAccessDlg::OnWriteexcel() 
  236. {
  237. // 新建Excel文件名及路径,TestSheet为内部表名
  238. CSpreadSheet SS("c:\Test.xls", "TestSheet");
  239. CStringArray sampleArray, testRow;
  240. SS.BeginTransaction();
  241. // 加入标题
  242. sampleArray.RemoveAll();
  243. sampleArray.Add("姓名");
  244. sampleArray.Add("年龄");
  245. SS.AddHeaders(sampleArray);
  246. // 加入数据
  247. CString strName[] = {"徐景周","徐志慧","郭徽","牛英俊","朱小鹏"};
  248. CString strAge[]  = {"27","23","28","27","26"};
  249. for(int i = 0; i < sizeof(strName)/sizeof(CString); i++)
  250. {
  251. sampleArray.RemoveAll();
  252. sampleArray.Add(strName[i]);
  253. sampleArray.Add(strAge[i]);
  254. SS.AddRow(sampleArray);
  255. }
  256. // 初始化测试行数据,进行添加、插入及替换数据操作演示
  257. for (int k = 1; k <= 2; k++)
  258. {
  259. testRow.Add("Test");
  260. }
  261. SS.AddRow(testRow); // 添加到尾部
  262. SS.AddRow(testRow, 2); // 插入新行到第二行
  263. SS.AddRow(testRow, 6, true); // 替换原第四行来新的内容
  264. SS.Commit();
  265. if(m_Check.GetCheck())
  266. SS.Convert(";");            // 将原Excel文件转换为用分号分隔的文本,并另存为同名文本文件
  267. AfxMessageBox("文件写入成功!");
  268. }
  269. //////////////////////////////////////////////////////////////////////////////
  270. //名称:OnQuery
  271. //功能:查询指定Excel文件中行号、列号内容
  272. //作者:徐景周(jingzhou_xu@163.net)
  273. //组织:未来工作室(Future Studio)
  274. //日期:2003.5.1
  275. ///////////////////////////////////////////////////////////////////////
  276. void CExcelAccessDlg::OnQuery() 
  277. {
  278. CSpreadSheet SS("c:\Test.xls", "TestSheet");
  279. CStringArray Rows, Column;
  280. CString tempString = "";
  281. UpdateData();
  282. if(m_strRow == "" && m_strColumn == "")         // 查询为空
  283. {
  284. AfxMessageBox("行号、列号不能同时为空!");
  285. return;
  286. }    
  287. else if(m_strRow == "" && m_strColumn != "")    // 查询指定列数据
  288. {
  289. int iColumn = atoi(m_strColumn);
  290. int iCols = SS.GetTotalColumns();
  291. if(iColumn > iCols) // 超出表范围查询时
  292. {
  293. CString str;
  294. str.Format("表中总列数为: %d, ", iCols);
  295. AfxMessageBox(str + " 查询列数大于Excel表中总列数,请重新输入!");
  296. return;
  297. }
  298. // 读取一列数据,并按行读出
  299. if(!SS.ReadColumn(Column, iColumn))
  300. {
  301. AfxMessageBox(SS.GetLastError());
  302. return;
  303. }
  304. CString tmpStr;
  305. for (int i = 0; i < Column.GetSize(); i++)
  306. {
  307. tmpStr.Format("行号: %d, 列号: %d ,内容: %sn", i+1,iColumn,Column.GetAt(i));
  308. tempString += tmpStr;
  309. }
  310. AfxMessageBox(tempString);
  311. }
  312. else if(m_strRow != "" && m_strColumn == "")     // 查询指定行数数据
  313. {
  314. int iRow = atoi(m_strRow);
  315. int iRows = SS.GetTotalRows();
  316. if(iRow > iRows) // 超出表范围查询时
  317. {
  318. CString str;
  319. str.Format("表中总行数为: %d, ", iRows);
  320. AfxMessageBox(str + " 查询行数大于Excel表中总行数,请重新输入!");
  321. return;
  322. }
  323. // 读取指定行数据
  324. if(!SS.ReadRow(Rows, iRow))
  325. {
  326. AfxMessageBox(SS.GetLastError());
  327. return;
  328. }
  329. CString tmpStr;
  330. for (int i = 0; i < Rows.GetSize(); i++)
  331. {
  332. tmpStr.Format("行号: %d, 列号: %d ,内容: %sn", iRow, i+1, Rows.GetAt(i));
  333. tempString += tmpStr;
  334. }
  335. AfxMessageBox(tempString);
  336. }
  337. else if(m_strRow != "" && m_strColumn != "")     // 查询指定单元格数据
  338. {
  339. int iRow = atoi(m_strRow), iColumn = atoi(m_strColumn);
  340. int iRows = SS.GetTotalRows(), iCols = SS.GetTotalColumns(); 
  341. if(iColumn > iCols)                          // 超出表范围查询时
  342. {
  343. CString str;
  344. str.Format("表中总列数为: %d, ", iCols);
  345. AfxMessageBox(str + " 查询列数大于Excel表中总列数,请重新输入!");
  346. return;
  347. }
  348. else if(iRow > iRows)
  349. {
  350. CString str;
  351. str.Format("表中总行数为: %d, ", iRows);
  352. AfxMessageBox(str + " 查询行数大于Excel表中总行数,请重新输入!");
  353. return;
  354. }
  355. // 读取指定行、列单元格数据
  356. if(!SS.ReadCell(tempString, iColumn, iRow))
  357. {
  358. AfxMessageBox(SS.GetLastError());
  359. return;
  360. }
  361. CString str;
  362. str.Format("行号: %d, 列号: %d ,内容: %s", iRow,iColumn,tempString);
  363. AfxMessageBox(str);
  364. }
  365. }
  366. //////////////////////////////////////////////////////////////////////////////
  367. //名称:OnAbout
  368. //功能:关于对话框
  369. //作者:徐景周(jingzhou_xu@163.net)
  370. //组织:未来工作室(Future Studio)
  371. //日期:2003.5.1
  372. ///////////////////////////////////////////////////////////////////////
  373. void CExcelAccessDlg::OnAbout() 
  374. {
  375. CAboutDlg dlg;
  376. dlg.DoModal();
  377. }
  378. //////////////////////////////////////////////////////////////////////////////
  379. //名称:OnCtlColor
  380. //功能:设置各控件前景、背景色
  381. //作者:徐景周(jingzhou_xu@163.net)
  382. //组织:未来工作室(Future Studio)
  383. //日期:2003.5.1
  384. /////////////////////////////////////////////////////////////////////////////
  385. HBRUSH CExcelAccessDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
  386. {
  387. HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  388. if(nCtlColor==CTLCOLOR_LISTBOX)
  389. {
  390. //pDC->SetBkMode(TRANSPARENT);
  391. pDC->SetTextColor(RGB(0,0,0));
  392. pDC->SetBkColor(RGB(233,233,220));
  393. HBRUSH b=CreateSolidBrush(RGB(233,233,220));
  394. return b;
  395. }
  396. else if(nCtlColor==CTLCOLOR_SCROLLBAR)
  397. {
  398. }
  399. else if(nCtlColor==CTLCOLOR_EDIT)
  400. {
  401. }
  402. else if(nCtlColor==CTLCOLOR_STATIC)
  403. {
  404. }
  405. else if(nCtlColor==CTLCOLOR_DLG)
  406. {
  407. }
  408. return hbr;
  409. }
  410. //////////////////////////////////////////////////////////////////////////////
  411. //名称:PreTranslateMessage
  412. //功能:阴影工具提示的消息传递
  413. //作者:徐景周(jingzhou_xu@163.net)
  414. //组织:未来工作室(Future Studio)
  415. //日期:2003.5.1
  416. /////////////////////////////////////////////////////////////////////////////
  417. BOOL CExcelAccessDlg::PreTranslateMessage(MSG* pMsg) 
  418. {
  419. // 为阴影工具提示加入鼠标事件传递
  420. m_tooltip.RelayEvent(pMsg);
  421. return CDialog::PreTranslateMessage(pMsg);
  422. }