在早期Bootstrap框架介绍中,我的随笔《结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程》中介绍了利用Bootstrap FieInput插件上传Excel文件到服务器,然后利用Bootstrap-table表格插件进行展示数据,最后导入到系统里面中,这个导入过程中可以预览到要导入的数据,而且可以选择性的导入。在实际使用过程中,发现使用Ajax导入大批量(几百条记录数据)的情况下,页面就会罢工,估计和提交的数据大小限制有关,为了解决这个问题,并结合导入数据一般都是全部导入的情况下,我们修改下数据导入的过程,从而实现大量数据量的Excel数据导入。

1、使用预览数据,并勾选导入的处理方式

Excel导入的的界面展示如下所示。

上传文件后,数据直接展示在弹出层的列表里面,这里直接使用了 Bootstrap-table表格插件进行展示。

这样我们就可以把Excel的记录展示出来,实现了预览的功能,勾选必要的记录,然后保存即可提交到服务器进行保存,实现了Excel数据的真正导入数据库处理。

实际的代码就比较多一点点,详细可以参考下随笔《结合bootstrap fileinput插件和Bootstrap-table表格插件,实现文件上传、预览、提交的导入Excel数据操作流程》,这里就主要简要介绍下导入的处理逻辑即可,由于是在客户端组装列表数据,然后通过ajax提交的,它的的代码如下所示。(这个也就是后面需要解决的问题)。

        //保存导入的数据function SaveImport() {var list = [];//构造集合对象var rows = $import.bootstrapTable('getSelections');for (var i = 0; i < rows.length; i++) {list.push({'Name': rows[i].Name, 'Mobile': rows[i].Mobile, 'Email': rows[i].Email, 'Homepage': rows[i].Homepage,'Hobby': rows[i].Hobby, 'Gender': rows[i].Gender, 'Age': rows[i].Age, 'BirthDate': rows[i].BirthDate,'Height': rows[i].Height, 'Note': rows[i].Note});}if (list.length == 0) {showToast("请选择一条记录", "warning");return;}var postData = { 'list': list };//可以增加其他参数,如{ 'list': list, 'Rucanghao': $("#Rucanghao").val() };postData = JSON.stringify(postData);$.ajax({url: '/TestUser/SaveExcelData',type: 'post',dataType: 'json',contentType: 'application/json;charset=utf-8',traditional: true,success: function (data) {if (data.Success) {//保存成功  1.关闭弹出层,2.清空记录显示 3.刷新主列表showToast("保存成功");$("#import").modal("hide");$(bodyTag).html("");Refresh();}else {showToast("保存失败:" + data.ErrorMessage, "error");}},data: postData});}

在实际使用过程中,发现数据几百条的时候,页面就罢工了,不能正常插入,搜索下解决问题说是大小受限的问题,但是我在Web.Config里面也设置了上传文件的大小,最终没有找到配置解决思路。

<httpRuntime executionTimeout="600" maxRequestLength="951200" useFullyQualifiedRedirectUrl="true" minFreeThreads="8" minLocalRequestFreeThreads="4" appRequestQueueLimit="100"  enableVersionHeader="true"/> 

最终这个配置项也无法解决,那么我们只能找其他方式来避免数据大量提交了。

2、使用在控制器后台读取Excel文件导入数据库

以上的数据导入方式,在一般数据比较少的时候,体验还是不错的,不过它的过程也是先上传Excel文件,然后读取Excel里面的记录,转换为对应的List<T>类型,在序列号JSON列表在前端界面展示。

既然我们文件在服务器上,并且也可以通过把Excel文件转换为对应的List<T>,那么我们减少用户勾选的步骤,确认后直接读取导入即可,这样处理应该就没有这样的受限于页面数据大小的问题的。

