1

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

それでも、質問はまだ開いています...最初の例のコードが機能しなかったのはなぜですか?データのすべての新しい行を宣言する必要がありますか?データベースデータの行がたくさんあるとどうなりますか?

4

1 に答える 1

3

あなたの例ではsheet.GetRow(1)、ワークシートの既存の行を取得する最初の用途です。2 つ目は を使用sheet1.CreateRow(1)して、ワークシートに新しい行を作成します。一度も使用/初期化されていない行は存在せず、 を使用して作成されるまでアクセスできませんCreateRow

これを証明するには、1 行のワークシートを作成し、1 つのセルに値を入力します。を使用GetRow(1)して行を取得してから、GetRow(10)存在しない行で使用を試みることができます。行がまだ作成されていないため、オブジェクトが存在しないことがわかります。

于 2011-06-08T20:10:25.473 に答える