Ускорить работу с Excel - C#

Узнай цену своей работы

Формулировка задачи:

Excel.Application xlApp = new Excel.Application(); //Excel
            xlApp.ScreenUpdating = false;
            Excel.Workbook xlWB; //рабочая книга            
            Excel.Worksheet xlSht; //лист Excel            
 
            xlWB = xlApp.Workbooks.Open(@"D:\test1223.xlsx"); //название файла Excel
            xlSht = xlWB.Sheets[1]; //название листа или можно так если лист первый по порядку - xlWB.Sheets[1];
            int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;  //последняя заполненная строка в столбце А
            
            for (int i = iLastRow; i >= 2; i--)
            {
                if (xlSht.Cells[i, 2].Value.ToString().Length < 8)
                {
                    xlSht.Rows[i].Delete();
                }
            }
 
            xlApp.ScreenUpdating = true;
            xlWB.Close(true); //закрываем книгу, сохраняя изменения
Удаляю все строки из таблицы, если в столбце B символов меньше чем 8. Таблица больше 100к строк, поэтому код работает ну очень долго. Подскажите пожалуйста как можно ускорить? думал сделать 2 потока в одном перебирать первую половину строк, во втором вторую, но не смог это реализовать

Решение задачи: «Ускорить работу с Excel»

textual
Листинг программы
using System;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
 
namespace TestExcel
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Excel.Application xlApp = new Excel.Application(); //Excel
            Excel.Workbook xlWB; //рабочая книга            
            Excel.Worksheet xlSht; //лист Excel            
            Excel.Range Rng; //диапазон ячеек            
 
            xlWB = xlApp.Workbooks.Open(@"C:\C#\Test Excel.xlsx"); //название файла Excel                                 
            xlSht = xlWB.Worksheets["Лист1"]; //название листа или 1-й лист в книге xlSht = xlWB.Worksheets[1];
            int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;  //последняя заполненная строка в столбце А
            var arrData = (object[,])xlSht.Range["A1:A" + iLastRow].Value; //берём данные с листа Excel           
            object[,] arrResult = new object[arrData.GetUpperBound(0), arrData.GetUpperBound(1)]; //указываем размер нового массива            
 
            int iCol = 1; //предполагаем, что у нас лишь 1 столбец с данными в нашем примере
            int iRowInResultArray = 0;
            for (int iRow = 1; iRow <= arrData.GetUpperBound(0); iRow++) //цикл по строкам
            {
                if (arrData[iRow, iCol] != null) //если ячека не пустая
                {
                    if (arrData[iRow, iCol].ToString().Length > 8) //наше условие - длина больше 8
                    {
                        iRowInResultArray ++;
                        arrResult[iRowInResultArray, 0] = arrData[iRow, iCol].ToString(); //перекладываем данные с общего массива в чистый массив
                    }
                }
            }
            //xlSht.Cells.Clear();//удаляем данные со всего листа            
            xlSht.Range["B1"].Resize[arrResult.GetUpperBound(0), arrResult.GetUpperBound(1)+1].Value = arrResult; //выгрузка результата на лист 
            //можно выгрузить в новый книгу
            //xlWB = xlApp.Workbooks.Add(); //создаём новую книгу
            //xlWB.Worksheets[1].Range["A1"].Resize[arrResult.GetUpperBound(0), arrResult.GetUpperBound(1) + 1].Value = arrResult; //выгрузка результата на лист 
 
            xlApp.Visible = true; //отображаем Excel 
            MessageBox.Show("Конец!", "Программа", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5