Разделение Excel-файлов на несколько файлов

Введение

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

Aspose.Cells предоставляет два гибких подхода для этой задачи. Первый подход перебирает каждый рабочий лист в исходной рабочей книге и копирует его содержимое в совершенно новый экземпляр Workbook, сохраняя каждый как отдельный файл. Второй подход фокусируется на конкретном диапазоне ячеек внутри рабочего листа и копирует только этот диапазон в новую рабочую книгу. В обоих случаях общий ход выполнения одинаков: загрузите исходную рабочую книгу с помощью класса Workbook, получите доступ к нужным данным через объекты Worksheet и Cells, перенесите содержимое в целевую Workbook, а затем сохраните её на диск.

Разделение Excel-файла путём копирования каждого рабочего листа в новую рабочую книгу

Обзор подхода

В этом подходе исходная рабочая книга открывается один раз, а затем для каждого Worksheet в её коллекции Worksheets создаётся новая целевая Workbook. Содержимое исходного рабочего листа затем копируется в первый рабочий лист целевой рабочей книги, и целевая рабочая книга сохраняется как файл, имя которого образовано от имени исходного рабочего листа. Результатом является один выходной файл на рабочий лист, при этом каждый выходной файл содержит данные одного исходного листа.

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

Шаги

Следующие шаги описывают, как разделить Excel-файл путём копирования каждого рабочего листа в новую рабочую книгу:

  1. Откройте исходный Excel-файл, создав экземпляр объекта Workbook и передав путь к файлу в его конструктор.
  2. Переберите коллекцию Workbook.Worksheets с помощью цикла for или foreach, чтобы обработать каждый Worksheet в исходном файле.
  3. Внутри цикла создайте новый экземпляр целевой Workbook (пустую рабочую книгу) для текущего рабочего листа.
  4. Добавьте новый Worksheet в целевую рабочую книгу (или используйте первый рабочий лист по умолчанию) и присвойте ему осмысленное имя, в идеале совпадающее со свойством Name исходного рабочего листа.
  5. Скопируйте содержимое исходного рабочего листа в целевой рабочий лист. Это можно сделать путём перебора ячеек коллекции Cells исходного рабочего листа и записи их значений в соответствующие ячейки целевого рабочего листа, либо с помощью метода Cells.Copy для передачи всего диапазона за один раз.
  6. Сформируйте путь к выходному файлу, который включает имя исходного рабочего листа (например, dataDir + worksheet.Name + ".xls"), чтобы каждый сгенерированный файл имел уникальное имя.
  7. Вызовите метод Workbook.Save целевой рабочей книги, чтобы записать файл на диск.
  8. Повторяйте шаги с 3 по 7 для следующего рабочего листа, пока не будут обработаны все рабочие листы.

Пример кода

using namespace Aspose::Cells;

int main() {
    Aspose::Cells::Startup();

    std::string dataDir = "data/";
    Workbook wb(U16String((dataDir + "book1.xls").c_str()));

    int sheetCount = wb.GetWorksheets().GetCount();
    for (int i = 0; i < sheetCount; ++i) {
        Worksheet sourceSheet = wb.GetWorksheets().Get(i);
        U16String sheetName = sourceSheet.GetName();

        Workbook destWorkbook;
        int destIndex = destWorkbook.GetWorksheets().Add();
        Worksheet destSheet = destWorkbook.GetWorksheets().Get(destIndex);
        destSheet.SetName(sheetName);

        destSheet.Copy(sourceSheet);

        std::string destFile = dataDir + sheetName.ToUtf8() + ".xls";
        destWorkbook.Save(U16String(destFile.c_str()), SaveFormat::Excel97To2003);
    }

    Aspose::Cells::Cleanup();
    return 0;
}

Ожидаемый результат — набор новых файлов в каталоге данных, по одному файлу на каждый рабочий лист из исходной рабочей книги. Каждый файл назван в честь соответствующего исходного листа, и файл содержит данные (и при необходимости форматирование) этого единственного листа.

