EPPlus – копия листа из шаблона в другой excelpackage не работает (C #)

У меня есть DataSet, заполненный различными SQL-результатами DataTables. Некоторые из DataTables связаны с Excel-Template-File. Таким образом, в конце концов, вы хотите иметь excelfile со смесью новых рабочих листов и скопированных листов из какого-либо шаблона.

Вот почему мой код выглядит так:

public void CopyResultToExcelFileWithTemplate(DataSet sourceResult, string exportFilePath, string sourceName, string templateExcelFilePath, string sheetName = null) { var excelFile = new FileInfo(exportFilePath); var templateFile = new FileInfo(templateExcelFilePath); if (string.IsNullOrEmpty(sheetName)) { sheetName = sourceName; } // Open and get worksheets from template using (var template = new ExcelPackage(templateFile)) { var excelWorksheets = template.Workbook.Worksheets; var sheetCount = 1; foreach (DataTable resultTable in sourceResult.Tables) { var proposedSheetName = sourceResult.Tables.Count == 1 ? sheetName : string.Format("{0}_{1}", sheetName, sheetCount); var currentWorksheet = excelWorksheets.FirstOrDefault(w => string.Equals(w.Name, proposedSheetName, StringComparison.CurrentCultureIgnoreCase)) ?? excelWorksheets.Add(proposedSheetName); FillWorksheetWithDataTableContent(currentWorksheet, resultTable); using (var excelToExport = new ExcelPackage(excelFile)) { excelToExport.Workbook.Worksheets.Add(currentWorksheet.Name, currentWorksheet); excelToExport.Save(); } sheetCount++; } } } public void CopyResultToExcelFile(DataSet resultSet, string exportFilePath, string sourceName, string sheetName = null) { if (string.IsNullOrEmpty(sheetName)) { sheetName = sourceName; } var excelToExport = new FileInfo(exportFilePath); using (var excelPackage = new ExcelPackage(excelToExport)) { var sheetCount = 1; foreach (DataTable resultTable in resultSet.Tables) { var proposedSheetName = resultSet.Tables.Count == 1 ? sheetName : string.Format("{0}_{1}", sourceName, sheetCount); var worksheet = excelPackage.Workbook.Worksheets.Add(proposedSheetName); FillWorksheetWithDataTableContent(worksheet, resultTable); sheetCount++; } excelPackage.Save(); } } 

Поэтому я заполняю временный созданный excelfile комбинацией листов-копий из шаблона и с новыми рабочими листами. Он отлично работает, он показывает содержимое всех DataTables в excelfile в своем листе, но если excelfile содержит скопированные листы, появляется два сообщения об ошибке, а скопированные рабочие листы arent отформатированы.

excelfilecorrupt

worksheetunreadable

Мой компромисс выглядит так:

  /// <summary> /// Creates an temporary excel-file for the report and returns it as byte-array /// </summary> /// <param name="reportResults"></param> /// <param name="reportDetails"></param> /// <returns></returns> private static byte[] GetReportExcelFile(Dictionary<string, DataSet> reportResults, ReportDetails reportDetails) { var tmpGuid = Guid.NewGuid(); var tempFolderForExcelFile = $"{DefaultFolderForExcelFiles}{tmpGuid}"; var exportFilePath = $"{tempFolderForExcelFile}\\{DefaultExcelFileName}"; var templateFilePath = string.Empty; try { Cleanup.DeleteOldFiles(DefaultFolderForExcelFiles, 5, false, true); if (!Directory.Exists(tempFolderForExcelFile)) { Directory.CreateDirectory(tempFolderForExcelFile); } var excelExportManager = new ExcelExportManager(); if (!string.IsNullOrEmpty(reportDetails.Template)) { // Create resultfile from template exportFilePath = $"{tempFolderForExcelFile}\\OutputReport_{reportDetails.Template}"; templateFilePath = $"{tempFolderForExcelFile}\\Template_{reportDetails.Template}"; File.WriteAllBytes(templateFilePath, reportDetails.TemplateContent); } excelExportManager.AddDataSetToExcelFile(reportResults, exportFilePath, templateFilePath); using (var filstr = File.Open(exportFilePath, FileMode.Open)) { using (var ms = new MemoryStream()) { ms.SetLength(filstr.Length); filstr.Read(ms.GetBuffer(), 0, (int)filstr.Length); ms.Flush(); return ms.ToArray(); } } } catch (Exception ex) { throw new ReportingException(ex.Message); } finally { if (!string.IsNullOrEmpty(tempFolderForExcelFile)) { Directory.Delete(tempFolderForExcelFile, true); } } } public void AddDataSetToExcelFile(Dictionary<string, DataSet> resultSet, string exportFilePath, string templateFilePath = null) { var excelToExport = new FileInfo(exportFilePath); FileInfo template = null; if (!string.IsNullOrEmpty(templateFilePath)) { template = new FileInfo(templateFilePath); } using (var excelPackage = string.IsNullOrEmpty(templateFilePath) ? new ExcelPackage(excelToExport) : new ExcelPackage(excelToExport, template)) { foreach (var result in resultSet) { var sheetCount = 1; var sourceName = result.Key; foreach (DataTable resultTable in result.Value.Tables) { var proposedSheetName = result.Value.Tables.Count == 1 ? sourceName : string.Format("{0}_{1}", sourceName, sheetCount); var worksheet = excelPackage.Workbook.Worksheets.FirstOrDefault(ws => ws.Name == proposedSheetName); if (worksheet == null) { worksheet = excelPackage.Workbook.Worksheets.Add(proposedSheetName); FillWorksheetWithDataTableContent(ref worksheet, resultTable, TableStyles.Medium27); } else { FillWorksheetWithDataTableContent(ref worksheet, resultTable); } sheetCount++; } } excelPackage.SaveAs(excelToExport); } } 
  • часть epplus уже существует
  • Странное поведение при настройке высоты строки на EPPlus
  • Сортировка Excel по столбцу с использованием EPPlus
  • asp.net проверить, был ли сохранен / открыт файл из Response.OutputStream
  • C #: Сделать файл Excel видимым во время редактирования (EpPlus)
  • EPPlus, Найти и установить значение для Именованного диапазона
  • EPPLus - экспорт в Excel возвращает неудачную сетевую ошибку
  • Заполнить файл XLSM шаблона SERFF с помощью библиотеки C # EPPLUS?
  • EPPlus Изменение границы Цвет ячеек
  • EPPlus устанавливает сортировку по умолчанию в столбце
  • SQL-запрос в Excel в C #
  • Interesting Posts

    Я импортирую 348 тыс. Строк данных из Excel в VB.net SQL. И я получаю эту ошибку: время ожидания истекло

    Использование FileHelpers для импорта данных Excel с использованием MVC 5

    VBA – Создайте новый лист и переименуйте его

    Расчетное поле таблицы сводных таблиц Excel

    Excel VBA: для переменного количества строк между двумя идентификаторами, поиск каждого из числа переменных столбцов для строки

    Как использовать именованный столбец в формулах excel

    Как удалить несколько верхних строк и последнюю строку из файла CSV с помощью python

    У меня есть sql сгенерированный отчет с данными вроде 24-1, но при генерации в excel он отображается как 24-jan, … что такое решение в sql?

    Excel: IF и AND для дат, пробелов и значений

    PHP Spreadsheet_Excel_Reader всегда читает дату как ноябрь 30, 1999

    Как добавить значение DataTable в DataSet Использование каждого цикла foreach в ASP.NET C # Webform

    Цикл макроса через все листы в книге Excel

    Как импортировать / экспортировать multicell namedrange в формате .csv

    Данные Excel заполняют данные

    Установка тегов / свойств Sharepoint с помощью VBA

    Давайте будем гением компьютера.