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

时间:2012-08-22 16:08:27

标签: list vsto excel

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

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

我的问题是,有没有更好的方法来实现相同的结果?我的意思是,代码更少,速度更快。 我必须这样做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);
    }
}

2 个答案:

答案 0 :(得分:0)

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

我的一个建议是,如果要处理的行数相当多,请考虑预先设置List<T>容量,或者甚至将单个记录对象的添加推迟到{{1直到你完成处理 - 在循环期间将它们放入一个数组中。您可以在输入for循环之前声明数组;你已经知道了数组的大小,基于for循环的迭代次数。完成处理后,您可以收集所有数组,LINQ可以根据需要将它们转换为列表。

答案 1 :(得分:0)

我自己管理。我用过反射。