如何在C#中使用EPPLUS的一个对象多次写入excel

请参阅一些EPPLUS示例代码,只为一个活动创建一个epplus对象。

using (ExcelPackage package = new ExcelPackage(newFile)) {... // activity } 

这意味着活动结束后,对象会自动处理。 并且对于下一个,将再次创建对象以再次进行活动。 而且我想为多次活动创建一个EPPLUS对象,我想创建一个EPPLUS对象可以多次使用,而不是使用“using”语句。

这是我的代码

 public partial class FMain : Form { ... ExcelPackage pack; FileInfo InfoPathFile; public StringPathFile = "" ... public FMain() { ... } private void NewDialog_FileOk(object sender, CancelEventArgs e) { if(pack != null) pack.Dispose(); StringPathFile = NewDialog.FileName; InfoPathFile = new FileInfo(StringPathFile); pack = new ExcelPackage(InfoPathFile); ... } private void SaveData(float[] Sens, string tt, string dd) { var ExSheet = pack.Workbook.Worksheets["Data"]; ExSheet.Cells["A" + rowExcel].Value = Numb; ExSheet.Cells["B" + rowExcel].Value = Sens[0]; ExSheet.Cells["C" + rowExcel].Value = Sens[1]; ExSheet.Cells["D" + rowExcel].Value = Sens[2]; ExSheet.Cells["E" + rowExcel].Value = Sens[3]; ExSheet.Cells["F" + rowExcel].Value = tt; ExSheet.Cells["G" + rowExcel].Value = dd; //pack.SaveAs(InfoPathFile); pack.Save(); } 

我想写excel很多次,只使用一个EPPLUS对象,我不想每次做活动时都创建epplus对象。 使用我的代码,我可以只写一次excel文件,第二次写入过程失败。 我能这样做吗?

你遇到的问题是调用Save()会自动关闭包,所以下次你写它时会产生错误。 EPPlus并不是真的意味着要进行“增量”保存 – 它更适合设置在服务器上,让客户端告诉它一次生成一个文件,并将其发送到客户端。

我认为最好的办法是将它的副本保存在内存中并逐步写入文件。 你可以通过MemoryStream做这样的事情。 因此,创建类级别的MemoryStream var并使用它来保存正在进行中的Excel包。 这有希望certificate这个概念:

 [TestMethod] public void Multi_Save_Test() { //http://stackoverflow.com/questions/28007087/how-to-write-to-excel-many-times-using-one-object-of-epplus-in-c-sharp var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); if (existingFile.Exists) existingFile.Delete(); //Use memstream and create the package but WITHOUT the FI so it is a memory stream as well //Avoid using and call manual dispose var holdingstream = new MemoryStream(); var pack = new ExcelPackage(); var ExSheet = pack.Workbook.Worksheets.Add("Data"); ExSheet.Cells["A1"].Value = "wer"; ExSheet.Cells["B1"].Value = "sdf"; //Do an incremental save to the file and copy the stream before closing - ORDER COUNTS! pack.SaveAs(existingFile); holdingstream.SetLength(0); pack.Stream.Position = 0; pack.Stream.CopyTo(holdingstream); //********************************************************* //reopen the holding stream, make a change, and resave it pack.Load(holdingstream); ExSheet = pack.Workbook.Worksheets["Data"]; ExSheet.Cells["A2"].Value = "wer"; ExSheet.Cells["B2"].Value = "sdf"; //Another incremental change pack.SaveAs(existingFile); holdingstream.SetLength(0); pack.Stream.Position = 0; pack.Stream.CopyTo(holdingstream); //********************************************************* //reopen the holding stream, make a change, and resave it pack.Load(holdingstream); ExSheet = pack.Workbook.Worksheets["Data"]; ExSheet.Cells["A3"].Value = "wer"; ExSheet.Cells["B3"].Value = "sdf"; //Another incremental change pack.SaveAs(existingFile); holdingstream.SetLength(0); pack.Stream.Position = 0; pack.Stream.CopyTo(holdingstream); //********************************************************* //reopen the holding stream, make a change, and do a FINAL save pack.Load(holdingstream); ExSheet = pack.Workbook.Worksheets["Data"]; ExSheet.Cells["A4"].Value = "wer"; ExSheet.Cells["B4"].Value = "sdf"; //All done so only need to save it to the file pack.SaveAs(existingFile); //cleanup pack.Dispose(); holdingstream.Dispose(); }