昨天一个教师朋友找到我,告诉我现在学期末他工作比较忙。需要统计处理很多学生信息,想让我帮他做一个管理系统。实现的功能就是把WPS表格转化成Word文档,将每一个学生的信息都能够分开,并且要根据名字找到对应的文档。(笔者注:原话如此)

  和他又扯了好久,分析整理了一下思路,推测他大概就是想这样:

学校发出的成绩表格统计是这样的:

-----------------------------程序运行后-------------------------------------》

每个文件的内容是:

  大概就是用统计好的成绩表来自动填写成绩单模板。(以上全是我的推测)

  有过类似想法的程序员朋友都知道,OFFICE文件的格式和文本文档不同,想要打开并进行操作的话,需要调用微软的API,并且根据版本不同还有不同的API。这样操作起来就相当的麻烦。这里呢,他又用的WPS这种我不太熟悉的软件,另外交代的需求也相当不清晰。这里我简单的写出一个程序的框架,等以后有时间再慢慢完善好了。

  首先表格的格式可能有很多种变换,设置一个固定的格式将来肯定需要修改很多次,这里,提供一个txt作为模板,通过模板程序对读取的数据进行分类。从表格数据到文本的转化可以直接通过WPS完成,表格数据项与项之间用连字符号‘-’连接。程序读取之后,将每行数据的前两项(一般来说应该是序号和姓名)作为文件名,每行数据作为文件内容保存在学生信息管理系统当前路径的Data文件夹内。

  新建一个MFC程序,选择对话框格式,并搭建界面如下:

程序将在初始化窗口的时候导入模板文件,我们在OnInitDialog中添加代码如下:

BOOL CSImangerDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range.
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);
}
} // Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here CString TempFolder = "Template";
if ( !PathIsDirectory( TempFolder ) ) //文件夹是否已经存在?
CreateDirectory( TempFolder,NULL ); SetList(); //初始化列表框。 return TRUE; // return TRUE unless you set the focus to a control
}

双击“编辑模板”按钮添加消息响应函数OnBtnEdit:

void CSImangerDlg::OnBtnEdit()
{
// TODO: Add your control notification handler code here
CString Path = GetModuleDir(); Path += "\\Template\\Template.txt";
CString cmd = "notepad.exe " + Path;
system( cmd ); ( (CListBox*)GetDlgItem( IDC_TEMPLATELIST ) )->ResetContent(); //列表框清空 SetList(); //设置列表框。
}

类成员函数GetModuleDir:

CString CSImangerDlg::GetModuleDir()                                //获取可执行文件路径
{
HMODULE module = GetModuleHandle();
char pFileName[MAX_PATH];
GetModuleFileName(module, pFileName, MAX_PATH); CString csFullPath(pFileName);
int nPos = csFullPath.ReverseFind( _T('\\') );
if( nPos < )
return CString("");
else
return csFullPath.Left( nPos );
}

类成员函数SetList:

void CSImangerDlg::SetList()                                    //打开文件并利用文件内容初始化列表框。
{
char* pszFileName= "Template\\Template.txt";
CStdioFile myFile;
CFileException fileException; myFile.Open( pszFileName,
CFile::typeText | CFile::modeRead | CFile::modeCreate | CFile::modeNoTruncate,&fileException);
myFile.SeekToBegin(); CString Temp;
while ( myFile.ReadString( Temp ) )
( (CListBox*)GetDlgItem( IDC_TEMPLATELIST ) )->AddString( Temp ); myFile.Close(); return ;
}

这样添加与编辑模板的功能就完成了。接下来我们需要读入学生信息文件,并将其分类保存。

添加一个类成员变量vector<CString> record;存放字段名。

双击“导入文件并分类”按钮添加消息响应函数OnBtnImport和其他的一些成员函数:

