Я хочу объединить два разных листа из других книг в одну книгу, но я не знаю, как это сделать с помощью openXML. Я хочу создать только одну книгу с двумя листами. Мне не нужно объединять рабочие листы в один. Как объединить два листа в одну книгу с помощью openXML?
Как объединить два листа в одну книгу с помощью openXML?
Ответы (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();
}
}
Вам нужна ссылка на 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;
}
Лучший способ, который я выбрал, - открыть файл назначения и в цикле итеративно открыть исходный файл с копируемым листом. Затем я клонирую каждую строку из исходного файла в целевой с помощью метода узла клонирования в глубоком режиме. Эту клонированную строку я вставляю в определенный индекс на листе целевого файла.
Хороший способ - использовать EPPlus, как и в другом ответе на этот вопрос, но когда я использую его с файлом excel, в котором указано имя (именованные диапазоны), он работает неправильно.