Время прочтения: 5 мин.

Ранее был рассмотрен вопрос об объединении нескольких одинаковых Excel-файлов в один с помощью несложной программы на языке программирования C#. Но также может возникнуть и обратная ситуация, когда один большой файл нужно разделить на несколько.

Рассмотрим пример несложной программы, написанной на языке программирования C#. Ее функционал следующий:

— Разделить один Excel-файл на несколько одинаковых, указав количество строк, которое должно быть в итоговых файлах. В файле будем считывать только первый лист.

— В файле первая строка может содержать названия столбцов (1) или названия столбцов могут отсутствовать (2).

Рисунок 1
Рисунок 2

— В итоговых файлах заголовки будут отсутствовать, но при необходимости программу можно доработать.

— Программа может разъединить не все столбцы в файле, а определенное количество, считая с первого. Например, в файлах может быть 20 столбцов, но нужно разъединить в файле только первые 10.

Для создания программы используется Visual Studio.

На форме (3) нужно создать следующие элементы:

1. текстовое поле (TextBox1) для отображения выбранной директории, где размещен Excel-файл, который необходимо обработать.

2. текстовое поле (TextBox2) для указания количества строк, которое должно быть в итоговых файлах.

3. текстовое поле (TextBox3) для указания количества столбцов, считая с 1

4. кнопка Button1 – свойство Text: «Выбрать файл».

5. кнопка Button2 – свойство Text: «Запуск.

6. «галочка» (CheckBox1) – свойство Text: «Строка заголовков»

7. текстовая подпись Label1 – свойство Text: «Директория файла»

8. текстовая подпись Label2 – свойство Text: «Кол-во строк для разделения»

9. текстовая подпись Label3 – свойство Text: «Кол-во первых столбцов для копирования»

Рисунок 3

Теперь нужно создать события нажатия (Click) на кнопки Button1 и Button2.

Кнопка Button1 «Выбрать файл» будет открывать диалоговое окно для выбора файла Excel, который нужно разделить.

Код:

private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog Ofd = new OpenFileDialog();
       if (Ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
       {
       	textBox1.Text = Ofd.FileName;
       }
       else { MessageBox.Show("Не указана директория"); }
}

Кнопка Button2 «Запуск» проверяет, что выбран файл, указано количество строк и столбцов и запускает функцию, которая разделяет на файлы.

private void button2_Click(object sender, EventArgs e)
{
if (textBox1.Text != "" && textBox2.Text != ""  && textBox3.Text != "")
       {
       	button1.Enabled = false;
              button2.Enabled = false;
              //функция для разделения на несколько файлов
              SplittingExcelFile(textBox1.Text, Convert.ToInt32(textBox2.Text), Convert.ToInt32(textBox3.Text));

              MessageBox.Show("ВСЕ ОК");
              GC.GetTotalMemory(true);
Application.Exit();
}
}

Теперь нужно создать функцию, которая разделит файл Excel на несколько файлов по указанному количеству строк:

private void SplittingExcelFile(string nameExcelFile, int r, int c)
        {
            string dataInd = DateTime.Now.ToString("dd.MM.yyyy HH mm ss");//дата время запуска программы
            string pathExe = Application.StartupPath.ToString() + "\\";//путь к файлу exe
            string nameFolder = "";
            //создаем папку в которой будем сохранять все промежуточные файлы и результат
            nameFolder = "Выгрузка_" + dataInd + "\\";
            if (Directory.Exists(pathExe + nameFolder))
            {
            }
            else
            {
                DirectoryInfo di = Directory.CreateDirectory(pathExe + nameFolder);
            }
            Excel.Application excel;
            Excel.Workbook wbInputExcel, wbTempExcel;//книги Excel
            Excel.Worksheet wshInputExcel, wshTempExcel;//листы Excel

            excel = new Excel.Application();

            //открываем файл Excel
            excel.DisplayAlerts = false;
            wbInputExcel = excel.Workbooks.Open(textBox1.Text);
            wshInputExcel = (Excel.Worksheet)wbInputExcel.Worksheets.get_Item(1);
            //если в файле есть строка заголовок, то удаляем ее.
            if (checkBox1.Checked) {
                wshInputExcel.Rows[1].Delete();
            }
            //находим последнюю строку
            int LastRow = wshInputExcel.Cells[wshInputExcel.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;

            int k = r;
            int numberExcel = 0;

            //проходимся в цикле с шагом, который указали в поле TextBox "Кол-во строк для разделения"
            for (int i = 1; i <= LastRow; i = i + r)
            {
                //копируем часть строк
                wshInputExcel.Range[wshInputExcel.Cells[i, 1], wshInputExcel.Cells[k, c]].Copy();
                numberExcel++;
                k = k + r;
                //создаем новый файл
                wbTempExcel = excel.Workbooks.Add(System.Reflection.Missing.Value);
                wshTempExcel = wbTempExcel.Sheets[1];
                wshTempExcel.Name = "Лист1";
                //вставляем в файл и сохраняем
                wshTempExcel.Range["A1"].PasteSpecial(Excel.XlPasteType.xlPasteValues);
                string nameFile = "Part_" + numberExcel + ".xlsx";
                wbTempExcel.SaveAs(pathExe + nameFolder + nameFile);
                wbTempExcel.Close();
                ReleaseObject(wshTempExcel);
                ReleaseObject(wbTempExcel);
            }
            ReleaseObject(wshInputExcel);
            ReleaseObject(wbInputExcel);
        }

Запустим программу на примере файла, который был показан на рисунке (1):

Вот такой результат мы получим:

Откроем файлы и посмотрим, что получилось:

Это был пример самой простой программы, которая позволит быстро разъединить Excel-файл на несколько, указав необходимое количество строк. Данную программу можно еще дорабатывать, добавить различные функции и возможности, т.е. сделать более универсальной. Например, чтобы она по дате делила файлы, сохраняла названия заголовков и т.д.

Такие несложные программы высвобождают много времени, которое можно потратить на более интересное и важное занятие.