.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响应会消除此问题。