7

voglio riempire un file excel e quindi utilizzo ExcelPackage: Office Open XML Format. ma ho un errore il mio codice:NullReferenceException nella creazione di un foglio di lavoro 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(); 
} 

ho questo errore qui: xlPackage.Save();

mio errore dice che Object reference not set to an instance of an object.

quando prendo fuori xlPackage.Save();, funziona e compila il file excel ma non salva . perché sto prendendo questo errore?

grazie in anticipo ..

+0

no, non è supportato. ho provato xlPackage.Workbook.Worksheets [1]. Save ma non è supportato. – rockenpeace

+2

Bene, sembra che 'xlPackage' stesso non sia nullo poiché lo si usa in precedenza. Quindi, per favore pubblica l'intera Traccia dello Stack perché è qualcosa di interno nella classe 'ExcelWorksheet'. –

+0

Questa riga è la parte più bassa della traccia dello stack in 'NullReferenceException'? –

risposta

0

Catching eccezione riferimento null gettati dal xlPackage.Save() metodo, e il dumping la traccia dello stack, il problema sembra essere sempre causati da ExcelWorksheet.cs: la linea 561, che corrisponde alla retta nella fonte:

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

è interessante notare che, se si cattura l'eccezione dei file XLSX sembra per salvare ok comunque (almeno per me lo fa, ci potrebbe essere qualche comportamento imprevisto, ma non potevo' ne produce nessuno).

Vorrei provare a gestire l'eccezione e vedere se il file sta effettivamente salvando. Potrebbe valere la pena sollevare un problema sul sito ExcelPackage se questa è una libreria che stai andando a utilizzare un sacco (non)

EDIT:

Sembra che la biblioteca ExcelPackage è abbastanza vecchio e non mantenuto. Darei un'occhiata alla libreria EPPlus, che è basata su ExcelPackage. Dovrai modificare un po 'del tuo codice ma niente di importante. Salvataggio funziona senza problemi.

http://epplus.codeplex.com/

+0

non ho potuto provare perché dà un errore su _worksheetXml e NameSpaceManager. l'errore dice che non esistono nel contesto attuale. – rockenpeace

0

io consiglierei di guardare in riferimento Microsoft.Office.Interop.Excel. Vorrei che ci fosse più intelligenza, ma è abbastanza facile da capire.

ho impostato il mio usando come:

using Excel = Microsoft.Office.Interop.Excel; 

Sto indovinando si vorrà l'applicazione per essere invisibile:

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

non ho usato HttpContext, ma se è un percorso, quindi consiglierei di usare la classe Path:

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

Il codice dovrebbe essere simile, ecco come afferrare un foglio e riempirlo cellule:

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

di risparmio e di chiusura:

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

Il riferimento Microsoft.Office.Interop.Excel è incluso in Visual Studio 2012, e nel 2010 se si sta ancora utilizzando quella versione. Excel è richiesto sulla macchina con l'eseguibile.

Buona fortuna!

+0

Dal momento che sta usando il formato Open XML, vorrei scoraggiarlo dall'usare l'interoperabilità a favore dell'SDK Open XML, che non richiede un'istanza locale di Excel e sarebbe più amichevole in un ambiente server (nel caso si tratti di un problema): https://msdn.microsoft.com/en-us/library/office/bb448854.aspx – maniak1982

2

cambiare linea 562 di ExcelWorksheet.cs da:

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

a:

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

Se il foglio di lavoro non è stata letta, chiamando la funzione di accesso pubblico WorksheetXml anziché la variabile di classe privata initiallizes esso correttamente.

Problemi correlati