private void FilterData()
{
List<Task> tasks = new List<Task>();
IWorkbook workbook = Cshap.Common.ExcelUnit.LoadWorkbook(excelfile_);
for (int sheetIndex = ; sheetIndex < workbook.NumberOfSheets; sheetIndex++)
{
rowCount_ += workbook.GetSheetAt(sheetIndex).PhysicalNumberOfRows;
}
for (int sheetIndex = ; sheetIndex < workbook.NumberOfSheets; sheetIndex++)
{
ISheet sheet = workbook.GetSheetAt(sheetIndex);
tasks.Add(Task.Factory.StartNew(FilterSheet, sheet));
}
Task.WaitAll(tasks.ToArray());
mre.WaitOne();
} void FilterSheet(object state)
{
ISheet sheet = state as ISheet;
for (int rowindex = ; rowindex < sheet.PhysicalNumberOfRows; rowindex++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(FilterRow), sheet.GetRow(rowindex));
}
} void FilterRow(object state)
{
IRow row = state as IRow; var rowEntity = new RowEntity
{
SheetName = row.Sheet.SheetName,
RowData = row, //取行的单元格数据时,不可通过RowData.Cells[#]获取,因为当cell为null,列数会不一致
IsBlank = false,
Cells=new List<ICell>()//必须通过这里获取单元格数据
}; for (int i = ; i < row.Sheet.GetRow().Cells.Count; i++)//标题列单元格一定不为null
{
ICell c = row.GetCell(i);
rowEntity.Cells.Add(c);//无论是否为null,保证列数一致
} if (row.Cells[].CellType == CellType.String && row.Cells[].StringCellValue != null
&& row.Cells[].StringCellValue.ToUpper() == "")
{
lock (lockObject)
{
string pattern = @"(\s*\d{1,2}/\d{1,2}/\d{4}\s*)-(\s*\d{1,2}/\d{1,2}/\d{4}\s*)"; ICell cellOfG = rowEntity.Cells[]; if (cellOfG!=null && (cellOfG.CellType != CellType.Blank && cellOfG.CellType != CellType.String
|| !string.IsNullOrEmpty(cellOfG.StringCellValue) && !Regex.IsMatch(cellOfG.StringCellValue, pattern)))
{
rowEntity.Message = "Date Format Exception";
InvalidRows.Add(rowEntity);
}
else
{
ValidRows.Add(rowEntity);
}
}
} Interlocked.Increment(ref increment_); if (increment_ == rowCount_)
mre.Set();
}

使用NPOI和线程池快速加载EXCEL数据的更多相关文章

  1. (BUG已修改,最优化)安卓ListView异步加载网络图片与缓存软引用图片,线程池,只加载当前屏之说明

    原文:http://blog.csdn.net/java_jh/article/details/20068915 迟点出更新的.这个还有BUG.因为软引应不给力了.2.3之后 前几天的原文有一个线程管 ...

  2. 使用jdk自带的线程池。加载10个线程。

    在开发中使用线程,经常不经意间就new Thread()一个出来,然后发现,这样做不是很好,特别是很多线程同时处理的时候,会出现CPU被用光导致机器假死,线程运行完成自动销毁后,又复活的情况. 所以在 ...

  3. Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载

     在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一 ...

  4. 使用Huggingface在矩池云快速加载预训练模型和数据集

    作为NLP领域的著名框架,Huggingface(HF)为社区提供了众多好用的预训练模型和数据集.本文介绍了如何在矩池云使用Huggingface快速加载预训练模型和数据集. 1.环境 HF支持Pyt ...

  5. 【Java线程池快速学习教程】

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  6. Anaconda快速加载opencv

    刚刚发现了两种Anaconda快速加载opencv的方法,亲测有效: 第一种: 直接在Navigator Environment 中搜opencv 如果搜不到,登陆Anaconda Cloud官网 h ...

  7. Java线程池快速学习教程

    1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变 ...

  8. 在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据

    在NVIDIA A100 GPU中使用DALI和新的硬件JPEG解码器快速加载数据 如今,最流行的拍照设备智能手机可以捕获高达4K UHD的图像(3840×2160图像),原始数据超过25 MB.即使 ...

  9. ASP.NET仿新浪微博下拉加载更多数据瀑布流效果

    闲来无事,琢磨着写点东西.貌似页面下拉加载数据,瀑布流的效果很火,各个网站都能见到各式各样的展示效果,原理大同小异.于是乎,决定自己写一写这个效果,希望能给比我还菜的菜鸟们一点参考价值. 在开始之前, ...

随机推荐

  1. 复习URLHttpConnection方式GET,POST方式链接网络解析uri

    xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:t ...

  2. 通过URLHttpConnection方式来取得图片,并且显示在ImageView上

    界面: 代码xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  3. RF-BM-S02(V1.0)蓝牙4.0模块 使用手册

    一.产品概述 图1 RF-BM-S02纯硬件模块 RF-BM-S02是一款采用美国德州仪器TI 蓝牙4.0 CC2540作为核心处理器的高性能.超低功耗(Bluetooth Low Energy)射频 ...

  4. 【原创】可以换行的RadioGroup

    0.效果截图: 以上两个RadioGroup均使用FNRadioGroup实现. 1.控件代码: public class FNRadioGroup extends ViewGroup { /** 没 ...

  5. Helloworld模块之内核makefile详解

    Hello World 模块以及对应的内核makefile详解 hello.c: #include <linux/module.h> //所有模块都需要的头文件 #include < ...

  6. hdu 5253 连接的管道

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5253 连接的管道 Description 老 Jack 有一片农田,以往几年都是靠天吃饭的.但是今年老 ...

  7. c中static作用

      1. static 变量 静态变量的类型 说明符是static. 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量. 例如外部变量虽属于静态 存储方式,但不一定是静态变量 ...

  8. iOS8 超简单的设置圆角按钮 ImageView等UIView

    button.layer.cornerRadius = // 这个值根据你想要的效果可以更改 button.clipsToBounds = true 这种方法不止可以设置按钮,UIView应该都可以设 ...

  9. How to Call a synchronize function asynchronizly in C#

    How to call a function asynchronizly in C# # Page1- Delegate.begininvoke, endinvoke BeginInvoke and ...

  10. MVC模式中路由如何生成URL

    路由有必要的参数吗 在MVC设计模式中,一个比较重要的步骤是浏览器发送的请求如何生成相应的URL,交给服务器去实例化相应的控制器类然后调用相应的控制器类的对应方法,返回视图给用户.这个流程细说起来比较 ...