Я хочу скопировать лист из шаблона книги в новую книгу. Я использовал этот код в других проектах, и он отлично работает, но теперь у меня проблема с книгой Excel, но я не знаю, что не так. Вот код:
byte[] file = File.ReadAllBytes(source);
using (var ms = new MemoryStream(file))
{
var package = new ExcelPackage(ms);
var worksheet = package.Workbook.Worksheets[1];
var copyPackage = new ExcelPackage(new FileInfo(destination));
// the following line causes a ArgumentOutOfRangeException
copyPackage.Workbook.Worksheets.Add(worksheet.Name, worksheet);
copyPackage.Save();
}
Это трассировка стека исключения (извинения, по-немецки):
Der Index lag außerhalb des Bereichs. Er darf nicht negativ und kleiner als die Sammlung sein.
Parametername: index
bei System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource)
bei OfficeOpenXml.Style.ExcelStyle.get_XfId()
bei OfficeOpenXml.ExcelStyles.CreateNamedStyle(String name, ExcelStyle Template)
bei OfficeOpenXml.ExcelStyles.CloneStyle(ExcelStyles style, Int32 styleID, Boolean isNamedStyle, Boolean allwaysAdd)
bei OfficeOpenXml.ExcelWorksheets.CloneCells(ExcelWorksheet Copy, ExcelWorksheet added)
bei OfficeOpenXml.ExcelWorksheets.Add(String Name, ExcelWorksheet Copy)
bei CopyExcel.Program.Main(String[] args) in D:\spikes\CopyExcel\CopyExcel\Program.cs:Zeile 26.
Вы уверены, что в вашем файле два листа и вы копируете второй? Может быть, измените его на package.Workbook.Worksheets [0]; Более безопасный способ - использовать имя рабочего листа package.Workbook.Worksheets [<WorkSheetName>]
@Magnetron Спасибо. Приносим извинения, исходный код (из проекта ASP.NET использует операторы using вместе с пакетом excel). Другая вещь с MemoryStream - хороший момент для улучшения, но не решает проблему. Похоже, что стили в скопированном листе не копируются правильно вместе с самим листом по какой-либо причине.
@Sanjay Правильно. Использование имен рабочих листов - лучшая идея, и это также то, что реализовано. В качестве примера здесь было проще использовать index. И да, рабочий лист существует.
Листы @Sanjay в Epplus имеют базу 1, поэтому OP выбирает первый.
Я не смог воспроизвести вашу проблему. Некоторые несвязанные моменты: вы должны использовать статус
using
при работе с ExcelPackage, потому что этоIDisposable
. Кроме того, почему вы загружаете файл в массив, помещаете MemoryStream для передачи в ExcelPackage вместо передачи FileInfo с путем?