如何在 C# 中使用 EPPLUS 的一个对象多次写入 excel
How to write to excel many times using one object of EPPLUS in C#
参考一些EPPLUS示例代码,只是为一个activity创建一个epplus对象。
前
using (ExcelPackage package = new ExcelPackage(newFile))
{...
// activity
}
表示activity完成后,对象自动销毁。
接下来,将再次创建对象以再次执行 activity。
而我想只创建一个EPPLUS对象多次activity,我想创建一个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 对象,我不想每次执行 activity 时都创建 epplus 对象。使用我的代码,我只能写入一次 excel 文件,第二次写入过程失败。
我可以这样做吗?
您遇到的问题是调用 Save()
会自动关闭包,因此您下次写入时会产生错误。 EPPlus 并不是真的要 "incremental" 那样保存 - 它更适合放在服务器上,让客户端告诉它一次生成一个文件,然后将其发送给客户端。
我认为最好的办法是在内存中保留一份副本并逐步写入文件。你可以通过 MemoryStream
做这样的事情。因此,创建 class-level MemoryStream
var 并使用它来保存正在进行的工作 Excel 包。这有望证明这一概念:
[TestMethod]
public void Multi_Save_Test()
{
//
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();
}
参考一些EPPLUS示例代码,只是为一个activity创建一个epplus对象。
前
using (ExcelPackage package = new ExcelPackage(newFile))
{...
// activity
}
表示activity完成后,对象自动销毁。 接下来,将再次创建对象以再次执行 activity。 而我想只创建一个EPPLUS对象多次activity,我想创建一个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 对象,我不想每次执行 activity 时都创建 epplus 对象。使用我的代码,我只能写入一次 excel 文件,第二次写入过程失败。 我可以这样做吗?
您遇到的问题是调用 Save()
会自动关闭包,因此您下次写入时会产生错误。 EPPlus 并不是真的要 "incremental" 那样保存 - 它更适合放在服务器上,让客户端告诉它一次生成一个文件,然后将其发送给客户端。
我认为最好的办法是在内存中保留一份副本并逐步写入文件。你可以通过 MemoryStream
做这样的事情。因此,创建 class-level MemoryStream
var 并使用它来保存正在进行的工作 Excel 包。这有望证明这一概念:
[TestMethod]
public void Multi_Save_Test()
{
//
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();
}