【質問】
・エラー内容(System.NullReferenceException: 'オブジェクト参照がオブジェクト インスタンスに設定されていません。')を解決したい。
【目的】
・エクセルファイルの値が空のとき、string配列の変数に空("")で入れたい。
【原因】
・エクセルファイルの値がか空のため(【例】横1行に対して、1列目:文字、2列目:空白、3列目:文字、4列目:数字)エラーが起こると思われる。
【追記事項】
・仕様のため空白は変更出来ず。
【相談前実装】
・Npoiを使用し、シートを指定、すべての行を読取り変数に格納したいため、for文で1行ずつ、かつセルを1列ずつループで回し、CellTypeでセルの判定をし、変数の格納をする。
・case CellType.Blank:を使用すれば、空の条件ができると思いましたが、エラーが出た。
・途中まで値が入り、空白のあるセルでエラーが発生
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
回答1件
あなたの回答
tips
プレビュー