zoukankan      html  css  js  c++  java
  • 使用NPOI和线程池快速加载EXCEL数据

      private void FilterData()
                {
                      List<Task> tasks = new List<Task>();
                      IWorkbook workbook = Cshap.Common.ExcelUnit.LoadWorkbook(excelfile_);
                      for (int sheetIndex = 0; sheetIndex < workbook.NumberOfSheets; sheetIndex++)
                      {
                            rowCount_ += workbook.GetSheetAt(sheetIndex).PhysicalNumberOfRows;
                      }
                      for (int sheetIndex = 0; 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 = 0; 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 = 0; i < row.Sheet.GetRow(0).Cells.Count; i++)//标题列单元格一定不为null
                      {
                            ICell c = row.GetCell(i);
                            rowEntity.Cells.Add(c);//无论是否为null,保证列数一致
                      }
    
                      if (row.Cells[0].CellType == CellType.String && row.Cells[0].StringCellValue != null
                            && row.Cells[0].StringCellValue.ToUpper() == "123456")
                      {
                            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[6];
    
                                  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();
                }
  • 相关阅读:
    Centos7 ftp服务器搭建
    搭建单机版spark
    JAVA JDBC大数据量导入Mysql
    springboot使用自带连接池连接postgre
    linux centos6安装postgresql
    SpringBoot中配置不序列化返回值为null的属性
    sublime 3 安装格式化JSON插件
    HIve分组查询返回每组的一条记录
    FastJson乱序问题
    深入理解迪杰斯特拉算法
  • 原文地址:https://www.cnblogs.com/yipeng-yu/p/5345666.html
Copyright © 2011-2022 走看看