有没有更好的方法来从Excel工作簿插入工作表到列表中?

我有一些代码用于从Excel工作簿中读取工作表,然后填充一个列表。

我得到一个范围,把它放入一个二维数组,然后用循环遍历并填充列表。

我的问题是,有没有更好的方法来达到同样的结果? 我的意思是,用更less的代码和更快。 我必须做4张,这需要260毫秒。

public static void LoadDdrDataIntoObjects(ref List<Receivables> recList, ref List<Dilution> dilList, ref List<Accountable> accList, ref List<Outstanding> outList, string sheet) { Workbook pantaReiWorkBook = PantaReiApplication.ActiveWorkbook; Sheets pantaReiWorkSheets = pantaReiWorkBook.Sheets; Worksheet pantaReiWorkSheet = pantaReiWorkSheets[sheet]; Range pantaReiLastCell = pantaReiWorkSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell); Range pantaReiRange = pantaReiWorkSheet.Range["A1:" + pantaReiLastCell.Address.Trim(new char['$']), Type.Missing]; object[,] pantaReidataRange = (object[,]) pantaReiRange.Value[Type.Missing]; for (var row = 2; row <= pantaReidataRange.GetLength(0); row++) { Receivables pantaReiReceivable = new Receivables { FileID = fileID.ID, SheetType = pantaReidataRange[row, 1].ToString(), SellerCompany = pantaReidataRange[row, 2].ToString(), Contract = pantaReidataRange[row, 3].ToString(), DebitID = pantaReidataRange[row, 4].ToString(), CompanyCode = pantaReidataRange[row, 5].ToString(), NoteNumber = pantaReidataRange[row, 6].ToString(), Installment = Convert.ToInt32(pantaReidataRange[row, 7]), InvoiceDate = (DateTime) pantaReidataRange[row, 8], DueDate1 = (DateTime) pantaReidataRange[row, 9], DueDate2 = (DateTime) pantaReidataRange[row, 10], DueDate3 = (DateTime) pantaReidataRange[row, 11], Currency = pantaReidataRange[row, 12].ToString(), Amount = (float) Convert.ToDouble(pantaReidataRange[row, 13]), Sign = pantaReidataRange[row, 14].ToString(), ProductType = pantaReidataRange[row, 15].ToString(), DilutionType = Convert.ToString(pantaReidataRange[row, 16]), MaturityStatus = Convert.ToInt32(pantaReidataRange[row, 17]), DebitStatus = pantaReidataRange[row, 18].ToString(), DealerFlag = pantaReidataRange[row, 19].ToString(), CustomerDescription = pantaReidataRange[row, 20].ToString(), AssetType = Convert.ToInt32(pantaReidataRange[row, 21]) }; recList.Add(pantaReiReceivable); } } 

最好的办法是分析你的代码。 JetBrains dotTrace是我经常使用的工具。

我的一个build议是,如果要处理大量的行,可以考虑先设置List<T>容量,甚至可以推迟将单个logging对象添加到List直到完成处理 – 在循环过程中将它们放入一个数组中。 您可以在inputfor循环之前声明数组; 你已经知道了数组的大小,基于for循环的迭代计数。 一旦你完成处理,你可以收集所有的数组,LINQ将它们转换成列表。

我自己pipe理。 我用reflection。