使用epplus更新现有的工作簿C#

我想添加新的工作表到现有的工作簿,代码运行良好,没有错误,但Excel文件没有得到更新。 这是我的代码

string path = "C:\\TestFileSave\\ABC.xlsx"; FileInfo filePath = new FileInfo(path); if (File.Exists(path)) { using(ExcelPackage p = new ExcelPackage()) { using(stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) { p.Load(stream); ExcelWorksheet ws = p.Workbook.Worksheets.Add(wsName + wsNumber.ToString()); ws.Cells[1, 1].Value = wsName; ws.Cells[1, 1].Style.Fill.PatternType = ExcelFillStyle.Solid; ws.Cells[1, 1].Style.Fill.BackgroundColor.SetColor(Color.FromArgb(184, 204, 228)); ws.Cells[1, 1].Style.Font.Bold = true; p.Save(); } } } 

stream对象不绑定到package 。 唯一的关系是它将你的调用中的字节拷贝到Load之后,它们是分开的。

您甚至不需要使用stream – 更好地让package自行处理,如下所示:

 var fileinfo = new FileInfo(path); if (fileinfo.Exists) { using (ExcelPackage p = new ExcelPackage(fileinfo)) { //using (stream = new FileStream(path, FileMode.Open, FileAccess.ReadWrite)) { //p.Load(stream); ExcelWorksheet ws = p.Workbook.Worksheets.Add(wsName + wsNumber.ToString()); ws.Cells[1, 1].Value = wsName; ws.Cells[1, 1].Style.Fill.PatternType = ExcelFillStyle.Solid; ws.Cells[1, 1].Style.Fill.BackgroundColor.SetColor(Color.FromArgb(184, 204, 228)); ws.Cells[1, 1].Style.Font.Bold = true; p.Save(); } } } 

在这里,我已经显示通过在同一个文件中创build一个新的工作表,将数据写入退出的Excel文件。 要回答你的问题:尝试使用最后两行File.WriteAllBytes而不是p.Save()。

 string strfilepath = "C:\\Users\\m\\Desktop\\Employeedata.xlsx"; using (ExcelPackage p = new ExcelPackage()) { using (FileStream stream = new FileStream(strfilepath, FileMode.Open)) { p.Load(stream); //deleting worksheet if already present in excel file var wk = p.Workbook.Worksheets.SingleOrDefault(x => x.Name == "Hola"); if (wk != null) { p.Workbook.Worksheets.Delete(wk); } p.Workbook.Worksheets.Add("Hola"); p.Workbook.Worksheets.MoveToEnd("Hola"); ExcelWorksheet worksheet = p.Workbook.Worksheets[p.Workbook.Worksheets.Count]; worksheet.InsertRow(5, 2); worksheet.Cells["A9"].LoadFromDataTable(dt1, true); // Inserting values in the 5th row worksheet.Cells["A5"].Value = "12010"; worksheet.Cells["B5"].Value = "Drill"; worksheet.Cells["C5"].Value = 20; worksheet.Cells["D5"].Value = 8; // Inserting values in the 6th row worksheet.Cells["A6"].Value = "12011"; worksheet.Cells["B6"].Value = "Crowbar"; worksheet.Cells["C6"].Value = 7; worksheet.Cells["D6"].Value = 23.48; } //p.Save() ; Byte[] bin = p.GetAsByteArray(); File.WriteAllBytes(@"C:\Users\m\Desktop\Employeedata.xlsx", bin); } 

我最初得到的错误代码是“在写入操作期间发生磁盘错误(使用HRESULT的exception:0x8003001D(STG_E_WRITEFAULT))”,但后来得知这是因为我想修改的现有Excel文件不是完全符合MS-Excel格式。 我在Open office中创build了原始的excel文件作为.xls文件,但是EPPlus无法读取它。 当我在线Excel中重新生成这个原始的Excel文件时,一切正常。