Как быстро читать большие объемы данных в файлах Excel с помощью C # - PullRequest
0 голосов
/ 05 ноября 2019

Я хотел бы получить некоторые рекомендации о том, как читать большие объемы данных, которые находятся в нескольких файлах Excel. Я был в состоянии написать программу, которая отвечает основным требованиям, но она работает очень медленно! Я уверен, что мой код неэффективен, поэтому некоторые отзывы о том, как сделать это быстрее, были бы очень полезны. Вот детали и цель программы, которую я должен написать.

  1. У меня есть 4 отдельных файла Excel, которые содержат где-то между 92-250 столбцами и 376-450 строками (каждый).
  2. Моя программа должна пройти через каждый файл в поисках CELL со значениями между C1-C50 (C1, C2, C3, C4 .... C49, C50 и т. Д.)
  3. Когда мойПрограмма находит ячейку, значение которой находится между C1-C50, и должна принимать значение ниже ячейки, в которой была найдена C1-C50. Другими словами, если я найду ячейку со значением C20, то ячейка ниже C20 - это то значение, которое мне нужно (мне нужно повторить этот процесс, сколько строк в файлах Excel)
  4. Я должен взять значение и добавить его к ключу «значение». Результат должен выглядеть примерно так, как показано ниже. JSON.

    {
        "_id" : ObjectId("145566"),
        "SimulatorId" : "4519656",
        "ThingNo" : "1265556",
        "CustomerID" : null,
        "ApplicationID" : "",
        "Interval" : 300,
        "Complete" : 111,
        "Remaining" : -1,
        "ProductType" : "SomeProduct",
        "SimulatedData" : [ 
            {
                "value" : 1819.00923045901,
                "units" : "hp",
                "tag" : "comp/totalIhp",
                "name" : "Compressor - Total IHP"
            }, 
            {
                "value" : 789.294125,
                "units" : "RPM",
                "tag" : "comp/averageSpeed",
                "name" : "Compressor - Speed"
            }, 
            {
                "value" : 2064.74658240481,
                "units" : "hp",
                "tag" : "comp/totalBhp",
                "name" : "Compressor - Total BHP"
            }, 
            {
                "value" : 98.7147413187277,
                "units" : "%",
                "tag" : "comp/percentCurrentLoad",
                "name" : "Compressor - Percent load"
            }, 
            {
                "value" : 12.18477402334,
                "units" : "MMSCFD",
                "tag" : "comp/totalCapacity",
                "name" : "Compressor - Total capacity"
            }, 
            {
                "value" : null,
                "tag" : "comp/bsfcCompressorBased",
                "name" : "Compressor - BSFC"
            }, 
    

Ниже приведен код, который я использовал. Но опять же, это очень медленно.

Program.cs

class Program
    {
        private static String[] file = new String[] {"prod_comp", "prod_he", "prod_ce", "prod_cyl" };
        public static void Main(String [] args)
        {
            for (int x = 0; x < file.Length; x ++)
            {
                string filepath = @"C:\Users\user\Test\SimRunnerData\" + file[x];
                Excel excel = new Excel(filepath, 1);

                excel.ReadSheet();
                //excel.SearchSheet();
            }
        }
    }

Excel.cs

class Excel
    {
        string path = "";
        _Application excel = new _Excel.Application();
        Workbook wb;
        Worksheet ws;

        public Excel(string path, int sheet)
        {
            this.path = path;
            wb = excel.Workbooks.Open(path);
            ws = wb.Worksheets[sheet];
        }

        public void ReadSheet()
        {
            Console.WriteLine("Reading file: " + path);

            for (int x = 1; x < 51; x++)
            {
                //Setting the channel we are looking for
                string channel = "C" + Convert.ToString(x);

                //Get column count for worksheet
                int colCount = ws.UsedRange.Columns.Count;

                //Begin loop through column length to find channel ID in row 1
                for(int j = 1; j < colCount; j++)
                {
                    string cellValue = ws.Cells[1, j].Value2;
                    if (cellValue == channel)
                    {
                        double? value = ws.Cells[2, j].Value2;
                        if(value is double)
                        {
                            Console.WriteLine(channel + ": " + value);
                        }
                        else
                        {
                            Console.WriteLine(channel + ": " + "null");
                        }
                        break;
                    }
                }
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...