У меня возникла небольшая проблема, когда я создаю файл Excel из шаблона, используя библиотеку EPPlus. Файл имеет первую электронную таблицу, которая содержит данные, которые используются для заполнения сводных таблиц в следующих листах.
Когда я открываю сгенерированный файл, появляется следующее сообщение об ошибке: "Excel нашел нечитаемый контент в" sampleFromTemplate.xlsx ". Вы хотите восстановить содержимое этой книги? Я доверяю источнику этой книги, нажмите" Да ".
Я, очевидно, нажимаю "да", затем получаю сводку ремонта, сделанного с файлом, и ссылку на файл журнала в формате XML, содержащий это:
<?xml version="1.0" encoding="UTF-8" standalone="true"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<logFileName>error095080_01.xml</logFileName>
<summary>Errors were detected in file 'C:\TEMP\sampleFromTemplate.xlsx'</summary>
<repairedRecords summary="Following is a list of repairs:">
<repairedRecord>Repaired Records: Table from /xl/tables/table1.xml part (Table)</repairedRecord>
</repairedRecords>
</recoveryLog>
Это, по-видимому, вызвано именованным диапазоном ( "Таблица1" ), который я определяю в своем коде, чтобы указать данные, которые будут использоваться для сводных таблиц. В шаблоне под названием "Таблица1" уже есть "Имя таблицы", но я не могу получить доступ к нему через коллекцию ExcelPackage.Worksheet.Names. Будучи новым для EPPlus и не очень экспериментировал с Excel, я не понимаю, где я делаю неправильно. Здесь бит кода, где я создаю файл:
private string GenerateFromTemplate(string fileName, string templateName, DataTable tab)
{
FileInfo newFile = new FileInfo(string.Format("C:\\MyPath\\{0}.xlsx", fileName));
FileInfo templateFile = new FileInfo(string.Format("C:\\MyPath\\{0}.xlsx", templateName));
try
{
using (ExcelPackage pkg = new ExcelPackage(newFile, templateFile))
{
ExcelWorksheet sheet = pkg.Workbook.Worksheets["MyDataSheet"];
ExcelRange range = sheet.Cells[string.Format("A1:U{0}", dt.Rows.Count)];
pkg.Workbook.Names.Add("Table1", range as ExcelRangeBase);
int sheetRowIndex = 2;
foreach (DataRow row in this.dt.Rows)
{
sheet.Cells[sheetRowIndex, 1].Value = row["Row1"];
sheet.Cells[sheetRowIndex, 2].Value = row["Row2"];
[...]
sheet.Cells[sheetRowIndex, 21].Value = row["Row21"];
sheetRowIndex++;
}
pkg.Save();
return newFile.FullName;
}
}
catch (IOException ex) { return ex.Message; }
}
Обратите внимание, что все сводные таблицы заполнены правильно, так почему это происходит?
Спасибо: -)