7

Chcę wypełnić plik Excela, a więc używam pakietu ExcelPackage: Office Open XML Format. ale mam błąd. mój kod:Wyjątek NullReferenceException w tworzeniu arkusza programu 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(); 
} 

mam ten błąd tu: xlPackage.Save();

mój błąd mówi, że Object reference not set to an instance of an object.

kiedy wyjąć xlPackage.Save();, to działa i wypełnia w pliku excel, ale nie zapisać . dlaczego biorę ten błąd?

góry dzięki ..

+0

nie jest obsługiwany. Próbowałem xlPackage.Workbook.Worksheets [1] .Zapisz, ale nie jest obsługiwane. – rockenpeace

+2

Wygląda na to, że '' xlPackage' nie jest pusty, ponieważ używasz go wcześniej. Dlatego prosimy o opublikowanie całego śledzenia stosu, ponieważ jest to coś wewnętrznego w klasie "ExcelWorksheet". –

+0

Czy ta linia jest najniższą częścią śladu stosu w 'NullReferenceException'? –

Odpowiedz

0

łapania wyjątku null odniesienia wyrzucane przez xlPackage.Save() metoda, a dumping ślad stosu, problem wydaje się być coraz spowodowane ExcelWorksheet.cs: linia 561, która odpowiada tej linii w źródle:

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

co ciekawe, jeśli złapiesz wyjątkiem plików xlsx wydaje się zaoszczędzić ok mimo to (przynajmniej dla mnie robi, nie mogą być pewne nieoczekiwane zachowanie, ale nie mogłem” t wytwarzają dowolne).

Spróbowałbym obsłużyć wyjątek i zobaczyć, czy plik faktycznie się zapisuje. Może warto podniesienie problemu na miejscu ExcelPackage jeśli jest to biblioteka masz zamiar używać dużo (nie)

EDIT:

Wydaje się, że biblioteka ExcelPackage jest dość stary i nie utrzymane. Chciałbym rzucić okiem na bibliotekę EPPlus, która jest oparta na pakiecie ExcelPackage. Będziesz musiał poprawić nieco swój kod, ale nic poważniejszego. Oszczędzanie działa bez problemu.

http://epplus.codeplex.com/

+0

, którego nie można wypróbować, ponieważ powoduje błąd dotyczący _worksheetXml i NameSpaceManager. błąd mówi, że nie istnieją one w bieżącym kontekście. – rockenpeace

0

polecam patrząc w odniesieniu Microsoft.Office.Interop.Excel. Chciałbym, żeby było więcej intellisense, ale dość łatwo to rozgryźć.

mam ustawić mój stosując jako:

using Excel = Microsoft.Office.Interop.Excel; 

Zgaduję będziemy chcieli aplikacja będzie niewidoczny:

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

ja nie używałem HttpContext, ale jeśli jest to ścieżkę, następnie radzę użyć klasy Ścieżka:

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

Kod powinien być podobny, oto jak pobrać arkusz i wypełnić Komórki:

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

Zapisywanie i zamykanie:

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

Odniesienie Microsoft.Office.Interop.Excel jest wliczone w Visual Studio 2012 i 2010, jeśli nadal używasz tej wersji. Excel jest wymagany na komputerze z plikiem wykonywalnym.

Powodzenia!

+0

Ponieważ używa formatu Open XML, zniechęciłbym go do korzystania z interopu na rzecz Open XML SDK, który nie wymaga lokalnego wystąpienia programu Excel i byłby przyjaźniejszy w środowisku serwera (w przypadku, gdy jest to problem): https://msdn.microsoft.com/en-us/library/office/bb448854.aspx – maniak1982

2

Linia zmiana 562 z ExcelWorksheet.cs od:

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

do:

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

Jeżeli arkusz nie został uzyskać, dzwoniąc na akcesor publicznego WorksheetXml zamiast zmienna prywatna klasa initiallizes go prawidłowo.

Powiązane problemy