#スレッドでExcell読み込み(NPOI,GetCellでエラー、一回目は〇)
前提・実現したいこと
・前提
ボタンを二つ用意して、それぞれでエクセルの値を読み込むREAD関数を実行しています。
一方はREAD関数をスレッドで実行しています。もう一方はREAD関数をそのまま(Nomal)実行をしています。
読み込むExcellファイルにはA行A列目に数値1のみが格納されています。
NuGetパッケージからNPOIをインストールしています。
・実現したいこと
NPOIを利用してExcellのデータ読み込みをスレッド実行で行います。
一度目は問題はなく値が読み取られています。
しかし、二度目の実行にてエラーメッセージが表示さるので改善したいです。
発生している問題・エラーメッセージ
ソースコードの中央部の
string Name = row.GetCell(0).DateCellValue.ToString();//列指定読み込み
にて以下のエラーメッセージが表示されます。
System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。'
該当のソースコード
C#
1using System; 2using System.Windows; 3using NPOI.SS.UserModel; 4using System.IO; 5using System.Threading; 6 7namespace NPOI 8{ 9 /// <summary> 10 /// MainWindow.xaml の相互作用ロジック 11 /// </summary> 12 public partial class MainWindow : Window 13 { 14 public MainWindow() 15 { 16 InitializeComponent(); 17 } 18 19 /// <summary> 20 /// Thread実行 21 /// </summary> 22 /// <param name="sender"></param> 23 /// <param name="e"></param> 24 private void Button_Click_1(object sender, RoutedEventArgs e) 25 { 26 Thread TRead = new Thread(() => Read()); 27 TRead.Start(); 28 29 } 30 31 /// <summary> 32 /// Normal実行 33 /// </summary> 34 /// <param name="sender"></param> 35 /// <param name="e"></param> 36 private void Button_Click(object sender, RoutedEventArgs e) 37 { 38 Read(); 39 } 40 41 /// <summary> 42 /// 指定したExcellのファイルを展開し値を読み込むREAD関数 43 /// </summary> 44 private void Read() 45 { 46 //ファイルパス 47 string filiPass = @"D:\ProgramFiles\Visual Studio2019\Sample\NPOI\sample.xlsx"; 48 49 //Excellファイルの展開 50 FileStream fs = null;// ファイル取得用 51 IWorkbook readBook = null;// ブック格納用 52 53 try 54 { 55 using (fs = File.OpenRead(filiPass))// 読込用Excelファイルの読込 56 { 57 readBook = WorkbookFactory.Create(fs); 58 } 59 ISheet readSheet = readBook.GetSheetAt(0); // ワークシートの取得( 1番目のシート) 60 61 //データの読み込み 62 IRow row = readSheet.GetRow(0); // 行データ取得) 63 string Name = row.GetCell(0).DateCellValue.ToString();//列指定読み込み ⚠エラー発生個所 64 65 //ブックのリソース開放 66 readBook.Close(); 67 68 //読み込んだ値の表示 69 MessageBox.Show(Name); 70 } 71 catch 72 { 73 MessageBox.Show("EROOR"); 74 } 75 } 76 } 77}
試したこと
一回目のスレッド終了後、二回目のスレッド実行をするとエラーメッセージが発生します。
ノーマル実行でREAD関数を呼び出した場合は、何度呼び出しても問題ありません。
一回目をノーマル実行し、二回目をスレッド実行にした場合も同様のエラーメッセージが表示さます。
補足情報(FW/ツールのバージョンなど)
エラー箇所の一行上にある
IROW のrow のCellsのプロパティには
一回目も二回目も[0]={1}
が格納されています
回答1件
あなたの回答
tips
プレビュー