APP下载

基于NPOI的题库管理的研究

2018-12-06毕红棋卢建飞

青年与社会 2018年31期

毕红棋 卢建飞

摘 要:在线测评是教学平台的重要功能,能够精准获取学习者的学习行为,能够帮助平台管理人员调整平台的知识结构、帮助学习者掌握自身的学习状况并调整学习方法。测试因子的质量是在线测试性能的重要指标,而题库是测试因子的直接体现形式,题库管理具有特殊意义。基于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 ZiDuan_Name=Functions.GetTableColumn(“RS_StaffMember”);

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- ),男,汉族,湖北赤壁人,豫章师范学院,硕士,讲师,主要从事软件开发、计算机教学和电子商务方面的研究工作;卢建飞,男,江西南昌人,硕士,讲师,主要从事高等教育管理和理论研究。