昨天一个教师朋友找到我,告诉我现在学期末他工作比较忙。需要统计处理很多学生信息,想让我帮他做一个管理系统。实现的功能就是把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

最新文章

  1. centos apache svn配置
  2. 为mongodb加用户授权并使用RockMongo进行管理
  3. JQuery图片延迟加载插件,动态获取图片长宽尺寸
  4. nexus私服安装
  5. Asp.Net Web API 2(入门)第一课
  6. debian 安装libreoffice6.1 转换pdf
  7. tensorboard使用过程错误记录
  8. django之class Meta
  9. 虚拟机linux centoros系统安装
  10. OJ链接
  11. 蓝桥杯 算法训练 ALGO-116 最大的算式
  12. 让linux history命令显示命令的运行时间、在哪个机器运行的这个命令
  13. Vue.js核心概念
  14. 51nod 1486 大大走格子——dp
  15. 关于urlDecode和tomcat一些源码
  16. c#缓存介绍
  17. inventor安装失败怎样卸载安装inventor 2017?
  18. 《python编程从入门到实践》第七章笔记
  19. Eclipse调试:项目在Debug模式下,无法启动的问题
  20. Java 面试参考指南 — 同步

热门文章

  1. hdu-----(1179)Ollivanders: Makers of Fine Wands since 382 BC.(二分匹配)
  2. Spring Web Flow 简介
  3. enum使用总结
  4. JavaScript实现冒泡排序、快速排序、插入排序
  5. linq.js
  6. BZOJ3999 [TJOI2015]旅游
  7. OL/SQL编程练习
  8. myeclipse中导入的jquery文件报错(出现红叉叉,提示语法错误)
  9. Java中Scanner的用法
  10. asp.net后台编写 loading效果