Ошибка при попытке использовать 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
Тем не менее вопрос остается открытым... почему код в первом примере не работал? Вы должны объявлять каждую новую строку данных? Что происходит, когда у вас много строк данных базы данных?
1 ответ
В ваших примерах первый использует "sheet.GetRow(1)", который захватывает существующую строку на листе. Второй использует "sheet1.CreateRow(1)", который создает новую строку на рабочем листе. Строки, которые никогда не использовались / не инициализировались, не существуют и не могут быть доступны, пока они не созданы с использованием "CreateRow".
Чтобы доказать это, вы можете создать лист с 1 строкой и поместить значение в одну ячейку. Вы можете использовать GetRow (1), чтобы получить строку, а затем попытаться использовать GetRow(10) для строки, которая не существует. Вы получите объект не существует, потому что строка еще не может быть создана.