这样我们以设备信息导入为案例,介绍这个处理过程,如下前端代码是在文件上传到服务器后,用户确认后负责导入的逻辑的。

             //保存导入的数据function SaveImport() {var postData = { 'guid': importGuid };postData = JSON.stringify(postData);$.ajax({url: '/Device/SaveExcelByGuid',type: 'post',dataType: 'json',contentType: 'application/json;charset=utf-8',traditional: true,success: function (data) {if (data.Success) {Refresh();//保存成功  1.关闭弹出层,2.清空记录显示 3.刷新主列表showToast("保存成功");$("#import").modal("hide");$(bodyTag).html("");}else {showToast("保存失败:" + data.ErrorMessage, "error");}},data: postData});

最终我们是看到处理方式是在SaveExcelByGuid的控制器方法里面的,这个方法根据服务器的GUID,获取对应Excel文件的信息,然后进行读取和导入操作。

这个方法的详细代码如下所示。

        /// <summary>/// 在服务端保存Excel/// </summary>/// <param name="guid"></param>/// <returns></returns>public ActionResult SaveExcelByGuid(string guid){CommonResult result = new CommonResult();if(!string.IsNullOrEmpty(guid)){var list = GetDevice(guid);//根据guid获取对应的Excel文件,并把内容转换为对应的List<T>if (list != null){foreach (DeviceInfo detail in list){var isExist = BLLFactory<Device>.Instance.IsExistKey("DeviceId", detail.DeviceId);if (!isExist){BLLFactory<Device>.Instance.Insert(detail);}}//成功操作result.Success = true;}else{result.ErrorMessage = "导入信息不能为空";}}else{result.ErrorMessage = "导入信息不能为空";}return ToJsonContent(result);}

其中我们看到 GetDevice(guid) 就是获取Excel文件内容并转换为对应的实体类列表过程的。

其中的GetDevice就是转换为对应实体类集合的过程,代码如下所示。

        /// <summary>/// 获取设备导入文件,转换为对应的实体类集合/// </summary>/// <param name="guid">附件GUID</param>/// <returns></returns>private List<DeviceInfo> GetDevice(string guid){List<DeviceInfo> list = new List<DeviceInfo>();DataTable table = ConvertExcelFileToTable(guid);if (table != null){#region 数据转换foreach (DataRow dr in table.Rows){DeviceInfo info = new DeviceInfo();info.DeviceId = dr["设备ID"].ToString();info.VersionInfo = dr["版本信息"].ToString();info.MinitorInfo = dr["预留监控信息"].ToString();info.DeviceMsisdn = dr["公话手机号"].ToString();list.Add(info);}#endregion}return list;}

而 ConvertExcelFileToTable 就是利用aspose.Cell的Excel操作控件,实现数据转换的。

        /// <summary>/// 从附件列表中获取第一个Excel文件,并转换Excel数据为对应的DataTable返回/// </summary>/// <param name="guid">附件的Guid</param>/// <returns></returns>protected DataTable ConvertExcelFileToTable(string guid){DataTable dt = null;if (!string.IsNullOrEmpty(guid)){//获取上传附件的路径string serverRealPath = BLLFactory<FileUpload>.Instance.GetFirstFilePath(guid);if (!string.IsNullOrEmpty(serverRealPath)){//转换Excel文件到DatTable里面string error = "";dt = new DataTable();AsposeExcelTools.ExcelFileToDataTable(serverRealPath, out dt, out error);}}return dt;}

这样实现效果,不考虑用户勾选记录的情况,确认后直接对整个Excel文件进行判断导入操作,一般也是符合我们实际的导入过程的,这样处理起来,再也不会有前面介绍的那种情况了,至少我们能够顺利上传Excel文件,在后台读取Excel文件并转换是没有什么压力的,而且体验效果也很不错,非常快速。

最后看看大量数据导入后,也能够快速刷新,并能够在分页控件进行展示了。

转载于:https://www.cnblogs.com/wuhuacong/p/9566946.html

