7

quiero llenar un archivo de Excel y entonces uso ExcelPackage: Office Open XML Format. pero tengo un error mi código:NullReferenceException al crear la hoja de cálculo de Excel

string fileName = "DBE_BAKIM_FORMU" + ".xlsx"; 
FileInfo fi = new FileInfo(HttpContext.Current.Server.MapPath("~/") + fileName); 

using (ExcelPackage xlPackage = new ExcelPackage(fi)) 
{ 
    ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1]; 
    dbeDataContext db = new dbeDataContext(); 
    CAGRI c = (from x in db.CAGRIs where x.CagriID == ID select x).SingleOrDefault(); 
    USER u = (from x in db.USERs where x.UserID == Convert.ToInt32(Session["user"]) select x).SingleOrDefault(); 

    worksheet.Cell(6, 3).Value = c.TalepTarihi.ToShortDateString(); 
    worksheet.Cell(7, 3).Value = c.TalepTuru; 
    worksheet.Cell(8, 3).Value = c.ModulAdi; 
    worksheet.Cell(9, 3).Value = c.EkranRaporAdi; 
    worksheet.Cell(10, 3).Value = c.VerilenSure; 
    worksheet.Cell(11, 4).Value = c.USER.UserName + " " + c.USER.UserSurname; 
    worksheet.Cell(12, 4).Value = Convert.ToString(c.USER.UserTel); 
    worksheet.Cell(13, 3).Value = c.Aciklama; 
    worksheet.Cell(16, 4).Value = u.UserName + " " + u.UserSurname; 
    worksheet.Cell(18, 3).Value = Convert.ToString(c.DegerlendirmeTarih); 
    worksheet.Cell(19, 3).Value = c.Degerlendirme; 
    xlPackage.Save(); 
} 

tengo este error aquí: xlPackage.Save();

mi error dice que Object reference not set to an instance of an object.

cuando tomo a cabo xlPackage.Save();, funciona y se llena en el archivo de Excel pero no salva . ¿Por qué estoy tomando este error?

gracias de antemano ..

+0

no, no es compatible. He intentado xlPackage.Workbook.Worksheets [1] .Guardar pero no es compatible. – rockenpeace

+2

Bueno, parece que 'xlPackage' en sí mismo no es nulo porque lo usaste antes. Así que publique todo el Stack Trace, ya que es algo interno en la clase 'ExcelWorksheet'. –

+0

¿Es esa línea la parte más baja del seguimiento de pila en 'NullReferenceException'? –

Respuesta

0

agarrar la excepción de referencia nula que son lanzadas por el método xlPackage.Save(), y el vertido del seguimiento de la pila, el problema parece estar causada por ExcelWorksheet.cs: la línea 561, que corresponde a esta línea en la fuente:

XmlNode pageSetup = _worksheetXml.SelectSingleNode("//d:pageSetup", NameSpaceManager); 

Curiosamente, si se captura la excepción de los archivos xlsx parece guardar bien de todos modos (al menos para mí lo hace, podría haber algún comportamiento inesperado, pero no pude t produce alguno).

Me gustaría tratar de manejar la excepción y ver si el archivo está realmente guardando. Podría valer la pena plantear una cuestión en el sitio ExcelPackage si esto es una biblioteca que va a utilizar una gran cantidad (yo no)

EDIT:

Parece que la biblioteca ExcelPackage es bastante antiguo y no mantenido. Echaré un vistazo a la biblioteca EPPlus, que está basada en ExcelPackage. Tendrás que modificar un poco tu código pero nada importante. El ahorro funciona sin problemas.

http://epplus.codeplex.com/

+0

que no pude probar porque arroja un error sobre _worksheetXml y NameSpaceManager. el error dice que no existen en el contexto actual. – rockenpeace

0

que recomiendo mirar en la referencia Microsoft.Office.Interop.Excel. Ojalá hubiera más intellisense, pero es bastante fácil de entender.

He puesto mi usando como:

using Excel = Microsoft.Office.Interop.Excel; 

supongo que querrá que la aplicación sea invisible:

Excel.Application application = new Excel.Application(); 
application.Visible = false; 

No he utilizado HttpContext, pero si es un camino, entonces yo le aconsejaría utilizando la clase Path:

string filename = "DBE_BAKIM_FORMU.xlsx"; 
Excel.Workbook book = application.Workbooks.Open(Path.Combine(HttpContext.Current.Server.MapPath("~/"), filename)); 

el código debería ser similar, aquí es cómo agarrar una hoja y llenar células:

Excel.Worksheet sheet = book.Worksheets[1]; 
sheet.Cells[6, 3].Value2 = "Something"; 

de guardar y cerrar:

book.Save(); 
book.Close(); 

La referencia Microsoft.Office.Interop.Excel se incluye en Visual Studio 2012 y 2010, si usted todavía está utilizando esa versión. Se requiere Excel en la máquina con el ejecutable.

¡La mejor de las suertes!

+0

Dado que está usando el formato Open XML, lo desalentaría de usar interoperabilidad a favor del Open XML SDK, que no requiere una instancia local de Excel y sería más amigable en un entorno de servidor (en caso de que sea un problema): https://msdn.microsoft.com/en-us/library/office/bb448854.aspx – maniak1982

2

cambiar la línea 562 de ExcelWorksheet.cs de:

XmlNode pageSetup = _worksheetXml.SelectSingleNode("//d:pageSetup", NameSpaceManager); 

a:

XmlNode pageSetup = WorksheetXml.SelectSingleNode("//d:pageSetup", NameSpaceManager); 

Si no se ha accedido a la hoja de trabajo, llamando el descriptor de acceso público WorksheetXml en lugar de la variable de clase privada que initiallizes correctamente.

Cuestiones relacionadas