How to write to excel many times using one object of EPPLUS in C#

笑着哭i 提交于 2020-01-14 19:09:30

问题


Refer to some EPPLUS sample code, there are just creating one epplus object for one activity.

ex

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

it means that after activity is finished, object is disposed automatically. and for the next, object will be created again for doing activity again. And i want to create just one EPPLUS object for many times of activity, i want to create one EPPLUS object can be used many times, not using "using" statement.

this is my code

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();
        }

I want to write to excel many times, using just one EPPLUS object, i dont want to create epplus object every time i do an activity. Using my code, i can just write once to excel file, and second writing process is failed. Can i do that?


回答1:


The problem you are having is calling the Save() will automatically close the package so the next time you write to it it will generate an error. EPPlus isnt really meant to do "incremental" saves like that - its more designed to sit on a server, have the client tell it to generate a file all at once, and send it to the client.

I think the best bet would be to keep a copy of it in memory and incrementally write the file. You could do something like this via MemoryStream. So create class-level MemoryStreamvar and use that to hold the work-in-progress Excel Package. This hopefully demonstrates that concept:

[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();

}


来源:https://stackoverflow.com/questions/28007087/how-to-write-to-excel-many-times-using-one-object-of-epplus-in-c-sharp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!