Разделение Excel-файла путём копирования диапазона в новую рабочую книгу

Обзор подхода

Иногда данные, которые вам нужно разделить, относятся не ко всему рабочему листу, а к определённой прямоугольной области рабочего листа, такой как A1:D10, или к именованному диапазону, представляющему конкретную таблицу. В этих случаях копирование целых рабочих листов является расточительным, и требуется более точный подход: определите исходный диапазон, скопируйте только этот диапазон в новую рабочую книгу и сохраните новый файл.

Этот подход идеален, когда вы хотите извлечь одну таблицу, блок отчёта или область данных из большего рабочего листа, отбросив всё несвязанное содержимое. Он также полезен для экспорта выбранных пользователем областей листа как самостоятельных файлов.

Шаги

Следующие шаги описывают, как разделить Excel-файл путём копирования определённого диапазона в новую рабочую книгу:

  1. Откройте исходный Excel-файл, создав экземпляр объекта Workbook с указанием пути к файлу.
  2. Получите целевой Worksheet, содержащий диапазон, который вы хотите скопировать, либо по индексу (например, первый лист), либо по имени из коллекции Worksheets.
  3. Определите диапазон для копирования. Это может быть жёстко заданный диапазон ячеек, такой как A1:C10, или именованный диапазон, полученный через коллекцию Worksheet.Cells, либо диапазон, созданный с помощью Worksheet.Cells.CreateRange.
  4. Создайте новый экземпляр целевой Workbook.
  5. Получите доступ к первому Worksheet целевой рабочей книги (лист по умолчанию).
  6. Скопируйте исходный диапазон в целевой рабочий лист, обычно начиная с ячейки A1. Метод Cells.Copy целевой коллекции Cells может использоваться для копирования всего диапазона, либо вы можете перебрать ячейки исходного диапазона и записать их значения в целевые ячейки с помощью PutValue. При необходимости могут быть предоставлены CopyOptions для управления тем, что передаётся (только значения, значения и стили, формулы и так далее).
  7. Сохраните целевую рабочую книгу по новому пути к файлу на диске с помощью метода Workbook.Save.

Пример кода

using namespace Aspose::Cells;

int main() {
    Aspose::Cells::Startup();

    // Определение директории данных и путей к файлам
    std::string dataDir = "data/";
    std::string sourcePath = dataDir + "book1.xls";
    std::string outputPath = dataDir + "outputrange.xls";

    // Открытие исходного Excel-файла
    Workbook sourceWorkbook(U16String(sourcePath.c_str()));

    // Получение первого листа из исходной рабочей книги
    Worksheet sourceWorksheet = sourceWorkbook.GetWorksheets().Get(0);

    // Определение исходного диапазона ячеек A1:C10 (10 строк, 3 столбца, начиная со строки 0, столбца 0)
    Range sourceRange = sourceWorksheet.GetCells().CreateRange(0, 0, 10, 3);

    // Создание новой рабочей книги назначения
    Workbook destWorkbook;

    // Доступ к первому листу в рабочей книге назначения
    Worksheet destWorksheet = destWorkbook.GetWorksheets().Get(0);

    // Создание диапазона назначения в A1 с теми же размерами, что и исходный диапазон
    Range destRange = destWorksheet.GetCells().CreateRange(0, 0, 10, 3);

    // Копирование исходного диапазона в диапазон назначения
    destRange.Copy(sourceRange);

    // Сохранение рабочей книги назначения в новый файл .xls
    destWorkbook.Save(U16String(outputPath.c_str()), SaveFormat::Excel97To2003);

    Aspose::Cells::Cleanup();
    return 0;
}

Ожидаемый результат — один новый файл в каталоге данных, который содержит только значения (и при необходимости форматирование) указанного диапазона, извлечённого из исходной рабочей книги. Целевой файл не имеет связи с какими-либо другими данными в исходном файле; он содержит только извлечённый диапазон, начиная с ячейки A1 его первого рабочего листа.

Связанные статьи