void CSImangerDlg::OnBtnImport()                            //导入数据文件
{
// TODO: Add your control notification handler code here
CFileDialog fileDlg( TRUE );
fileDlg.m_ofn.lpstrTitle = "导入你的数据文件(txt格式):";
fileDlg.m_ofn.lpstrFilter = "Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0"; if ( IDOK == fileDlg.DoModal() ){
CStdioFile myFile;
CFileException fileException; myFile.Open( fileDlg.GetFileName(),
CFile::typeText | CFile::modeRead | CFile::modeCreate | CFile::modeNoTruncate,&fileException);
myFile.SeekToBegin(); CString Temp,str;
vector<CString> data; GetList();
while ( myFile.ReadString( Temp ) ){ //读取文件内容并保存至data容器
str += (Temp + "\r\n"); //MFC编辑框中换行需用"\r\n"字串
data.push_back( Temp );
} myFile.Close();
SetDlgItemText( IDC_SHOWSI,str ); //显示导入文件内容. CString Folder = GetModuleDir() + "\\Data"; if ( !PathIsDirectory( Folder ) ) //文件夹是否已经存在?
CreateDirectory( Folder,NULL ); vector<CString>::iterator itr = data.begin();
for ( ; itr != data.end() ; ++itr ){
Temp = *itr;
CString FileName = Temp.Left( Temp.Find('-',Temp.Find('-')+) );
FileName += ".txt";
Temp = AddRecord( Temp );
Temp.Replace( "-","\r\n" ); CFile file( Folder + "\\" + FileName,CFile::modeCreate | CFile::modeWrite );
file.Write( Temp,Temp.GetLength() );
file.Close();
}
}
} void CSImangerDlg::GetList() //将CListBox的内容读入vector
{
CListBox *m_lstInfo = ( CListBox* )GetDlgItem( IDC_TEMPLATELIST );
int Count = m_lstInfo->GetCount();
CString Temp; record.clear();
for ( int i = ; i < Count ; ++i ){
m_lstInfo->GetText( i,Temp );
record.push_back( Temp );
} return ;
} CString &CSImangerDlg::AddRecord(CString &Temp)
{
vector<CString>::iterator itr = record.begin(); if ( itr != record.end() ){
Temp = (*itr++) + Temp; //在文件头插入第一个字段 int pos = ;
while ( itr != record.end() ){
pos = Temp.Find( '-',pos ) + ;
Temp.Insert( pos,*itr + ":" );
pos += itr->GetLength();
itr++;
}
} return Temp;
}

这样,一个简单的框架就搭建完毕了。

下载地址:http://pan.baidu.com/s/1pJRWM3h

