Member 10398113 Ответов: 2

Самый быстрый способ чтения данных excel на языке C#


У меня есть 4 столбца и 3000 строк в моем листе Excel. Мне нужно прочитать такие данные, как Row1col1, Row1Col2, Row1Col3 и Row1Col4. После прочтения имени из Row1Col1 мне нужно получить его идентификатор из таблицы oracle. Аналогичным образом прочтите Row1Col2 и получите его идентификатор из таблицы oracle и так далее до Row1Col4. После получения всех идентификаторов всех столбцов первой строки мне нужно проверить одну из таблиц оракула, существует ли это совпадение или нет. Если это совпадение существует, оставьте его, иначе вставьте эту запись. Для этого в настоящее время я использую Microsoft.Office.Interop.Excel для чтения строки за строкой данных Excel. В настоящее время чтение 3508 слишком длинных записей занимает около 20 минут. Мне интересно, является ли это лучшим способом сделать это или есть лучшие / более эффективные способы (или просто более интеллектуальные способы - возможно, Linq / собственные поставщики .Net) вместо этого?
Любая помощь будет очень ценится.

Что я уже пробовал:

[HttpPost]
public ActionResult ReadExcel(HttpPostedFileBase excelFile)
{
    TempData["SuccessMsg"] = "";
    int count = 0;
    int rowCount = 0;
    bool writesFilename = false;
    if (excelFile == null || excelFile.ContentLength == 0)
    {
        TempData["ErrorMsg"] = "Please select File";
        return View("UploadData");
    }
    else
    {

        if (excelFile.FileName.EndsWith("xls") || excelFile.FileName.EndsWith("xlsx"))
        {
            string fileName = excelFile.FileName;
            string extension = Path.GetExtension(Request.Files["excelFile"].FileName);
            string path = Server.MapPath("~/Content/" + excelFile.FileName);
            if (System.IO.File.Exists(path))
            {
                System.IO.File.Delete(path);
            }
            excelFile.SaveAs(path);

            var desktopFolder = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
            var fullFileName = Path.Combine(desktopFolder, fileName + ".txt");
            if (System.IO.File.Exists(fullFileName))
            {
                System.IO.File.Delete(fullFileName);
            }

            MyExcel.Application xlApp;
            MyExcel.Workbook xlWorkBook;
            MyExcel.Worksheet xlWorkSheet;
            MyExcel.Range range;

            string ExcelAgencyName, ExcelAgencyGroupName, ExcelSource, ExcelFunctionalArea;
            decimal AgencyKey;
            int rCnt = 0;
            int cCnt = 0;

            xlApp = new MyExcel.Application();
            xlWorkBook = xlApp.Workbooks.Open(path, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            xlWorkSheet = (MyExcel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            range = xlWorkSheet.UsedRange;

            rowCount = range.Rows.Count - 1;

            //Parallel.ForEach(xlWorkSheet.Rows.Cast<MyExcel.Range>(), currentRow =>
            //{
                for (rCnt = 2; rCnt <= range.Rows.Count; rCnt++)
                {
                    for (cCnt = 1; cCnt <= range.Columns.Count; cCnt += 5)
                    {
                        decimal dbAgencyGroupKey = 0;
                        decimal dbSourceKey;
                        decimal dbFunctionalKey;


                        BarcDataContext bc = new BarcDataContext();
                        ExcelAgencyName = (range.Cells[rCnt, cCnt] as MyExcel.Range).Text.ToString();
                        ExcelAgencyGroupName = (range.Cells[rCnt, cCnt + 1] as MyExcel.Range).Text.ToString();
                        ExcelSource = (range.Cells[rCnt, cCnt + 2] as MyExcel.Range).Text.ToString();
                        ExcelFunctionalArea = (range.Cells[rCnt, cCnt + 3] as MyExcel.Range).Text.ToString();

                        dbSourceKey = bc.REF_SRC_SUB_AREA.Where(m => m.SRC_SUB_AREA == ExcelSource.Trim()).FirstOrDefault().SRC_SUB_KEY;
                        dbFunctionalKey = bc.REF_SRC_FUNC_AREA.Where(m => m.SRC_FUNC_AREA == ExcelFunctionalArea.Trim()).FirstOrDefault().SRC_FUNC_KEY;


                        DIM_AGENCY objAgencyKey = bc.DIM_AGENCY.Where(m => m.AGENCY_NAME.ToUpper() == ExcelAgencyName.ToUpper() && m.SRC_SUB_KEY == dbSourceKey).FirstOrDefault();

                        if (objAgencyKey != null && dbFunctionalKey != 0)
                        {
                            AgencyKey = objAgencyKey.AGENCY_KEY;
                        }
                        else
                        {
                            StreamWriter sw = null;
                            sw = new StreamWriter(fullFileName, true);
                            sw.WriteLine(ExcelAgencyName);
                            sw.Close();
                            writesFilename = true;
                            break;
                        }

                        DIM_AGENCY_GROUP objAgencyGroup = bc.DIM_AGENCY_GROUP.Where(m => m.AGENCY_GROUP_NAME.ToUpper() == ExcelAgencyGroupName.ToUpper() && m.SRC_FUNC_KEY == dbFunctionalKey).FirstOrDefault();

                        if (objAgencyGroup != null)
                        {
                            dbAgencyGroupKey = objAgencyGroup.AGENCY_GROUP_KEY;
                        }

                        if (dbAgencyGroupKey == 0)
                        {
                            decimal agencyGrpKey = AgencyGroupRepository.InsertAgencyGroup(ExcelAgencyGroupName, dbFunctionalKey);
                            if (agencyGrpKey != 0)
                            {
                                XREF_AGENCY_TAGGING objXrefTagging = bc.XREF_AGENCY_TAGGING.Where(m => m.AGENCY_KEY == AgencyKey && m.SRC_FUNC_KEY == dbFunctionalKey).FirstOrDefault();
                                if (objXrefTagging != null)
                                {
                                    if (objXrefTagging.AGENCY_GROUP_KEY == agencyGrpKey)
                                    {

                                    }
                                    else
                                    {
                                        decimal agencyTaggingSrNo = AgencyGroupRepository.UpdateTaggingAgencyAgencyGroup(AgencyKey, agencyGrpKey, dbFunctionalKey);
                                        count = count + 1;
                                    }
                                }
                                else
                                {
                                    decimal agencyTaggingSrNo = AgencyGroupRepository.TagAgencyAgencyGroup(AgencyKey, agencyGrpKey, dbFunctionalKey);
                                    count = count + 1;
                                }

                            }
                        }
                        else
                        {

                            XREF_AGENCY_TAGGING objXrefTagging = bc.XREF_AGENCY_TAGGING.Where(m => m.AGENCY_KEY == AgencyKey && m.SRC_FUNC_KEY == dbFunctionalKey).FirstOrDefault();
                            if (objXrefTagging != null)
                            {
                                if (objXrefTagging.AGENCY_GROUP_KEY == dbAgencyGroupKey)
                                {

                                }
                                else
                                {
                                    decimal agencyTaggingSrNo = AgencyGroupRepository.UpdateTaggingAgencyAgencyGroup(AgencyKey, dbAgencyGroupKey, dbFunctionalKey);
                                    count = count + 1;
                                }


                            }
                            else
                            {
                                decimal agencyTaggingSrNo = AgencyGroupRepository.TagAgencyAgencyGroup(AgencyKey, dbAgencyGroupKey, dbFunctionalKey);
                                count = count + 1;
                            }

                        }
                    }
                }
            //});
        }
        else
        {
            TempData["ErrorMsg"] = "Invalid file type. Upload only xlx or xlsx file type.";
            return View("UploadData");
        }

    }

    int totalCount = rowCount - count;

    if (writesFilename == true && count > 0)
    {
        TempData["SuccessMsg"] = "Out of" + " " + rowCount + " " + "," + " " + totalCount + " " + "Agency names not found in database. Please view the text file saved on your desktop to get the agency names.";
    }
    else if (count == 0 && writesFilename == true)
    {
        TempData["ErrorMsg"] = "None of the agency names found in database. Please view the text file saved on your desktop to get the agency names.";
    }
    else if (count > 0 && writesFilename == false)
    {
        TempData["ErrorMsg"] = "Out of" + " " + rowCount + " " + "," + " " + totalCount + " " + "Agency group keys got updated.";
    }
    return View("UploadData");
}

Kornfeld Eliyahu Peter

Используйте драйвер OLE DB для Excel и обрабатывайте свои рабочие листы как таблицы...

Laysence

Вы также можете используйте библиотеку excel для C# который имеет гораздо лучшие показатели тогда использование Excel interop в C#, вы можете найти лист сравнения здесь.

2 Ответов

Рейтинг:
2

Patrice T

Это не просто чтение файла Excel, вы также получаете доступ к базе данных и делаете что-то еще.

Первое, что нужно сделать, это запустить профилировщик, чтобы увидеть, сколько времени требуется для каждой части программы. Та часть,которая занимает больше всего времени, вероятно, где вы можете получить больше всего.
Деление на 2 времени, которое требуется для части, которая занимает только 10% от целого, сэкономит только 5%.
Экономия 2/3 части, которая занимает 75%, - это экономия 50% целого.

Вы должны знать, какая операция занимает время, прежде чем тикать ваш код.

Профилирование (компьютерное программирование) - Википедия, свободная энциклопедия[^]


Рейтинг:
0

raju melveetilpurayil

Для чтения данных excel


string con =
  @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp\test.xls;" + 
  @"Extended Properties='Excel 8.0;HDR=Yes;'";    
using(OleDbConnection connection = new OleDbConnection(con))
{
    connection.Open();
    OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection); 
    using(OleDbDataReader dr = command.ExecuteReader())
    {
         while(dr.Read())
         {
             var row1Col0 = dr[0];
             Console.WriteLine(row1Col0);
         }
    }
}


Источник
.net-как читать данные из файла excel с помощью c# - Stack Overflow[^]


Member 10398113

Но таким образом он может читать данные по столбцам и я хочу читать данные как первая строка все столбцы затем 2 я строка и ее все столбцы один за другим

raju melveetilpurayil

взгляните на это пожалуйста http://stackoverflow.com/questions/17577184/importing-excel-into-a-datatable-quickly

Member 10398113

Спасибо за ваш ответ, Раджу, сэр. Здесь моя единственная задача состоит не только в том, чтобы прочитать данные excel и поместить их в таблицу данных или набор данных, но и после чтения значений столбцов я должен получить доступ к базе данных oracle и сделать что-то еще. Если вы прочтете мой вопрос и пройдете через мой код, вы поймете, в чем именно заключается мое требование. Не могли бы вы дать мне эффективный код для того же самого, который удовлетворяет моему требованию. Заранее спасибо, сэр.