近来遇到这样一个需求,客户要求平台提供一个导入excel文档的功能,文档中有多条记录,要对每条记录处理后放入数据库,首先分析:客户提供的excel内容不一定合法,要求提供校验功能,内容不合法的要求用户改正,正确的可以导入。

方案1:

使用SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0',
  'Data Source="c:/test.xls";User ID=Admin;Password=;Extended properties=Excel 5.0')...xactions 将excel导入到数据表,然后判断每个记录是否合法,合法的导入,不合法的放到临时表,最后将临时表的内容导出到excel文档,从效率上讲,这是个好方法,但实验发现,SELECT * FROM OpenDataSource只能对数据库所在的服务器上的excel进行操作,而我们的web和数据库是两台服务器,这样还需要将web和数据库服务器进行文件传输,涉及到权限安全问题,对我们来说安全第一,这个方案被否定。

方案2:

将excel上传,把内容直接读到DataSet,判断每条记录是否合法,合法的处理后删除,最后剩下的都是不合法数据,导出到excel文档,给用户下载,用户可以修改,然后再次提交,重复此过程,直至全部导入。实验后发现此方法存在效率问题,从DataSet 到excel,2000条记录,花费了3分钟(在我的台式机上,p4 1.7 512M),如果数据更大的话,时间太长,否定。曾考虑使用dts导出到excel,但还是老问题,导出的excel在数据库服务器上,还需要传输到web服务器,否定。

最后还是回到方案1,对操作流程作了改进,首先把excel上传,把内容直接读到DataSet,判断每条记录是否合法,如果不合法放到一个DataSet中,最后把记录错误记录的DataSet显示在页面datagrid上,告诉用户错误行号、错误原因,用户对本地excel进行修改,再次提交,直到全部记录都合法,才进行导入操作。这种方法效率不是大问题,也不存在安全性的问题。