学生信息管理系统v1.0的更多相关文章

  1. 面向对象案例 - 学生信息管理系统V1.0

    学生管理系统项目[所有知识点整合] 1. 学生管理系统项目 尝试完成以下功能 实体类: 学生类: id, 姓名,年龄,性别,成绩 需要使用数组保存学生信息 Student[] allStu 需要完成的 ...

  2. 面向对象案例-学生信息管理系统V1.1

    1.学生类 package com.qfedu.student.entity; /** * 学生类实体 * * @author GGGXXC * */ public class Student { p ...

  3. python 04 学生信息管理系统

    今天任务不多,做了学生信息管理系统1.0,使用字典存储学生个体信息,列表存储学生字典.注意dict定义要在循环体内,若定义成全局变量或循环体外,则旧数据会被新数据覆盖.dict属于可变类型数据,内容改 ...

  4. 面向对象案例-学生信息管理系统V0.6

    更新版本 面向对象案例 - 学生信息管理系统V1.0 项目要求: 实体类: 学生类: id, 姓名,年龄,性别,成绩 需要使用数组保存学生信息 Student[] allStu 需要完成的方法 1. ...

  5. 【Python3.6+Django2.0+Xadmin2.0系列教程之二】学生信息管理系统(入门篇)

    上一篇我们已经创建好了一个Xadmin的基础项目,现在我们将在此基础上构建一个同样很基础的学生信息管理系统. 一.创建模型 模型是表示我们的数据库表或集合类,并且其中所述类的每个属性是表或集合的字段, ...

  6. <每日一题>题目7:简单的学生管理系统V1.0

    ''' # 学生管理系统v1.0 # 添加学生的信息 # 删除学生的信息 # 修改学生的信息 # 查看学生的信息 #遍历学生的信息 #退出系统 ''' import json #1 显示操作功能 de ...

  7. 【Python3.6+Django2.0+Xadmin2.0系列教程之三(入门篇-下)】学生信息管理系统

    上一篇我们已经初步的构建起了一个学生管理系统的模型,现在接着来继续完善它吧. 1.上传图片/文件等资源 有时候需要添加一些附件,例如,新生刚入学,大家相互之间还不熟悉,希望能通过照片来加深印象,并且方 ...

  8. Python基础案例练习:制作学生信息管理系统

    一.前言 学生信息管理系统,相信大家或多或少都有做过 最近看很多学生作业都是制作一个学生信息管理系统 于是,今天带大家做一个简单的学生信息管理系统 二.开发环境: 我用到的开发环境 Python 3. ...

  9. 基于数据库MySQL的简易学生信息管理系统

    通过这几天学习Mysql数据库,对其也有了基本的了解,为了加深印象,于是就写了一个最简易的学生信息管理系统. 一:基本要求 1.通过已知用户名和密码进行登录: 2.可以显示菜单: 3.可以随时插入学生 ...

随机推荐

  1. 静态库 && 动态库

    http://weihe6666.iteye.com/blog/1100065 http://www.cnblogs.com/skynet/p/3372855.html 静态库: 在链接阶段,将汇编生 ...

  2. System.OutOfMemoryException: 内存不足。(转)

    主要是网站生成水印图片的时候遇到的 原文地址:http://www.cnblogs.com/longgel/archive/2010/03/24/1693776.html 今天调试asp.net 程序 ...

  3. Visual Studio 2012出现“无法访问T-SQL组件和安装了不兼容伯 DacFx版本”的解决办法

    参考:Visual Studio 2012出现“无法访问T-SQL组件和安装了不兼容伯 DacFx版本”的解决办法 Vs2012的下载地址: https://msdn.microsoft.com/en ...

  4. struts2视频学习笔记 11-12(动态方法调用,接收请求参数)

    课时11 动态方法调用 如果Action中存在多个方法时,可以使用!+方法名调用指定方法.(不推荐使用) public String execute(){ setMsg("execute&q ...

  5. BootStrap 最佳资源合集(转)

    witter BootStrap是一款优秀的前端的框架,称得上是前端的一个框架利器.Web前端开发者每天都在与HTML.CSS.JavaScript打交道,然 而不少人都是在周而复始的写模板.样式和交 ...

  6. c# xml的增删改查操作 xmlDocument 的用法

    1.将xml转换为DataTable string path = "";//xml的位置StringReader sr = null;XmlTextReader xmlReader ...

  7. 一些git命令

    git push --set-upstream origin release  强制将add的数据提交到  release分支.

  8. Axis2 webservice入门--写个简单的webservice

    上一篇介绍了webservice开发前的准备.下面开始写webservice.如果不了解axis2请看上一篇,如果是新手:建议一边看一边写代码,自己动手完成这个过程. 一.新建一个web项目 二.新建 ...

  9. loadrunner 如何做关联

    在页面中为了防止CRSF攻击,每次访问登录页面时,在浏览器器端生成一个token. 在提交时检验这个token是否有效,提交后token自动失效.   如果使用loadrunner来测试此系统话需要做 ...

  10. Windows内核对象

    1. 内核对象 Windows中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进行访问,应用程序不能在内存中定位这些数据结构并直接更改其内容.这个内存块是一个数据结构,其成员 ...