NullReferenceException 使用 NPOI 访问工作簿单元格
NullReferenceException accessing Workbook Cells with NPOI
我正在使用 Oracle.ManagedDataAccess。我尝试将所有值输出到 XML 并且成功了。但是,我现在在使用 NPOI 库将这些值写入 excel 文件时遇到问题。
我编写了从数据库获取数据并将其写入 excel 文件的网络服务。
从数据库 table 向 Excel 单元格分配值时出现错误。
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.IO;
using System.Data;
using System.Configuration;
using System.Configuration.Assemblies;
using Oracle.ManagedDataAccess;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
using NPOI;
using NPOI.XSSF.UserModel;
namespace Example
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WebService2 : System.Web.Services.WebService
{
[WebMethod]
public string dictToExcel(string dict_name)
{
string connectionString = ConfigurationManager.ConnectionStrings["OracleConnection"].ConnectionString;
OracleConnection connection = new OracleConnection(connectionString);
connection.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = connection;
cmd.CommandText = "SELECT * from TB_EXAMPLE";
cmd.CommandType = CommandType.Text;
OracleDataReader dataReader = cmd.ExecuteReader();
using (FileStream stream = new FileStream(@"filepath\new.xlsx", FileMode.Create, FileAccess.Write))
{
XSSFWorkbook wb;
XSSFSheet sh;
wb = new XSSFWorkbook();
sh = (XSSFSheet)wb.CreateSheet("Report1");
while (dataReader.Read())
{
for (int i = 0; i < 2; i++)
{
var r = sh.CreateRow(i);
for (int j = 0; j < 2; j++)
{
wb.GetSheet("Report1").GetRow(i).GetCell(j).SetCellValue(dataReader.GetValue(j).ToString());
}
}
wb.Write(stream);
}
}
return "Done!";
connection.Close();
}
}
}
我收到这个错误:
System.NullReferenceException: Object reference not set to an instance of an object.
关于这部分代码:
wb.GetSheet("Report1").GetRow(i).GetCell(j).SetCellValue(dataReader.GetValue(j).ToString());
我认为你的 while 循环不正确。它应该是这样的:
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sh = (XSSFSheet)wb.CreateSheet("Report1");
var rowIdex = 0;
while (dataReader.Read())
{
var row = sh.CreateRow(rowIdex);
for (int colIndex = 0; colIndex < dataReader.FieldCount; colIndex++)
{
row.CreateCell(colIndex).
SetCellValue(dataReader[colIndex].ToString());
}
rowIdex++;
}
2 件事:
我不熟悉 NPOI.XSSF
库,可能不完全正确。我用这个作为参考 - https://www.tutorialspoint.com/apache_poi/apache_poi_cells.htm
再次,因为我不了解NPOI.XSSF
,所以不知道它在创造excelsheet方面的价值。但我可以告诉你,要创建 Excel sheet,我知道最简单的方法是使用 microsoft.ace.oledb.xx
库。它允许使用 sheet 就像它是数据 table 一样。您可以使用 Dataset
从 Oracle 加载它,然后将其保存到 Excel 几个简单的步骤。或者您可以使用 reader 一个一个地进行,然后使用常规 SQL 语法 "Insert Into..." 进入您的 sheet。
我正在使用 Oracle.ManagedDataAccess。我尝试将所有值输出到 XML 并且成功了。但是,我现在在使用 NPOI 库将这些值写入 excel 文件时遇到问题。
我编写了从数据库获取数据并将其写入 excel 文件的网络服务。
从数据库 table 向 Excel 单元格分配值时出现错误。
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.IO;
using System.Data;
using System.Configuration;
using System.Configuration.Assemblies;
using Oracle.ManagedDataAccess;
using Oracle.ManagedDataAccess.Client;
using Oracle.ManagedDataAccess.Types;
using NPOI;
using NPOI.XSSF.UserModel;
namespace Example
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WebService2 : System.Web.Services.WebService
{
[WebMethod]
public string dictToExcel(string dict_name)
{
string connectionString = ConfigurationManager.ConnectionStrings["OracleConnection"].ConnectionString;
OracleConnection connection = new OracleConnection(connectionString);
connection.Open();
OracleCommand cmd = new OracleCommand();
cmd.Connection = connection;
cmd.CommandText = "SELECT * from TB_EXAMPLE";
cmd.CommandType = CommandType.Text;
OracleDataReader dataReader = cmd.ExecuteReader();
using (FileStream stream = new FileStream(@"filepath\new.xlsx", FileMode.Create, FileAccess.Write))
{
XSSFWorkbook wb;
XSSFSheet sh;
wb = new XSSFWorkbook();
sh = (XSSFSheet)wb.CreateSheet("Report1");
while (dataReader.Read())
{
for (int i = 0; i < 2; i++)
{
var r = sh.CreateRow(i);
for (int j = 0; j < 2; j++)
{
wb.GetSheet("Report1").GetRow(i).GetCell(j).SetCellValue(dataReader.GetValue(j).ToString());
}
}
wb.Write(stream);
}
}
return "Done!";
connection.Close();
}
}
}
我收到这个错误:
System.NullReferenceException: Object reference not set to an instance of an object.
关于这部分代码:
wb.GetSheet("Report1").GetRow(i).GetCell(j).SetCellValue(dataReader.GetValue(j).ToString());
我认为你的 while 循环不正确。它应该是这样的:
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sh = (XSSFSheet)wb.CreateSheet("Report1");
var rowIdex = 0;
while (dataReader.Read())
{
var row = sh.CreateRow(rowIdex);
for (int colIndex = 0; colIndex < dataReader.FieldCount; colIndex++)
{
row.CreateCell(colIndex).
SetCellValue(dataReader[colIndex].ToString());
}
rowIdex++;
}
2 件事:
我不熟悉
NPOI.XSSF
库,可能不完全正确。我用这个作为参考 - https://www.tutorialspoint.com/apache_poi/apache_poi_cells.htm再次,因为我不了解
NPOI.XSSF
,所以不知道它在创造excelsheet方面的价值。但我可以告诉你,要创建 Excel sheet,我知道最简单的方法是使用microsoft.ace.oledb.xx
库。它允许使用 sheet 就像它是数据 table 一样。您可以使用Dataset
从 Oracle 加载它,然后将其保存到 Excel 几个简单的步骤。或者您可以使用 reader 一个一个地进行,然后使用常规 SQL 语法 "Insert Into..." 进入您的 sheet。