.xlsx使用EPPlus模板创build并保存是不可读/损坏的

问题

我正在尝试创build一个使用Excel模板创buildExcel文档 ,然后使用EPPlus写入多个单元格的小程序。 不幸的是,无论我尝试什么,这些文件似乎都是腐败的。

我的代码:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using OfficeOpenXml; using System.IO; namespace ConsoleApplication9 { public sealed class ExcelSerialize { private readonly List<Tuple<string, string>> Results; private readonly string Directory; private ExcelPackage package; public ExcelSerialize(List<Tuple<string, string>> Results, string Directory) { this.Results = Results; this.Directory = Directory; } public bool WriteResults() { FileInfo template = new FileInfo(Directory); using (package = new ExcelPackage(template, true)) { ExcelWorksheet worksheet = package.Workbook.Worksheets[1]; //foreach (Tuple<string, string> Result in Results) //{ // worksheet.Cells[Result.Item1].Value = Result.Item2; //} string file = string.Format(System.AppDomain.CurrentDomain.BaseDirectory.ToString() + @"results\results" + System.DateTime.Now.ToString().Replace(" ", "").Replace("/", "_").Replace(":", "-") + ".xlsx"); Byte[] bin = package.GetAsByteArray(); File.WriteAllBytes(file, bin); return true; } } } } 

我试过的东西:

  • 更改模板中各个单元格的值。
  • 保存从模板创build的Excel文档,而不向其写入任何新数据。
  • 使用包含“TEST”的单元格A1,A2和A3创build一个基本模板,而不是其他编辑,而不是我打算使用的更复杂的模板。
  • 使用Package.SaveAs()保存。
  • 使用示例代码中看到的Byte数组进行保存。
  • 从Codeplex上提供的最新源编译EPPlus。

事情的工作:

  • 使用以下代码创build一个新文件:

 using (package = new ExcelPackage(string.Format(System.AppDomain.CurrentDomain.BaseDirectory.ToString() + @"results\results" + System.DateTime.Now.ToString().Replace(" ", "").Replace("/", "_").Replace(":", "-") + ".xlsx")) { ExcelWorksheet worksheet = package.Workbook.Worksheets.Add("Test"); worksheet.Cells[A1].Value = "Test"; package.Save(); } 

笔记:

无论出于何种原因,保存的文件仍然出现损坏,无法恢复。 我目前正在使用Microsoft Office 2010 。 我使用的文件格式是.xltx.xlsx

简答:

EPPlus库不支持从现有的xltx Excel模板创build文件。

改用预格式化的xlsx文件。

长答案:

 Dim excelFile As New FileInfo(filename) Dim reportTemplate As New FileInfo(templatePath) Dim xlFile As ExcelPackage = New ExcelPackage(excelFile, reportTemplate) ' Do Stuff xlFile.Save() 

当使用EPPlus实例化一个新的ExcelPackage对象时,你应该能够提供一个模板作为第二个参数(参见上面的代码片段),但是当提供一个xltx文件时,我一直得到一个与上面的用户相同的损坏的输出文件。 我最终发现,提供一个普通的xlsx文件作为模板,而不是实际的模板文件,似乎工作。

这是一个开源的软件包,所以我决定快速查看源代码。

它看起来像接受“template”参数的ExcelPackage构造函数,调用CreateFromTemplate()方法。 CreateFromTemplate()方法的注释表明,它希望现有的xlsx文件可以用作模板,而不是实际的模板文件。

所以,虽然人们可能会认为'模板'参数是指一个实际的xltx模板文件,但看起来EPPlus并不支持这一点。

面临类似的问题,这只是给我回模板

 public ExcelPackage getSheet(string templatePath){ FileInfo template = new FileInfo(templatePath); ExcelPackage p = new ExcelPackage(template, true); ExcelWorksheet ws = p.Workbook.Worksheets[1]; //position of the worksheet ws.Name = bookName; p.Save(); ExcelPackage pck = new ExcelPackage(new System.IO.MemoryStream(), p.Stream); return pck; 

然后你打电话给这个

 string path = Server.MapPath(@"../../../Ex/template.xlsx") try { OfficeOpenXml.ExcelPackage pck = getSheet(path); Response.Clear(); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.AddHeader("content-disposition", String.Format(System.Globalization.CultureInfo.InvariantCulture, "attachment; filename={0}", fileName + ".xlsx")); Response.BinaryWrite(pck.GetAsByteArray()); Response.End(); } catch { } 

在向其写入数据后,显式closures文件。 我知道,当您在Web请求响应中使用EPPlus时,closures响应会消除此问题。