【问题标题】:error attempting to use NPOI to fill excel template尝试使用 NPOI 填充 Excel 模板时出错
【发布时间】:2011-06-07 00:25:04
【问题描述】:

使用 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).GetCell(1) 会给您Object reference not set to an instance of an object

标签: asp.net vb.net excel npoi


【解决方案1】:

在您的示例中,第一个使用 sheet.GetRow(1) 来获取工作表中的现有行。第二个使用sheet1.CreateRow(1),它在工作表中创建一个新行。从未使用/初始化过的行不存在并且在使用CreateRow 创建之前无法访问。

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

【讨论】:

  • 我一定还是遗漏了一些东西,因为我看不出您帖子zachhunter.com/2010/05/npoi-excel-template 中的代码与第一个示例有何不同;即,不使用“CreateRow”。
  • 我在示例中填写的模板包含一个完整的 XLS 文档,然后我使用 NPOI 将数据插入到现有单元格中。我不确定您使用什么作为模板,但如果您尝试将数据插入到不存在的行/单元格中,您将收到您描述的对象错误。通过更改为 CreateRow(),您告诉 NPOI 创建一个不存在的新行。
  • 谢谢,现在看起来更清楚了。本质上,如果我在要插入新值的所有 .xls 模板工作表单元格中都有默认值,那么我可以使用“Get..”语法。否则,需要“创建...”语法。
  • 感谢您写了这么多 NPOI 文章。请让他们继续前进!
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 2017-05-25
  • 1970-01-01
相关资源
最近更新 更多