質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

Q&A

解決済

1回答

3660閲覧

C# NPOIを使用時、エクセルファイルの値が空のときのエラーについて

sueteacher

総合スコア48

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework 4.0

Microsoft Windows用のソフトウェア開発環境/実行環境である .NET Frameworkの4番目のメジャーバージョンです。

0グッド

0クリップ

投稿2022/06/13 03:27

編集2022/06/13 03:35

【質問】
・エラー内容(System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。')を解決したい。

【目的】
・エクセルファイルの値が空のとき、string配列の変数に空("")で入れたい。

【原因】
・エクセルファイルの値がか空のため(【例】横1行に対して、1列目:文字、2列目:空白、3列目:文字、4列目:数字)エラーが起こると思われる。

【追記事項】
・仕様のため空白は変更出来ず。

【相談前実装】
・Npoiを使用し、シートを指定、すべての行を読取り変数に格納したいため、for文で1行ずつ、かつセルを1列ずつループで回し、CellTypeでセルの判定をし、変数の格納をする。
・case CellType.Blank:を使用すれば、空の条件ができると思いましたが、エラーが出た。
・途中まで値が入り、空白のあるセルでエラーが発生

【参考サイト】
https://resanaplaza.com/%E3%80%90c%E3%80%91npoi%E3%81%A7excel%E7%B0%A1%E5%8D%98%E6%93%8D%E4%BD%9C%EF%BC%88%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E4%BB%98%E3%81%8D%EF%BC%89/?amp=1#R1C1

https://qiita.com/midori44/items/acab9106e6dad9653e73

【環境】
・C# visual studio2022 .net framework4.7 windows forms

よろしくお願いいたします。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using NPOI.SS.UserModel; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11 12namespace WindowsFormsApp5 13{ 14 public partial class Form1 : Form 15 { 16 List<string[]> foodlists = new List<string[]>(); 17 List<string[]> lnfoodlists = new List<string[]>(); 18 19 public Form1() 20 { 21 InitializeComponent(); 22 //エクセルファイルを開いた 23 IWorkbook workbook = WorkbookFactory.Create(@"エクセルファイルのパス"); 24 //index1のシートを参照 25 ISheet worksheet = workbook.GetSheetAt(0); 26 //シートの行をworksheet.LastRowNum; で最終行まで参照 27 int lastRow = worksheet.LastRowNum; 28 //int i = 0 最初の行 から最後の行まで 29 for (int i = 10; i <= lastRow; i++) 30 { 31 //i番目の行を取得 32 IRow row = worksheet.GetRow(i); 33 //回して参照した値を格納 34 List<string> sv = new List<string>(); 35 //セルを0番目から(左から右に)ある数だけ回す。 36 for (int j = 0; j < row.Cells.Count; j++) 37 { 38 ICell cell = row?.GetCell(j); 39 40 41 //セルの型に応じたプロパティを参照する 42 43 switch (cell.CellType) 44 { 45 //セルの型がstringのとき 46 case CellType.String: 47 //List<string>のsvに値を格納 48 sv.Add(cell.StringCellValue); 49 //switch文から抜ける 50 break; 51 //セルの型が数値のとき 52 case CellType.Numeric: 53 //数値をstringに変更し格納 54 sv.Add(Convert.ToString(cell.NumericCellValue)); 55 //switch文から抜ける 56 break; 57 //セルの中身が空 58 case CellType.Blank: 59 //空を代入 60 sv.Add(""); 61 //switch文から抜ける 62 break; 63 //case以外のとき(elseの役割) 64 default: 65 //空を代入 66 sv.Add(""); 67 //switch文から抜ける 68 break; 69 } 70 } 71 //エクセルファイルを開いた 72 IWorkbook workbook2 = WorkbookFactory.Create(@"エクセルファイルのパス"); 73 //1行のセルをすべて取り終わったあとにstringの値をstring[]に変換し、格納 74 foodlists.Add(sv.ToArray()); 75 //indexのシート2を参照 76 ISheet worksheet2 = workbook2.GetSheetAt(1); 77 //シート2の行をworksheet.LastRowNum; で最終行まで参照 78 int lastRow2 = worksheet2.LastRowNum; 79 //int x = 0 最初の行 から最後の行まで 80 for (int x = 10; x <= lastRow2; x++) 81 { 82 //i番目の行を取得 83 IRow row2 = worksheet2.GetRow(x); 84 //回して参照した値を格納 85 List<string> lnsv = new List<string>(); 86 //セルを0番目から(左から右に)ある数だけ回す。 87 for (int j = 0; j < row2.Cells.Count; j++) 88 { 89 ICell cell = row2?.GetCell(j); 90 91 92 //セルの型に応じたプロパティを参照する 93 94 switch (cell.CellType) //エラー 95 { 96 //セルの型がstringのとき 97 case CellType.String: 98 //List<string>のsvに値を格納 99 lnsv.Add(cell.StringCellValue); 100 //switch文から抜ける 101 break; 102 //セルの型が数値のとき 103 case CellType.Numeric: 104 //数値をstringに変更し格納 105 lnsv.Add(Convert.ToString(cell.NumericCellValue)); 106 //switch文から抜ける 107 break; 108 //セルの中身が空 109 case CellType.Blank: 110 //空を代入 111 lnsv.Add(""); 112 //switch文から抜ける 113 break; 114 //case以外のとき(elseの役割) 115 default: 116 //空を代入 117 lnsv.Add(""); 118 //switch文から抜ける 119 break; 120 } 121 } 122 //1行のセルをすべて取り終わったあとにstringの値をstring[]に変換し、格納 123 lnfoodlists.Add(lnsv.ToArray()); 124 } 125    } 126 127 } 128} 129

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/06/13 04:08

どの行でその例外が出るんでしょうか
sueteacher

2022/06/13 05:37

switch (cell.CellType) の文になります。
episteme

2022/06/13 06:30 編集

その判定に先立って cell が空か否かを判定すればいいように思います。 # cellが空のとき、cell == null であるなら上記判定は簡単。 # System.NullReferenceExceptionがthrowされてるならきっとそう。
guest

回答1

0

自己解決

動きました。ありがとうございます。

C#

1if(cell == null) 2{ 3  lnsv.Add(""); 4 } 5 else 6{ 7switch (cell.CellType) 8{ 9//省略 10} 11}

投稿2022/06/13 10:34

sueteacher

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問