在Web界面中实现Excel数据大量导入的处理方式相关推荐

  1. ajax 导入大量excel,在Web界面中实现Excel数据大量导入的处理方式

    里就主要简要介绍下导入的处理逻辑即可,由于是在客户端组装列表数据,然后通过ajax提交的,它的的代码如下所示.(这个也就是后面需要解决的问题).//保存导入的数据 function SaveImpor ...

  2. C#winform中操作Excel数据,导入导出功能

    命名空间 using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; us ...

  3. java 导出订单明细_java中的excel数据的导入和导出

    /*** 导出供应商的数据*/@Overridepublic voidexport(OutputStream os, Supplier t1) {//查出符合条件的所供应/客户的列表 List sup ...

  4. 用地图说话 在商业分析与演示中运用Excel数据地图 全彩

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 用地图说 ...

  5. wps怎么导入access_mysql数据库中的表格数据如何导入wps中的excel,请问该怎么去做 | excel连接access数据库...

    怎么把excel文件里的数据导入SQL数据库? 导据不一定要用OPENSET函数以用更简单的方法,步骤如下: 1.双击打sqlserver,右击需要导入数据的数据库,如图所示. 2.点击任务,再点击任 ...

  6. 表格数据批量导入html,excel表格数据导入前端table-html中的表格数据怎样导入到ecxel表?...

    如何将excel中的数据自动导入web页面中? 如何将Excel中一个表格的数据导入到另一个表格 DataTable.ImportSheet(FileName,SheetSource,SheetDes ...

  7. excel导入mysql命令行_使用命令行将Excel数据表导入Mysql中的方法小结

    从Excel数据表导入MySQL,已经做过好几次了,但每次都会碰到各种问题:invalid utf8 character string, data too long, ...,浪费了不少时间 为了提高 ...

  8. Xenapp之web界面中文化及发布应用

    Xenapp之web界面中文化及发布应用 上篇我们的环境已经搭建好了,基本上可以开始发布应用了,不过我们之前看别人搞的xenapp的web界面可是有中文的,佛说要有光,好,有光了,佛说要有中文,好,有 ...

  9. Java EasyExcel在Web网站中读写Excel的方法及示例代码

    使用EasyExcel可以更容易简单在Web网站中读写Excel,本文主要介绍在Java Web网站中读写Excel方法及示例代码. 原文地址:Java EasyExcel在Web网站中读写Excel ...

最新文章

  1. js填充select下拉框并选择默认值
  2. bigswitch公司
  3. eclipse 和 myeclipse 字符编码设置
  4. 提醒一下技术人,你是不是陷入局部最优了
  5. LayUi引入JSON文件进行表格重载时出现接口请求异常
  6. C#10 和 .NET6 代码跨平台开发
  7. 关系代数基本运算_关系代数的基本和附加运算
  8. js有没有类似php的sleep函数,JavaScript-jQuery有没有类似sleep方法?
  9. android P监听SD卡热插拔执行symlink软链接的实现
  10. Mac系统功能快速切换状态栏小工具One Switch for Mac
  11. 创建oracle数据库job服务:PlSqlDev操作job
  12. 四级网络工程师试题一
  13. CSS世界Bug般的存在——字母x与“居中”
  14. Mapstruct使用介绍
  15. 国庆假期,人在囧途,感慨颇多
  16. Oracle 数据库修复,IBM DB2 数据库修复,MY SQL 数据库修复,SQL Server 数据 库修复,Sybase 数据库,Foxpro 数据库,Access 数据库,Informi
  17. Python | datetime与time模块
  18. BurpSuite 基本使用之暴力破解
  19. python函数测验题_python 函数练习题
  20. Vs2017 窗口移动vs直接卡死

热门文章

  1. 人力资源学python有意义吗-python爬虫抖音 个人资料 仅供学习参考 切勿用于商业...
  2. 开课吧python小课值得么-材料学硕博士建议掌握的高效论文工具
  3. python的安装教程-python安装教程
  4. 自学python的书籍-不可错过的十本Python好书
  5. 学python要下载什么-从应用的角度去学习Python--为孩子下载课本
  6. 怎么自学python语言-怎样学好python
  7. python自学多久可以找到工作-自学Python的高效方法,学Python多久能找到工作?
  8. python详细安装教程linux-Linux下python3.7.0安装教程
  9. 编程软件python中的if用法-适合Python初学者的一些编程技巧
  10. python画图程序有图-python-1 简单的turtle画图程序