基于NPOI的题库管理的研究
2018-12-06毕红棋卢建飞
毕红棋 卢建飞
摘 要:在线测评是教学平台的重要功能,能够精准获取学习者的学习行为,能够帮助平台管理人员调整平台的知识结构、帮助学习者掌握自身的学习状况并调整学习方法。测试因子的质量是在线测试性能的重要指标,而题库是测试因子的直接体现形式,题库管理具有特殊意义。基于NPOI的题库管理可以快速、高效、稳定将题库信息进行入库出库操作。
关键词:NPOI;题库管理;EXCEL
随着信息化的发展,信息管理的重要性日趋明显。数据的导入导出是题库管理的核心操作,多数考试平台的题库需要手工录入,效率低、质量差,因此稳定、高效的数据导入导出方法能提高考试平台的可操作性。NPOI是指构建在POI 3.x版本之上的一个程序,NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作。NPOI是一个开源的C#读写Excel、WORD等微软OLE2组件文档的项目。利用NPOI在平台中实现数据的导入导出具有商业价值。
一、数据导入导出的设计思路与方法
(一)常用的方法
操作Excel文件的常用方法有OleDb方式、Com组件方式、NPOI方式等。下面就各自情况进行简述。
1. OleDb方式
采用OleDb方式的本质是把Excel文件当成数据源,从而进行数据的读写操作。对Excel文件数据的读取过程的灵活性欠缺,对内存的使用率比较高,因此,当EXCEL文件的数据量较大时,会暴露内存空间不足导致内存溢出异常现象。
2. Com组件方式
Microsoft.Office.Interop.Excel.dll是Com组件,早期项目中使用频率较高。采用COM方式操作EXCEL文件时对数据的访问时基于单元格方式实现的,所以读写数据较慢,特别是当数据量较大时,访问效率问题更为突出。另一点是要求本机安装了Microsoft Office组件。
3. NPOI方式
采用NPOI操作EXCEL是目前比较好的方法,但目前网上较多是的2.2版的源码,对于程序设计不太熟悉的程序设计者,使用起来存在困难。NPOI在商业开发中较为重视,支持多种文件格式,例如xls、xlsx、doc、ppt、vsd等。
(二)基于NPOI的数据导入基本思路
结合NPOI组件将EXCEL中的數据导入到SQL Server 2008R2数据库中的思路分析:
(1)读取EXCEL文件内容并写入workbook中。
(2)通过循环,将每个表的数据单独存放在ISheet对象中。
(3)通过sheet.LastRowNum来获取行数,sheet.GetRow(j)来获取第j行数据;每一行的数据又存在IRow对象中。
(4)通过row.LastCellNum来获取列数,row.Cells[i]来获取第i列数据;并将数据写入数据库中。
(三)基于NPOI的数据导出基本思路
结合NPOI组件将SQL Server2008R2数据库中的数据导出并生成Excel文件的思路分析:
(1)呈现所有数据并分页,页面设计联合查询功能,根据需求选择需要导出的数据。
(2)运用三层架构从SQL Server2008R2数据库中读取相应表中数据到Data Set数据集合中。
(3)调用创建文件对象类。
(4)运用HSSFWorkbook创建工作薄对象。
(5)运用ISheet创建工作表对象。
(6)创建表格的行和单元格。
(7)将Data Set数据集合中的数据按要求填入工作表对应的单元格中。
(8)将工作表内容写入到文件对象中,生成Excel文件,并提供客户端下载。
三、系统实现的关键技术
将EXCEL中的数据导入到MSSQL 2008R2中难度系数不大,相比数据导出生成报表难度系数更大,因此本文就将题库中数据信息导出为EXCEL文件为例,阐述基于NPOI(2.3)的数据导出关键技术。
(一)创建EXCEL文件与工作表
创建的文件需要有存放的位置,通常可以判断是否存在相对路径,如果不存在该路径则自动创建路径。被创建的文件名需要考虑排重问题,通常采用DateTime.Now处理。
string ServerPath=AppDomain.CurrentDomain.BaseDirectory +“\\CreateExcel\\”;
if(!Directory.Exists(ServerPath)){ Directory.CreateDirectory(ServerPath);}
string FileName=DateTime.Now.ToString(“yyyyMMddHHmmssffff”)+“.xls”;
HSSFWorkbook wk=new HSSFWorkbook();
ISheet sheet=wk.CreateSheet(“工作表名称”);
(二)设置表头及单元格样式
1.设置表头第一行样式
ICellStyle Style_BiaoTi=wk.CreateCellStyle();
Style_BiaoTi.Alignment=NPOI.SS.UserModel.HorizontalAlignment.Center;
Style_BiaoTi.VerticalAlignment=NPOI.SS.UserModel.VerticalAlignment.Center;
IFont font=wk.CreateFont();
font.FontHeightInPoints=16;
font.Boldweight=(short)NPOI.SS.UserModel.FontBoldWeight.Bold;
font.FontName=“黑體”;
Style_BiaoTi.SetFont(font);
2.设置表头第二行样式
ICellStyle Style_ZiDuan=wk.CreateCellStyle();
Style_ZiDuan.Alignment=NPOI.SS.UserModel.HorizontalAlignment.Center;
Style_ZiDuan.VerticalAlignment=NPOI.SS.UserModel.VerticalAlignment.Center;
3.设置单元格样式
ICellStyle cellStyle=wk.CreateCellStyle();
cellStyle.Alignment=NPOI.SS.UserModel.HorizontalAlignment.Center;
cellStyle.VerticalAlignment=NPOI.SS.UserModel.VerticalAlignment.Center;
cellStyle.WrapText=true;
cellStyle.ShrinkToFit=true;
(三)表头设置及数据填充
1.获取数据集合
Bll.RS.StaffMember Shuju=new Bll.RS.StaffMember();
DataRow dr=Shuju.StaffMember_Show().Tables[0].Rows[0];
2.获取表的字段名称
Dal.Functions Functions=new Dal.Functions();
List
3.创建第一行,第一行合并居中,填充工作簿名称
IRow Row_BiaoTi=sheet.CreateRow(0);
ICell Cel_BiaoTi=Row_BiaoTi.CreateCell(0);
Cel_BiaoTi.SetCellValue(“信息列表”);
if(ZiDuan_Name.Count>0)
{
sheet.AddMergedRegion(new CellRangeAddress(0,0,0,ZiDuan_Name.Count-1));
}
Cel_BiaoTi.CellStyle=Style_BiaoTi;
4.第二行,将字段名称填充到相应单元格
IRow Row_ZiDuan=sheet.CreateRow(1);
for(int M=0;M < ZiDuan_Name.Count;M++)
{
ICell Cell_ZiDuan=Row_ZiDuan.CreateCell(M);
Cell_ZiDuan.SetCellValue(ZiDuan_Name[M].ToString());
Cell_ZiDuan.CellStyle=Style_ZiDuan;
sheet.AutoSizeColumn(M);
}
5.冻结表头
表头能直接呈现数据的名称,但当工作表的数据量较大时,单屏不能显示所有数据,查看更多数据需要下拉,同时,表头也会被移出视线,因此冻结表头十分必要。NPOI冻结表头需要用到CreateFreezePane函数。
sheet.CreateFreezePane(0,2,0,2);
(四)数据动态填充
工作表中填充数据需要避开表头,因此开启新行需要用到sheet.CreateRow(i+2),当然,如果表头是N,则需要用到sheet.CreateRow(i+N)。
for(int i=0;i < Shuju.StaffMember_Show().Tables[0].Rows.Count;i++)
{
IRow row=sheet.CreateRow(i+2);
row.HeightInPoints=30;
for(int j=0;j < Shuju.StaffMember_Show().Tables[0].Columns.Count;j++)
{
ICell cell=row.CreateCell(j);
if(Shuju.StaffMember_Show().Tables[0].Rows[i][j].ToString()==“” ||、Shuju.StaffMember_Show().Tables[0].Rows[i][j].ToString()==null)
{
}
else
{
cell.SetCellValue(Shuju.StaffMember_Show().Tables[0].Rows[i][ZiDuan_Name[j]].ToString());
}
cell.CellStyle=cellStyle;
}
}
(五)文件下载
采用文件流的方式,将读取的数据写入文件。
using(FileStream fs=File.OpenWrite(ServerPath + FileName))
{
wk.Write(fs);
}
用户将需要的数据下载到客户端,即导出数据时自动下载
MemoryStream ms=new MemoryStream();
wk.Write(ms);
Response.AddHeader(“Content-Disposition”,string.Format(“attachment;filename={0}.xls”,HttpUtility.UrlEncode(“工作表名称”),System.Text.Encoding.UTF8)));
Response.BinaryWrite(ms.ToArray());
Response.Flush();
Response.End();
(六)数据加密与解密
黑客活动频繁,平台数据安全成为平台运维第一要务。今年FaceBook两次信息泄漏,造成严重影响,题库管理中通常存放用户敏感信息,因此,加强数据的保护意识十分必要。目前,大部分平台数据未加密,部分采用常规的MD5等方法加密,导致部分加密信息可以被解密。因此提出基于DES3Encrypt、DES3Decrypt立法进行加密解密,提高了平台的安全性与可用性。
四、结语
2017年6月1日,网络安全法开始实施,在信息安全高度重视的背景,开发安全、高效、体验式平台具有时代意义。随着远程教育、网络教育、移动教育飞速发展的同时,网络教学平台的质量越来越受到关注,题库作为教学平台的一个核心功能,其管理的重要性不言而喻,基于NPOI的题库信息管理也具有特殊含义。
参考文献
[1] 连俊光.基于NPOI数据导出方法的研究与实现[J].电脑知识与技术,2017(28):8-9,11.
[2] 蔡小艳,卢莉娜,郑炎,等.基于NPOI組件生成Excel报表的设计与实现[J].电脑知识与技术,2016(01):64-65.
[3] 吴奇英,郭娜.信息安全环境下计算机软件的开发与应用[J].中国新技术新产品,2018(08):34-35.
基金项目:文章系江西省教改课题《基于大数据背景下的网络教学与自主学习平台的构建与应用》研究成果,项目编号:JXJG-16-43-5。
作者简介:毕红棋(1984- ),男,汉族,湖北赤壁人,豫章师范学院,硕士,讲师,主要从事软件开发、计算机教学和电子商务方面的研究工作;卢建飞,男,江西南昌人,硕士,讲师,主要从事高等教育管理和理论研究。