2015-02-25 3 views
4

В настоящее время я использую проект EPPlus, чтобы управлять некоторыми файлами .xlsx. Основная идея заключается в том, что я должен создать новый файл из данного шаблона.EPPlus с шаблоном не работает должным образом

Но когда я создаю новый файл из шаблона, все вычисленные столбцы в таблицах перепутаны.

кода я использую следующее:

static void Main(string[] args) 
{ 
    const string templatePath = "template_worksheet.xlsx"; // the path of the template 
    const string resultPath = "result.xlsx"; // the path of our result 

    using (var pck = new ExcelPackage(new FileInfo(resultPath), new FileInfo(templatePath))) // creating a package with the given template, and our result as the new stream 
    { 
    // note that I am not doing any work ... 
    pck.Save(); // savin our work 
    } 
} 

Например, для файла .xlsx (что есть таблица с 3 столбцами, последний из которых является только суммой остальные) программа создает файл .xlsx, где последний столбец имеет одинаковое значение (что верно только для первой строки) во всех строках.

следующие изображения показывает результат:

Table in the template Table in the result

Теперь вопросы: Что здесь происходит? Является ли мой код неправильным? Как я могу выполнить эту задачу без этого неожиданного поведения?

+0

Какую версию EpPlus вы используете?Это похоже на проблему EpPlus и, возможно, стоит опубликовать ее в [соответствующем разделе проекта] (http://epplus.codeplex.com/workitem/list/basic). – Deilan

+0

Я использую версию 4.0.3 –

+0

Откройте файл шаблона с помощью Excel 2007 и сохраните его под другим именем файла. Затем используйте новый файл, используя тот же рабочий процесс, который вы описали в сообщении. Воспроизводит ли он? – Deilan

ответ

0

Попробуйте использовать следующий код. Этот код принимает форматирование и другие правила и добавляет их как узел XML в другой файл. Ernie описал это очень хорошо здесь Importing excel file with all the conditional formatting rules to epplus Лучшая часть решения состоит в том, что вы также можете импортировать форматирование вместе с другими правилами. Он должен приблизить вас к тому, что вам нужно.

//File with your rules, can be your template 
var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); 

//Other file where you want the rules 
var existingFile2 = new FileInfo(@"c:\temp\temp2.xlsx"); 

using (var package = new ExcelPackage(existingFile)) 
using (var package2 = new ExcelPackage(existingFile2)) 
{ 
    //Make sure there are document element for the source 
    var worksheet = package.Workbook.Worksheets.First(); 
    var xdoc = worksheet.WorksheetXml; 

    if (xdoc.DocumentElement == null) 
     return; 

    //Make sure there are document element for the destination 
    var worksheet2 = package2.Workbook.Worksheets.First(); 
    var xdoc2 = worksheet2.WorksheetXml; 

    if (xdoc2.DocumentElement == null) 
     return; 

    //get the extension list node 'extLst' from the ws with the formatting 
    var extensionlistnode = xdoc 
     .DocumentElement 
     .GetElementsByTagName("extLst")[0]; 

    //Create the import node and append it to the end of the xml document 
    var newnode = xdoc2.ImportNode(extensionlistnode, true); 
    xdoc2.LastChild.AppendChild(newnode); 

    package2.Save(); 

} 
} 
1

Это определенно что-то есть. Я смог воспроизвести его сам. Это связано с созданной вами таблицей. если вы откроете файл и удалите его с помощью параметра «Преобразовать в диапазон» на вкладке «Инструменты таблицы», проблема исчезнет.

Я посмотрел исходный код и извлекал файлы xml на уровне zip и не видел никаких указаний на то, что он действительно возился с ними, - казалось, была прямой копией.

Очень странно, потому что если мы создадим и сохраним файл xlsx, включая таблицу из EPPlus, проблема там не будет. Это работает просто отлично:

[TestMethod] 
public void Template_Copy_Test() 
{ 
    //http://stackoverflow.com/questions/28722945/epplus-with-a-template-is-not-working-as-expected 
    const string templatePath = "c:\\temp\\testtemplate.xlsx"; // the path of the template 
    const string resultPath = "c:\\temp\\result.xlsx"; // the path of our result 

    //Throw in some data 
    var dtdata = new DataTable("tblData"); 
    dtdata.Columns.Add(new DataColumn("Col1", typeof(string))); 
    dtdata.Columns.Add(new DataColumn("Col2", typeof(int))); 
    dtdata.Columns.Add(new DataColumn("Col3", typeof(int))); 

    for (var i = 0; i < 20; i++) 
    { 
     var row = dtdata.NewRow(); 
     row["Col1"] = "String Data " + i; 
     row["Col2"] = i * 10; 
     row["Col3"] = i * 100; 
     dtdata.Rows.Add(row); 
    } 

    var templateFile = new FileInfo(templatePath); 
    if (templateFile.Exists) 
     templateFile.Delete(); 

    using (var pck = new ExcelPackage(templateFile)) 
    { 
     var ws = pck.Workbook.Worksheets.Add("Data"); 
     ws.Cells["A1"].LoadFromDataTable(dtdata, true); 

     for (var i = 2; i <= dtdata.Rows.Count + 1; i++) 
      ws.Cells[i, 4].Formula = String.Format("{0}*{1}", ExcelCellBase.GetAddress(i, 2), ExcelCellBase.GetAddress(i, 3)); 

     ws.Tables.Add(ws.Cells[1, 1, dtdata.Rows.Count + 1, 4], "TestTable"); 

     pck.Save(); 
    } 

    using (var pck = new ExcelPackage(new FileInfo(resultPath), templateFile)) // creating a package with the given template, and our result as the new stream 
    { 
     // note that I am not doing any work ... 
     pck.Save(); // savin our work 
    } 
} 

НО .....

Если мы открываем testtemplate.xlsx, удалить таблицу, сохранить/закрыть файл, открыть заново, и снова вставить точно такую ​​же таблицу проблемных шоу когда вы запустите это:

[TestMethod] 
public void Template_Copy_Test2() 
{ 
    //http://stackoverflow.com/questions/28722945/epplus-with-a-template-is-not-working-as-expected 
    const string templatePath = "c:\\temp\\testtemplate.xlsx"; // the path of the template 
    const string resultPath = "c:\\temp\\result.xlsx"; // the path of our result 

    var templateFile = new FileInfo(templatePath); 

    using (var pck = new ExcelPackage(new FileInfo(resultPath), templateFile)) // creating a package with the given template, and our result as the new stream 
    { 
     // note that I am not doing any work ... 
     pck.Save(); // savin our work 
    } 
} 

Он должен быть что-то хоронили в своих методах копирования на молнии, но я ничего не прыгнул на меня.

Но по крайней мере вы можете видеть, как обходить вокруг него.

Эрни

0

Попробуйте

var package = new ExcelPackage(excelFile) 
var excelSheet = package.Workbook.Worksheets[1]; 
for (var i = 1; i < 5; i++){ 
    excelWorkSheet.InsertRow(i, 1, 1); // Use value of i or whatever is suitable for you 
} 
package.Workbook.Calculate(); 

Установка новых экземпляров строки предыдущего формата строки и его формулу, если последний PRM установлен в 1

Смежные вопросы