Время прочтения: 5 мин.
Ранее был рассмотрен вопрос об объединении нескольких одинаковых Excel-файлов в один с помощью несложной программы на языке программирования C#. Но также может возникнуть и обратная ситуация, когда один большой файл нужно разделить на несколько.
Рассмотрим пример несложной программы, написанной на языке программирования C#. Ее функционал следующий:
— Разделить один Excel-файл на несколько одинаковых, указав количество строк, которое должно быть в итоговых файлах. В файле будем считывать только первый лист.
— В файле первая строка может содержать названия столбцов (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: «Кол-во первых столбцов для копирования»
Теперь нужно создать события нажатия (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-файл на несколько, указав необходимое количество строк. Данную программу можно еще дорабатывать, добавить различные функции и возможности, т.е. сделать более универсальной. Например, чтобы она по дате делила файлы, сохраняла названия заголовков и т.д.
Такие несложные программы высвобождают много времени, которое можно потратить на более интересное и важное занятие.