7

我想填充excel文件,所以我使用ExcelPackage:Office Open XML格式。但我有一個錯誤。我的代碼:在創建Excel工作表中創建NullReferenceException

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

我有這樣的錯誤在這裏:xlPackage.Save();

我的錯誤說Object reference not set to an instance of an object.

當我拿出xlPackage.Save();,它的工作原理,並在Excel文件罷了,但它不保存。 爲什麼我會出現這個錯誤?

由於事先..

+0

不支持。我已經嘗試過xlPackage.Workbook.Worksheets [1]。但是它不被支持。 – rockenpeace 2012-08-15 06:53:25

+2

好吧,好像'xlPackage'本身不是null,因爲你之前使用它。因此,請將整個Stack Trace作爲ExcelWorksheet類內部的東西。 – 2012-08-15 06:53:53

+0

那行是'NullReferenceException'中堆棧跟蹤的最低部分嗎? – 2012-08-15 06:54:02

回答

0

捕捉的空引用異常由xlPackage.Save()方法被拋出,和傾倒堆棧跟蹤,這個問題似乎是越來越引起ExcelWorksheet.cs:線561,其對應於這條線源:

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

有趣的是,如果你捕捉到了異常的XLSX文件似乎保存ok呢(至少對我是這樣,可能會有一些意外的行爲,但我不能」生產任何)。

我試着處理異常,看看你的文件是否真的保存。如果這是你要使用大量的庫這可能是值得的ExcelPackage現場提出的問題(我不知道)

編輯:

看來,ExcelPackage庫是很老並沒有維護。我會看看基於ExcelPackage的EPPlus庫。你需要調整一下你的代碼,但沒有什麼重要的。保存工作沒有問題。

http://epplus.codeplex.com/

+0

我無法嘗試,因爲它給出了關於_worksheetXml和NameSpaceManager的錯誤。錯誤表示它們不存在於當前上下文中。 – rockenpeace 2012-08-15 08:44:30

0

我建議尋找到的Microsoft.Office.Interop.Excel引用。我希望有更多的智能,但很容易弄清楚。

我已經用我的設置:

using Excel = Microsoft.Office.Interop.Excel; 

我猜你會希望應用程序是不可見的:

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

我沒有用HttpContext的,但如果它的一個路徑,那麼我建議使用Path類:

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

代碼應該是類似的,以下是如何獲取表單並填充細胞:

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

保存並關閉:

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

的的Microsoft.Office.Interop.Excel參考,如果你還在使用該版本包含在Visual Studio 2012和2010。使用可執行文件的計算機上需要Excel。

祝你好運!

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

到:ExcelWorksheet.cs從

+0

由於他使用的是Open XML格式,因此我不鼓勵他使用interop來支持Open XML SDK,它不需要本地Excel實例,並且在服務器環境中更友好(如果這是個問題): https://msdn.microsoft.com/en-us/library/office/bb448854.aspx – maniak1982 2017-03-27 20:52:51

2

變線562

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

如果工作表沒有被訪問時,呼籲公衆訪問WorksheetXml而不是私有類變量initiallizes它正確。