2015-12-06 4 views
1

Я пытаюсь добавить новый рабочий лист в существующую книгу, код работает нормально без ошибок, но файл excel не получает обновления. Вот мой кодОбновление существующей книги с использованием epplus C#

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

ответ

9

Объект 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(); 
     } 

    } 

} 
4

Здесь я показал записи данных в, выходящем файл первенствовать путем создания нового листа в том же файле. Чтобы ответить на ваш вопрос: попробуйте использовать последние две строки 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); 
} 
+1

Пожалуйста, добавьте текст, объясняющий ваш ответ. Не просто вставляйте код. –

0

Первоначально я получил код ошибки «Произошла ошибка диска во время операции записи (Исключение из HRESULT: 0x8003001D (STG_E_WRITEFAULT)).» С помощью этого, но потом узнал, что это произошло потому, что существующий файл Excel, который Я хотел изменить не полностью совместимый формат MS-Excel. Я создал оригинальный файл excel в Open office в виде файла .xls, но EPPlus не смог его прочитать. Когда я восстановил этот оригинальный файл excel в Online Excel, все работало нормально.