Оптимизация производительности приложения для чтения / записи в Excel с библиотеками NPOI - PullRequest
0 голосов
/ 06 октября 2018

Я использую библиотеки NPOI .NET для добавления данных, возвращаемых веб-службой, в документ Excel.По сути, моя программа считывает 25 000 записей из документа Excel в C # List, отправляет данные в виде входных данных в запрос веб-службы, а затем сохраняет возвращаемые данные в документе Excel на 5 различных листах.Я замечаю, что скорость обработки и производительность моей программы экспоненциально снижаются, поскольку в выходной документ Excel добавляется больше данных.Я запустил анализ кода в своем приложении, и C # обнаружил, что 30% ЦП выделяется для функции, описанной ниже, особенно строк, которые считывают данные из моего выходного документа и записывают данные в него.Приведенная ниже функция вызывается каждый раз, когда веб-сервис возвращает успешный ответ.(это вызывается 5 раз за ответ).

Как можно переписать приведенную ниже функцию для повышения производительности моего приложения?

    public static void AppendToExcelFileNPOI(string 
    filePath, int sheetIndex, List<string> contents)
    {
        FileStream fileWriter = null;
        ISheet sheet = null;

        try
        {
            if (!File.Exists(filePath))
            {
                CreateExcelOutputFile(filePath);
            }

            FileStream fileReader = new 
            FileStream(filePath, FileMode.Open, 
            FileAccess.Read);

            XSSFWorkbook workbook = new 
            XSSFWorkbook(fileReader); //XSSFWorkBook will write to 2007 Excel format  
            sheet = workbook.GetSheetAt(sheetIndex);  //Get the Excel Sheet specified by the integer stored in sheetIndex

            int indexOfLastRow = sheet.LastRowNum;

            IRow worksheetRow = 
          sheet.CreateRow(indexOfLastRow+1);

            int column = 0;
            foreach(var value in contents)
            {
                ICell cell = 
                worksheetRow.CreateCell(column);
                cell.SetCellValue(value);
                sheet.AutoSizeColumn(column);
                column++;
            }

            fileWriter = new FileStream(filePath, 
            FileMode.Create);
            workbook.Write(fileWriter);

        }
        catch (IOException)
        {
            MessageBox.Show($"The file {filePath} is 
            opened by another program or process." +
                          " Please close the file and 
             restart the batch process.", "Critical 
             Warning",
                          MessageBoxButtons.OK, 
             MessageBoxIcon.Warning);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        finally
        {
            if (fileWriter != null)
            {
                fileWriter.Close();
            }

        }

    }
...