原型软件的文件结构如下图所示:
SGSS.cpp的源代码如下:
// SGSS.cpp : 定义应用程序的类行为。
//
#include "stdafx.h"
#include "SGSS.h"
#include "SGSSDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CSGSSApp
BEGIN_MESSAGE_MAP(CSGSSApp, CWinApp)
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
// CSGSSApp 构造
CSGSSApp::CSGSSApp()
{
// TODO: 在此处添加构造代码,
// 将所有重要的初始化放置在 InitInstance 中
}
mceinline;">
// 唯一的一个 CSGSSApp 对象
CSGSSApp theApp;
// CSGSSApp 初始化
BOOL CSGSSApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControls()。否则,将无法创建窗口。
InitCommonControls();
CWinApp::InitInstance();
AfxEnableControlContainer();
// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
CSGSSDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用“确定”来关闭
//对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
//对话框的代码
}
// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}
SGSSDlg.cpp源代码如下:
// SGSSDlg.cpp : 实现文件 // #include "stdafx.h" #include "SGSS.h" #include "SGSSDlg.h" #include "./sgssdlg.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CSGSSDlg 对话框 CSGSSDlg::CSGSSDlg(CWnd* pParent /*=NULL*/) : CDialog(CSGSSDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CSGSSDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CSGSSDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDOK, OnBnClickedOk) ON_BN_CLICKED(IDC_BUTTON7, OnBnClickedButton7) ON_BN_CLICKED(IDC_BUTTON8, OnBnClickedButton8) ON_BN_CLICKED(IDC_BUTTON5, OnBnClickedButton5) ON_BN_CLICKED(IDC_BUTTON6, OnBnClickedButton6) ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1) END_MESSAGE_MAP() // CSGSSDlg 消息处理程序 BOOL CSGSSDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将/“关于.../”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 ShowWindow(SW_NORMAL); // TODO: 在此添加额外的初始化代码 return TRUE; // 除非设置了控件的焦点,否则返回 TRUE } void CSGSSDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CSGSSDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标显示。 HCURSOR CSGSSDlg::OnQueryDragIcon() { return static_cast<HCURSOR>(m_hIcon); } void CSGSSDlg::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 OnOK(); } void CSGSSDlg::OnBnClickedButton7() { // TODO: 在此添加控件通知处理程序代码 createTable("", ""); } void CSGSSDlg::createTable(CString sql, CString name) { CString filename, sExcelFile; CString sPath; CString workDir; if ( "" == name ) { CFileDialog fileDlg(FALSE, "xls", filename, OFN_FILEMUSTEXIST | OFN_HIDEREADONLY, "*.xls"); if (fileDlg.DoModal() == IDOK) { sExcelFile = fileDlg.GetPathName(); CFileFind finder; BOOL bWorking = finder.FindFile(sExcelFile); if (bWorking) { CFile::Remove(sExcelFile); } } else { return; } } else { sExcelFile = name; } CDatabase database; CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; CString sSql; TRY { sSql.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=/"%s/";DBQ=%s",sDriver, sExcelFile, sExcelFile); if (database.OpenEx(sSql, CDatabase::noOdbcDialog)) { //sSql = "CREATE TABLE 成绩(序号 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,理综 float,政治 float,文综 float,平均 float,总分 float)"; if (sql == "") { sSql = "CREATE TABLE 成绩(序号 int,组别 int,组层 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,政治 float,理综 float,文综 float)"; } else { sSql = sql; } //sSql = "CREATE TABLE 成绩(序号 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,理综 float,政治 float,文综 float,平均 float,总分 float)"; database.ExecuteSQL(sSql); } database.Close(); if ("" == name) { AfxMessageBox("表格创建成功。"); } } CATCH_ALL(e) { TRACE1("EXCEL驱动没有安装:%S",sDriver); } END_CATCH_ALL; return; } void CSGSSDlg::OnBnClickedButton8() { CDBVariant iID, iClassID, iGrade, iGroupID, iGroupLevelID, sName; CDBVariant fChinese, fMath, fEnglish, fHistory, fGeography, fPolicitics, fPhysics, fChymistry, fBiology, fArts, fScience; CDatabase database; CDatabase database2; CString sPath; GetModuleFileName(NULL, sPath.GetBufferSetLength(MAX_PATH), MAX_PATH); sPath.ReleaseBuffer(); int nPos = -1; nPos = sPath.ReverseFind('//'); sPath = sPath.Left(nPos); CString sSourceFile = sPath + "//data//source//chengji.xls"; CString sResultFile = sPath + "//data//source//sourcedata.xls"; CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; CString sDsn; sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver, sSourceFile); CString sDsn2; sDsn2.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;DBQ=%s",sDriver,sResultFile); TRY { database.Open(NULL, false, false, sDsn); database2.Open(NULL, false, false, sDsn2 ); CRecordset recordSet(&database); CString sSql = "SELECT * FROM 成绩 ORDER BY 班级 ASC, 序号 ASC"; recordSet.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly); while (!recordSet.IsEOF()) { recordSet.GetFieldValue("序号",iID); recordSet.GetFieldValue("姓名", sName); recordSet.GetFieldValue("班级", iClassID); recordSet.GetFieldValue("语文", fChinese); recordSet.GetFieldValue("代数", fMath); recordSet.GetFieldValue("外语", fEnglish); recordSet.GetFieldValue("物理", fPhysics); recordSet.GetFieldValue("化学", fChymistry); recordSet.GetFieldValue("生物", fBiology); recordSet.GetFieldValue("历史", fHistory); recordSet.GetFieldValue("地理", fGeography); recordSet.GetFieldValue("理综", fArts); recordSet.GetFieldValue("文综", fScience); CString destName; destName.Format("%s",sName.m_pstring->GetBuffer(sName.m_pstring->GetLength())); CString sInsertSql; sInsertSql.Format("INSERT INTO 成绩(序号,姓名,班级,语文,代数,外语,物理,化学,生物,历史,地理,政治,理综,文综) VALUES('%d','%s','%d','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f')", (int)iID.m_dblVal, destName,(int)iClassID.m_dblVal,(float)fChinese.m_dblVal,(float)fMath.m_dblVal, (float)fEnglish.m_dblVal,(float)fPhysics.m_dblVal,(float)fChymistry.m_dblVal,(float)fBiology.m_dblVal, (float)fHistory.m_dblVal,(float)fGeography.m_dblVal,(float)fArts.m_dblVal,(float)fScience.m_dblVal); database2.ExecuteSQL(sInsertSql); recordSet.MoveNext(); } database.Close(); database2.Close(); AfxMessageBox("导入数据成功。"); } CATCH_ALL(e) { TRACE0("数据库出错了。"); } END_CATCH_ALL; } void CSGSSDlg::OnBnClickedButton5() { // TODO: 在此添加控件通知处理程序代码 CWnd * TextCtrl = NULL; CString filename, sExcelFile; CString sPath; CFileDialog fileDlg(TRUE, NULL, NULL, NULL, NULL); if (fileDlg.DoModal() == IDOK) { sExcelFile = fileDlg.GetPathName(); TextCtrl = GetDlgItem(IDC_EDIT1); TextCtrl->SetWindowText(sExcelFile); } else { return; } } void CSGSSDlg::OnBnClickedButton6() { // TODO: 在此添加控件通知处理程序代码 CString fileName; CWnd * TextCtrl = NULL; int MaxLen = 255; TextCtrl = GetDlgItem(IDC_EDIT1); TextCtrl->GetWindowText(fileName.GetBuffer(MaxLen),MaxLen); ShellExecute(NULL,"open",fileName,NULL,NULL,SW_SHOWNORMAL); return; } void CSGSSDlg::OnBnClickedButton1() { statisticsEachClassCourse();// TODO: 在此添加控件通知处理程序代码 } //统计各班级学科成绩表 void CSGSSDlg::statisticsEachClassCourse() { int MaxLen = 255; CString workDir; CWnd * textCtrl; CString sourceData; CString destData; char resultFilePath[200]; GetModuleFileName(NULL,resultFilePath,200); workDir = resultFilePath; int pos = workDir.ReverseFind('//'); workDir = workDir.Left(pos); workDir = workDir +"//data//work//"; destData = workDir +"allClassTable.xls"; CString allClassTableString = "CREATE TABLE 年级学科成绩表(序号 int,组别 int,组层 int,姓名 char,班级 int, 语文 float,代数 float,外语 float,物理 float,化学 float,生物 float,历史 float,地理 float,政治 float,理综 float,文综 float, 总分 float, 平均 float, T平均 float, 班级名次 int, 年级名次 int)"; createTable(allClassTableString, destData); textCtrl = GetDlgItem(IDC_EDIT1); textCtrl->GetWindowText(sourceData.GetBuffer(MaxLen),MaxLen); staticSumAverageTAverage(sourceData, destData); /* staticGradeOrder(); staticClassOrder(); generateViewReport(); generatePrintReport(); */ } void CSGSSDlg::staticSumAverageTAverage(CString source, CString dest) { int courseCount = 5; CDBVariant iID, iClassID, iGrade, iGroupID, iGroupLevelID, sName; CDBVariant fChinese, fMath, fEnglish, fHistory, fGeography, fPolicitics, fPhysics, fChymistry, fBiology, fArts, fScience; CDatabase database; CDatabase database2; CString sSourceFile = source; CString sResultFile = dest; CString sDriver = "MICROSOFT EXCEL DRIVER (*.XLS)"; CString sDsn; sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver, sSourceFile); CString sDsn2; sDsn2.Format("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;DBQ=%s",sDriver,sResultFile); TRY { database.Open(NULL, false, false, sDsn); database2.Open(NULL, false, false, sDsn2 ); CRecordset recordSet(&database); CString sSql = "SELECT * FROM 成绩 ORDER BY 班级 ASC, 序号 ASC"; recordSet.Open(CRecordset::forwardOnly, sSql, CRecordset::readOnly); while (!recordSet.IsEOF()) { recordSet.GetFieldValue("序号",iID); recordSet.GetFieldValue("姓名", sName); recordSet.GetFieldValue("班级", iClassID); recordSet.GetFieldValue("语文", fChinese); recordSet.GetFieldValue("代数", fMath); recordSet.GetFieldValue("外语", fEnglish); recordSet.GetFieldValue("物理", fPhysics); recordSet.GetFieldValue("化学", fChymistry); recordSet.GetFieldValue("生物", fBiology); recordSet.GetFieldValue("历史", fHistory); recordSet.GetFieldValue("地理", fGeography); recordSet.GetFieldValue("理综", fArts); recordSet.GetFieldValue("文综", fScience); float fSum = fChinese.m_dblVal + fMath.m_dblVal + fEnglish.m_dblVal + fPhysics.m_dblVal + fPhysics.m_dblVal; float fAverage = fSum / courseCount; float fTAverage = 500; CString destName; destName.Format("%s",sName.m_pstring->GetBuffer(sName.m_pstring->GetLength())); CString sInsertSql; sInsertSql.Format("INSERT INTO 年级学科成绩表(序号,姓名,班级,语文,代数,外语,物理,化学,生物,历史,地理,政治,理综,文综,总分,平均,T平均) VALUES('%d','%s','%d','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f','%f')", (int)iID.m_dblVal, destName,(int)iClassID.m_dblVal,(float)fChinese.m_dblVal,(float)fMath.m_dblVal, (float)fEnglish.m_dblVal,(float)fPhysics.m_dblVal,(float)fChymistry.m_dblVal,(float)fBiology.m_dblVal, (float)fHistory.m_dblVal,(float)fGeography.m_dblVal,(float)fArts.m_dblVal,(float)fScience.m_dblVal,fSum,fAverage,fTAverage); database2.ExecuteSQL(sInsertSql); recordSet.MoveNext(); } database.Close(); database2.Close(); AfxMessageBox("导入数据成功。"); } CATCH_ALL(e) { TRACE0("数据库出错了。"); } END_CATCH_ALL; return; } stdafx.cpp源代码如下:
// stdafx.cpp : 只包括标准包含文件的源文件 // SGSS.pch 将是预编译头 // stdafx.obj 将包含预编译类型信息 #include "stdafx.h" resource.h源代码如下:
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by SGSS.rc
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_SGSS_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_EDIT1 1000
#define IDC_BUTTON1 1001
#define IDC_EDIT2 1002
#define IDC_BUTTON2 1003
#define IDC_EDIT3 1004
#define IDC_BUTTON3 1005
#define IDC_BUTTON4 1006
#define IDC_EDIT5 1007
#define IDC_EDIT6 1008
#define IDC_BUTTON5 1009
#define IDC_BUTTON6 1010
#define IDC_BUTTON7 1011
#define IDC_BUTTON8 1012
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1013
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif