Разделение файлов Excel на несколько файлов
Введение
Существует множество реальных сценариев, в которых разработчику необходимо разбить один файл Excel на несколько более мелких файлов. Например, рабочая книга может содержать по одному рабочему листу на каждое подразделение, и каждому руководителю подразделения нужно получить только свой собственный лист. В других случаях может потребоваться извлечь конкретную таблицу или блок данных из рабочего листа и отправить его как отдельный файл по электронной почте, не раскрывая остальную часть рабочей книги. Большие консолидированные рабочие книги также могут быть разделены на более мелкие части для упрощения обработки, ускорения загрузки или последующей обработки другими системами.
Aspose.Cells предлагает два гибких подхода для решения этой задачи. Первый подход перебирает каждый рабочий лист в исходной рабочей книге и копирует его содержимое в новый экземпляр Workbook, сохраняя каждый из них как отдельный файл. Второй подход фокусируется на конкретном диапазоне ячеек внутри рабочего листа и копирует только этот диапазон в новую рабочую книгу. В обоих случаях общий поток одинаков: загрузить исходную рабочую книгу с помощью класса Workbook, получить доступ к соответствующим данным через объекты Worksheet и Cells, перенести содержимое в целевую Workbook, а затем сохранить её на диск.
Разделение файла Excel путём копирования каждого рабочего листа в новую рабочую книгу
Обзор подхода
В этом подходе исходная рабочая книга открывается один раз, а затем для каждого Worksheet в её коллекции Worksheets создаётся новая целевая Workbook. Содержимое исходного рабочего листа затем копируется в первый рабочий лист целевой рабочей книги, и целевая рабочая книга сохраняется как файл, имя которого формируется на основе имени исходного рабочего листа. Результатом является один выходной файл на каждый рабочий лист, при этом каждый выходной файл содержит данные одного исходного листа.
Этот метод является правильным выбором, когда каждый рабочий лист в исходной рабочей книге представляет собой логически независимую единицу информации (например, подразделение, регион, месяц или продуктовую линейку), и вы хотите передать или обработать каждую единицу отдельно.
Шаги
Следующие шаги описывают, как разделить файл Excel путём копирования каждого рабочего листа в новую рабочую книгу:
- Откройте исходный файл Excel, создав экземпляр объекта
Workbookи передав путь к файлу в его конструктор. - Переберите коллекцию
Workbook.Worksheetsс помощью циклаforилиforeach, чтобы обработать каждыйWorksheetв исходном файле. - Внутри цикла создайте новый экземпляр целевой
Workbook(пустую рабочую книгу) для текущего рабочего листа. - Добавьте новый
Worksheetв целевую рабочую книгу (или используйте первый рабочий лист по умолчанию) и присвойте ему осмысленное имя, в идеале совпадающее со свойствомNameисходного рабочего листа. - Скопируйте содержимое исходного рабочего листа в целевой рабочий лист. Это можно сделать, перебирая ячейки коллекции
Cellsисходного рабочего листа и записывая их значения в соответствующие ячейки целевого рабочего листа, либо с помощью методаCells.Copyдля переноса всего диапазона за один раз. - Сформируйте путь к выходному файлу, который включает имя исходного рабочего листа (например,
dataDir + worksheet.Name + ".xls"), чтобы каждый сгенерированный файл имел уникальное имя. - Вызовите метод
Workbook.Saveцелевой рабочей книги, чтобы записать файл на диск. - Повторяйте шаги с 3 по 7 для следующего рабочего листа, пока не будут обработаны все рабочие листы.
Пример кода
using System;
using System.IO;
using Aspose.Cells;
string dataDir = "data/";
Workbook workbook = new Workbook(dataDir + "book1.xls");
for (int i = 0; i < workbook.Worksheets.Count; i++)
{
Worksheet sourceSheet = workbook.Worksheets[i];
string sheetName = sourceSheet.Name;
Workbook destWorkbook = new Workbook();
int destIndex = destWorkbook.Worksheets.Add();
Worksheet destSheet = destWorkbook.Worksheets[destIndex];
destSheet.Name = sheetName;
destSheet.Copy(sourceSheet);
string destFile = dataDir + sheetName + ".xls";
destWorkbook.Save(destFile, SaveFormat.Excel97To2003);
}
Ожидаемый результат — набор новых файлов в каталоге данных, по одному файлу на каждый рабочий лист из исходной рабочей книги. Каждый файл назван в честь соответствующего исходного листа, и файл содержит данные (и, при необходимости, форматирование) именно этого листа.
Разделение файла Excel путём копирования диапазона в новую рабочую книгу
Обзор подхода
Иногда данные, которые необходимо разделить, относятся не ко всему рабочему листу, а к определённой прямоугольной области рабочего листа, такой как A1:D10 или именованный диапазон, представляющий конкретную таблицу. В этих случаях копирование целых рабочих листов является избыточным, и требуется более точный подход: определить исходный диапазон, скопировать только этот диапазон в новую рабочую книгу и сохранить новый файл.
Этот подход идеален, когда вы хотите извлечь одну таблицу, блок отчёта или область данных из большого рабочего листа, отбросив всё несвязанное содержимое. Он также полезен для экспорта выбранных пользователем областей листа как отдельных файлов.
Шаги
Следующие шаги описывают, как разделить файл Excel путём копирования определённого диапазона в новую рабочую книгу:
- Откройте исходный файл Excel, создав экземпляр объекта
Workbookс путём к файлу. - Получите целевой
Worksheet, содержащий диапазон, который вы хотите скопировать, либо по индексу (например, первый лист), либо по имени из коллекцииWorksheets. - Определите диапазон для копирования. Это может быть жёстко заданный диапазон ячеек, такой как
A1:C10, либо именованный диапазон, полученный через коллекциюWorksheet.Cells, либо диапазон, созданный с помощьюWorksheet.Cells.CreateRange. - Создайте новый экземпляр целевой
Workbook. - Получите доступ к первому
Worksheetцелевой рабочей книги (лист по умолчанию). - Скопируйте исходный диапазон в целевой рабочий лист, как правило, начиная с ячейки
A1. МетодCells.CopyколлекцииCellsцелевого объекта может использоваться для копирования всего диапазона, либо вы можете перебрать ячейки исходного диапазона и записать их значения в ячейки назначения с помощьюPutValue. Дополнительно могут быть переданыCopyOptionsдля управления тем, что переносится (только значения, значения и стили, формулы и т. д.). - Сохраните целевую рабочую книгу в новый путь к файлу на диске с помощью метода
Workbook.Save.
Пример кода
using System;
using System.IO;
using Aspose.Cells;
// Определение каталога данных и путей к файлам
string dataDir = "data/";
string sourcePath = dataDir + "book1.xls";
string outputPath = dataDir + "outputrange.xls";
// Открытие исходного файла Excel
Workbook sourceWorkbook = new Workbook(sourcePath);
// Получение первого листа из исходной книги
Worksheet sourceWorksheet = sourceWorkbook.Worksheets[0];
// Определение исходного диапазона ячеек A1:C10 (10 строк, 3 столбца начиная со строки 0, столбца 0)
var sourceRange = sourceWorksheet.Cells.CreateRange(0, 0, 10, 3);
// Создание новой книги назначения
Workbook destWorkbook = new Workbook();
// Доступ к первому листу в книге назначения
Worksheet destWorksheet = destWorkbook.Worksheets[0];
// Создание диапазона назначения в A1 с теми же размерами, что и исходный диапазон
var destRange = destWorksheet.Cells.CreateRange(0, 0, 10, 3);
// Копирование исходного диапазона в диапазон назначения
destRange.Copy(sourceRange);
// Сохранение книги назначения в новый файл .xls
destWorkbook.Save(outputPath, SaveFormat.Excel97To2003);
Ожидаемый результат — один новый файл в каталоге данных, который содержит только значения (и, при необходимости, форматирование) указанного диапазона, извлечённого из исходной рабочей книги. Целевой файл не имеет связи с какими-либо другими данными в исходном файле; он содержит только извлечённый диапазон, начиная с ячейки A1 своего первого рабочего листа.