Как объединить два листа в одну книгу с помощью openXML?

Я хочу объединить два разных листа из других книг в одну книгу, но я не знаю, как это сделать с помощью openXML. Я хочу создать только одну книгу с двумя листами. Мне не нужно объединять рабочие листы в один. Как объединить два листа в одну книгу с помощью openXML?


person ElConrado    schedule 30.07.2015    source источник


Ответы (3)


Копировать рабочий лист из одной книги в другую легко с помощью Epplus, который доступен бесплатно в Nuget.

Что-то вроде этого примера скопирует рабочий лист и все его данные из одной книги в другую за один раз без необходимости какой-либо отдельной функции для перебора строк для копирования данных:

        FileInfo fInfoSrc = new FileInfo(@"C:\Temp\Source.xlsx");
        FileInfo fInfoDest = new FileInfo(@"C:\Temp\Destination.xlsx");
        using (var source = new ExcelPackage(fInfoSrc))
        {
            using (var destination = new ExcelPackage(fInfoDest))
            {
                var srcWorksheet = source.Workbook.Worksheets["SourceWorksheet"];
                var destWorksheet = destination.Workbook.Worksheets.Add("destinationWorksheetName", srcWorksheet);
                destination.Save();
            }
        }
person Stewart_R    schedule 30.07.2015
comment
Кажется, это хороший ответ, но моя программа завершает выполнение на строке: var srcWorksheet = source.Workbook.Worksheets[SourceWorksheet];. - person ElConrado; 31.07.2015
comment
Я указал диапазон в своем файле Excel, и он работает неправильно - person ElConrado; 31.07.2015
comment
КАК копировать строки (не заголовки) из targetWorksheetName в SourceWorksheet? - person Kiquenet; 25.07.2018

Вам нужна ссылка на OpenXml SDK. Небольшой пример, как создать книгу. Вызовите второй метод AddWorksheet столько рабочих листов, сколько вам нужно.

    private static SpreadsheetDocument CreateWorkbook(Stream stream)
    {
        // Create the Excel workbook
        var spreadSheet = SpreadsheetDocument.Create(stream, SpreadsheetDocumentType.Workbook, false);

        // Create the parts and the corresponding objects
        // Workbook
        spreadSheet.AddWorkbookPart();
        spreadSheet.WorkbookPart.Workbook = new Workbook();
        spreadSheet.WorkbookPart.Workbook.Save();

        // Shared string table
        var sharedStringTablePart = spreadSheet.WorkbookPart.AddNewPart<SharedStringTablePart>();
        sharedStringTablePart.SharedStringTable = new SharedStringTable();
        sharedStringTablePart.SharedStringTable.Save();

        // Sheets collection
        spreadSheet.WorkbookPart.Workbook.Sheets = new Sheets();
        spreadSheet.WorkbookPart.Workbook.Save();

        // Stylesheet
        var workbookStylesPart = spreadSheet.WorkbookPart.AddNewPart<WorkbookStylesPart>();
        workbookStylesPart.Stylesheet = new Stylesheet();
        workbookStylesPart.Stylesheet.Save();


        return spreadSheet;
    }

    private static WorksheetPart AddWorksheet(SpreadsheetDocument spreadsheet, string name)
    {
        // Add the worksheetpart
        var worksheetPart = spreadsheet.WorkbookPart.AddNewPart<WorksheetPart>();
        worksheetPart.Worksheet = new Worksheet(new SheetData());


        uint sheetId = 1;
        var sheets = spreadsheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
        if (sheets.Elements<Sheet>().Any())
        {
            sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
        }

        // Add the sheet and make relation to workbook
        var sheet = new Sheet
        {
            Id = spreadsheet.WorkbookPart.GetIdOfPart(worksheetPart),
            SheetId = sheetId,
            Name = name
        };

        sheets.Append(sheet);

        worksheetPart.Worksheet.Save();
        spreadsheet.WorkbookPart.Workbook.Save();

        return worksheetPart;
    }
person CodeTherapist    schedule 30.07.2015
comment
Это метод создания. Мне нужно заполнить данные из существующих листов. Мне нужно что-то вроде добавления листа в новую книгу с данными из существующего листа. - person ElConrado; 30.07.2015
comment
С помощью моего кода вы можете создать новую книгу со многими нужными вам листами. Затем вам нужна вторая часть, которая читает строки из другой книги и добавляет их в эту новую. - person CodeTherapist; 30.07.2015
comment
Кроме того, этот метод добавляет в конец списка рабочих листов новый рабочий лист. По умолчанию в Excel уже существует 3 рабочих листа. - person ElConrado; 30.07.2015

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

Хороший способ - использовать EPPlus, как и в другом ответе на этот вопрос, но когда я использую его с файлом excel, в котором указано имя (именованные диапазоны), он работает неправильно.

person ElConrado    schedule 31.07.2015
comment
любой пример исходного кода для клонирования каждой строки из исходного файла в целевой? - person Kiquenet; 25.07.2018