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();
                }
  • 相关阅读:
    window2003 安全配置
    VirusScan7.0使用说明
    管理者必读的四个小故事
    iis权限设置
    电信增值业务寻找合作伙伴
    ERP项目管理12要点
    抽闲破个案,放松一下(1)
    网站策划,网站建设的重中之重
    企业及时通讯软件源代码销售,功能类似QQ/UC/贸易通
    软件项目实施规范小结
  • 原文地址:https://www.cnblogs.com/yipeng-yu/p/5345666.html
Copyright © 2011-2022 走看看