尝试使用NPOI来填写Excel模板时出错

使用NPOI并试图在这里按照教程: http : //www.zachhunter.com/2010/05/npoi-excel-template/ ,我遇到了“对象引用未设置为对象的实例”错误在这一行:

sheet.GetRow(1).GetCell(1).SetCellValue("some test value") 

当试图使用这个代码:

 Imports System.IO Imports System.Web.Security Imports NPOI.HSSF.UserModel Imports NPOI.SS.UserModel Imports NPOI.SS.Util Imports NPOI.HSSF.Util Imports NPOI.POIFS.FileSystem Imports NPOI.HPSF Partial Public Class NPOI_01 Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) End Sub Public Shared Sub ExportDataTableToExcel(ByVal memoryStream As MemoryStream, ByVal fileName As String) Dim response As HttpResponse = HttpContext.Current.Response response.ContentType = "application/vnd.ms-excel" response.AddHeader("Content-Disposition", String.Format("attachment;filename={0}", fileName)) response.Clear() response.BinaryWrite(memoryStream.GetBuffer()) response.[End]() End Sub Protected Sub DownloadReport_Click(ByVal sender As Object, ByVal e As EventArgs) Dim fs As New FileStream(Server.MapPath("spr_files\Book1.xls"), FileMode.Open, FileAccess.Read) Dim templateWorkbook As New HSSFWorkbook(fs, True) Dim sheet As HSSFSheet = templateWorkbook.GetSheet("Sheet1") sheet.GetRow(1).GetCell(1).SetCellValue("some test value") sheet.ForceFormulaRecalculation = True Dim ms As New MemoryStream() templateWorkbook.Write(ms) ExportDataTableToExcel(ms, "MyBook1Report.xls") End Sub End Class 

更新我发现这种格式的作品,如在这篇博客文章中看到的 – http://www.leniel.net/2009/10/npoi-with-excel-table-and-dynamic-chart.html :

  Protected Sub DownloadReport_Click(ByVal sender As Object, ByVal e As EventArgs) Dim fs As New FileStream(Server.MapPath("spr_files\Book1.xls"), FileMode.Open, FileAccess.Read) Dim templateWorkbook As New HSSFWorkbook(fs, True) Dim sheet1 As HSSFSheet = templateWorkbook.GetSheet("Sheet1") Dim row1 As HSSFRow row1 = sheet1.CreateRow(1) row1.CreateCell(1).SetCellValue("some test value") 'sheet1.GetRow(1).CreateCell(1).SetCellValue("some test value") sheet1.ForceFormulaRecalculation = True Dim ms As New MemoryStream() templateWorkbook.Write(ms) ExportDataTableToExcel(ms, "MyBook1Report.xls") End Sub 

但问题仍然是开放的…为什么第一个例子中的代码没有工作? 你是否必须申报每一行新的数据? 当你有很多行数据库数据会发生什么?

在您的示例中,第一个使用“sheet.GetRow(1)”来抓取工作表中的现有行。 第二个使用“sheet1.CreateRow(1)”,它在工作表中创build一个新的行。 从未使用/初始化的行不存在,只有在使用“CreateRow”创build之后才能被访问。

为了certificate这一点,你可以制作一行工作表,并在一个单元格中放入一个值。 您可以使用GetRow(1)获取该行,然后尝试在不存在的行上使用GetRow(10)。 你会得到的对象不存在,因为该行还不能创build。