2016-10-23 3 views
1

Я использую Oracle.ManagedDataAccess. Я попытался вывести все значения в XML, и это сработало. Тем не менее, теперь у меня возникает проблема с записью этих значений в файл excel с использованием библиотеки NPOI.NullReferenceException доступ к ячейкам рабочей книги с NPOI

Я написал webservice, который берет данные из базы данных и записывает их в файл excel.

Я получаю ошибку при присвоении значения из таблицы базы данных ячейке 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()); 
+1

Возможный дубликат [Что такое NullReferenceException, и как это исправить?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do- i-fix-it) – mybirthname

+0

@mybirthname Я не вижу там намеков. Можете ли вы уточнить? – TheOneAndOnlyNoobofCSharp

+0

Используйте debug и проверьте, что такое null – mybirthname

ответ

0

Ваш цикл, пока не правильно, я считаю. Это должно быть что-то вроде этого:

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, я не знаю его значения при создании листа excel. Но я могу сказать вам, что для создания листов Excel самый простой способ - использовать библиотеку microsoft.ace.oledb.xx. Это позволяет работать с листом так же, как если бы это была таблица данных. Вы можете использовать Dataset загрузить его из Oracle, а затем сохранить его в Excel, это несколько простых шагов. Или вы можете пойти один за другим с помощью считывателя, а затем использовать обычный синтаксис SQL «Вставить Into ...» в свой лист.

Смежные вопросы