【質問】
1.Npoiを使用して1行すべての取得ができない。(Npoiの仕様??)
2.別で取得したList<string[]>の値を、リストビューの別の列に表示したい。(追加したい。)
3.エクセルファイルを1度で読み込みたいがエラーになる(先頭に空があるため)
【環境】
C# .netframework4.7 visual studio2022 Windows Form
【仮実装】
・Npoiでエクセルファイルを読み込み、変数に格納し、その後リストビューに表示
・1行がすごく長い列のため、ループ文を使用
【目的】
・エクセルファイル1行ずつ全取得後、使用するところだけ変数や配列に格納したい。(【例】1行取得したらG列目以降を格納または表示)
・検索後、検索した1行の{"文字列,文字列"}のところをリストビューに列に追加して別の1列としてにまとめたい。
【参考】
https://teratail.com/questions/8rmkh3qufecejj
【例】
・1行の列を700用意した所、1行の列の全取得数が695と合わなかった。
・列を500にしたとき、1行の列の全取得が496となってしまっている。
C#初心者学習中。
手厳しくお願い致します。
C#
1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using NPOI.SS.UserModel; 10using System.Windows.Forms; 11 12namespace WindowsFormsApp6 13{ 14 public partial class Form1 : Form 15 { 16 List<string[]> list = new List<string[]>(); 17 List<string[]> reslist = new List<string[]>(); 18 19 20 public Form1() 21 { 22 InitializeComponent(); 23 listView1.Columns.Add("No"); 24 listView1.Columns.Add("在庫場所"); 25 listView1.Columns.Add("取引先"); 26 listView1.Columns.Add("文字列,文字列"); 27 listView1.View = View.Details; 28 29 SetItems(); 30 31 } 32 33 private void SetItems() 34 { 35 36 // エクセルファイルを開く 37 var workbook = WorkbookFactory.Create(@"test.xlsx"); 38 39 // 対象シートを取得 40 var worksheet = workbook.GetSheet("sheet1"); 41 42 var items = new List<ListViewItem>(); 43 44 //7行目、8行目 45 var row1 = worksheet.GetRow(5); 46 var row2 = worksheet.GetRow(6); 47 var row3 = worksheet.GetRow(7); 48 49 // 1行目のセルの数を列数として扱う 50 var cellCount = row1?.Cells.Count ?? 0; 51 52 //左から6列目のセルから最後まで 53 for (var i = 6; i < cellCount; i++) 54 { 55 56 var cells = new[] { row1.GetCell(i), row2.GetCell(i),row3.GetCell(i) }; 57 var values = new string[] { "", "","" }; 58 59 // 1行目と2行目のセルの値を格納 60 for (var j = 0; j < 3; j++) 61 { 62 63 var cell = cells[j]; 64 65 //セルの型に応じたプロパティを参照する 66 switch (cell?.CellType ?? CellType.Unknown) 67 { 68 //セルの型がstringのとき 69 case CellType.String: 70 values[j] = cell.StringCellValue; 71 break; 72 //セルの型が数値のとき 73 case CellType.Numeric: 74 values[j] = Convert.ToString(cell.NumericCellValue); 75 break; 76 default: 77 //空を代入 78 values[j] = ""; 79 break; 80 } 81 82 } 83 84 // リストビューアイテムを作成 85 items.Add(new ListViewItem(values)); 86 } 87 88 // ブックを閉じる 89 workbook.Close(); 90 91 // リストビューをクリアして項目を一括追加 92 listView1.SuspendLayout(); 93 listView1.Items.Clear(); 94 listView1.Items.AddRange(items.ToArray()); 95 listView1.ResumeLayout(); 96 97 } 98 99 private void ExRead1() 100 { 101 //エクセルファイルを開いた 102 IWorkbook workbook = WorkbookFactory.Create(@"test.xlsx"); 103 //index1のシートを参照 104 ISheet worksheet = workbook.GetSheetAt(0); 105 //シートの行をworksheet.LastRowNum; で最終行まで参照 106 int lastRow = worksheet.LastRowNum; 107 //int i = 8 最初の行 から最後の行まで 108 for (int i = 8; i <= lastRow; i++) 109 { 110 //i番目の行を取得 111 IRow row = worksheet.GetRow(i); 112 //回して参照した値を格納 113 List<string> sv = new List<string>(); 114 //セルを0番目から(左から右に)ある数だけ回す。 115 for (int j = 0; j < row.Cells.Count; j++) 116 { 117 ICell cell = row?.GetCell(j); 118 119 //セルの型に応じたプロパティを参照する 120 if (cell == null) 121 { 122 sv.Add(""); 123 } 124 else 125 { 126 switch (cell.CellType) 127 { 128 //セルの型がstringのとき 129 case CellType.String: 130 //List<string>のsvに値を格納 131 sv.Add(cell.StringCellValue); 132 //switch文から抜ける 133 break; 134 //セルの型が数値のとき 135 case CellType.Numeric: 136 //数値をstringに変更し格納 137 sv.Add(Convert.ToString(cell.NumericCellValue)); 138 //switch文から抜ける 139 break; 140 //セルの中身が空 141 case CellType.Blank: 142 //空を代入 143 sv.Add(""); 144 //switch文から抜ける 145 break; 146 //case以外のとき(elseの役割) 147 default: 148 //空を代入 149 sv.Add(""); 150 //switch文から抜ける 151 break; 152 } 153 } 154 } 155 156 //1行のセルをすべて取り終わったあとにstringの値をstring[]に変換し、格納 157 list.Add(sv.ToArray()); 158 } 159 workbook.Close(); 160 } 161 private void Seachitem() 162 { 163 //検索のまわす。 164 foreach (string[] v in list) 165 { 166 //入力された文字とおなじのとき 167 if (textBox1.Text == v[1]) 168 { 169 label1.Text = v[1]; 170 label2.Text = v[2]; 171 reslist.Add(v); 172 } 173 174 } 175 } 176 177 private void button1_Click(object sender, EventArgs e) 178 { 179 ExRead1(); 180 Seachitem(); 181 182 List<string> lnsv = new List<string>(); 183 var lnitems = new List<ListViewItem>(); 184 185 //foreachで回す。 186 int j = 0; 187 foreach (string[] l in reslist) 188 { 189 lnitems.Add(new ListViewItem(l)); 190 for(int i = 0; i < l.Length; i++) 191 { 192 ListViewItem lvi = new ListViewItem(l[i]); 193 listView1.Items.Add(lvi); 194 } 195 196 } 197 198 199 } 200 } 201 202 203} 204

回答1件
あなたの回答
tips
プレビュー