1

このコードを使用して、Excelブックからシートを読み取り、リストにデータを入力します。

範囲を取得し、それを2次元配列に入れてから、forサイクルを使用して、リストにデータを入力します。

私の質問は、同じ結果を達成するためのより良い方法はありますか?つまり、コードが少なくて高速です。これは4枚で行う必要があり、260msかかります。

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);
    }
}
4

2 に答える 2

0

最善の方法は、コードのプロファイルを作成することです。JetBrains dotTraceは、私がよく使用するツールです。

処理する行数が非常に多い場合は、容量を事前に設定するか、処理が完了するまでList<T>個々のレコードオブジェクトの追加を延期することを検討してください。Listループ中の配列。forループに入る前に配列を宣言できます。forループの反復回数に基づいて、配列のサイズはすでにわかっています。処理が完了したら、すべての配列を収集し、LINQでそれらをリストに変換できます。

于 2012-08-22T17:48:48.757 に答える
0

私は自分で管理しました。リフレクションを使用しました。

于 2012-09-02T09:10:42.417 に答える