【環境】
visual studio2022 C# .net framework 4.7 WindowsForms
【質問】
・複数行書かれているエクセルファイルから、dataGridViewを使用してカラムとレコードを指定するにはどの様にプログラムを書けばいいのか知りたい。
【目的】
・エクセルファイルの1行をカラムに指定し、かつ表示開始位置も指定。かつ表示開始から以降の記述をすべての表示をしたい。
【例】
・エクセルファイルのA9の1行記述がある分すべてをカラムに指定、A11の1行を表示開始位置とし、以降はループ文で1行ずつ表示
【今回の特徴】
・エクセルファイルを読み込むために「Microsoft.Office.Interop.Excel」をしようしている?
【相談前実装】
エクセルファイルを読み込みジャグ配列?に格納し、ループ文で1行ずつ表示するした。
・11行目から表示できるようになったが、カラムの変更の加えようとするとエラー、変数と配列の理解が乏しいため。
//int rowIndex = 10;にすることによって11行目から表示できるようになった。
for (int rowIndex = 10; rowIndex < jagUsedRange.Length; rowIndex++)
{
dt.Rows.Add(jagUsedRange[rowIndex]);
}
【参考記事】
https://qiita.com/ANNEX_IBS/items/6d2dec748d0cf26dca48
https://qiita.com/midori44/items/acab9106e6dad9653e73
■Form1.デザイン
DataGridView1
■Form1.cs
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 System.IO; 10using ClosedXML.Excel; 11using System.Runtime.InteropServices; 12using Microsoft.Office.Interop.Excel; 13using System.Windows.Forms; 14using DataTable = System.Data.DataTable; 15 16namespace WindowsFormsApp4 17{ 18 public partial class Form1 : Form 19 { 20 public Form1() 21 { 22 InitializeComponent(); 23 } 24 25 private void Form1_Load(object sender, EventArgs e) 26 { 27 object[][] jagUsedRange = null; 28 29 using (var excel = new ExcelManager()) 30 { 31 excel.Open(@"..\..\source\repos\WindowsFormsApp4\WindowsFormsApp4\bin\Debug\output\workList.xlsx"); 32 object[,] twoDimUsedRange = excel.GetUsedRange(); 33 jagUsedRange = ToJaggedArray(twoDimUsedRange); 34 } 35 36 var dt = new DataTable(); 37 for (int colIndex = 0; colIndex < jagUsedRange[0].Length; colIndex++) 38 { 39 dt.Columns.Add(); 40 } 41 42 //int rowIndex = 10;にすることによって11行目から表示できるようになった。 43 for (int rowIndex = 10; rowIndex < jagUsedRange.Length; rowIndex++) 44 { 45 dt.Rows.Add(jagUsedRange[rowIndex]); 46 } 47 48 dataGridView1.DataSource = dt; 49 } 50 /// <summary> 51 /// 二次元配列をジャグ配列に変換 52 /// </summary> 53 /// <param name="sender"></param> 54 /// <param name="e"></param> 55 /// <remarks>ExcelのRangeは、(1,1)始まりなので、(+1,+1)オフセットして取得</remarks> 56 public T[][] ToJaggedArray<T>(T[,] twoDimArray) 57 { 58 int rowLength = twoDimArray.GetLength(0); 59 int colLength = twoDimArray.GetLength(1); 60 61 T[][] jagArray = new T[rowLength][]; 62 63 for (int columnIndex = 0; columnIndex < rowLength; columnIndex++) 64 { 65 jagArray[columnIndex] = new T[colLength]; 66 for (int rowIndex = 0; rowIndex < colLength; rowIndex++) 67 { 68 jagArray[columnIndex][rowIndex] = twoDimArray[columnIndex + 1, rowIndex + 1]; 69 } 70 } 71 72 return jagArray; 73 } 74 75 } 76} 77
C#
1using System; 2using System.Collections.Generic; 3using System.Linq; 4using Microsoft.Office.Interop.Excel; 5using System.Text; 6using System.Runtime.InteropServices; 7using System.Threading.Tasks; 8 9namespace WindowsFormsApp4 10{ 11 class ExcelManager : IDisposable 12 { 13 /// <summary> 14 /// Excel操作用オブジェクト 15 /// </summary> 16 private Application _excel = new Application() 17 { 18 // 非表示 19 Visible = false, 20 }; 21 private Workbook _workbook = null; 22 private Worksheet _worksheet = null; 23 24 /// <summary> 25 /// Excelワークブックを開く 26 /// </summary> 27 /// <param name="filename">ファイル名</param> 28 /// <param name="sheetname">シート名</param> 29 public void Open(string filename, string sheetname = "Sheet1") 30 { 31 try 32 { 33 // Bookを開く 34 _workbook = _excel.Workbooks.Open(filename); 35 36 // 対象シートを設定する 37 _worksheet = _workbook.Worksheets[sheetname]; 38 } 39 catch (Exception ex) 40 { 41 throw (ex); 42 } 43 } 44 45 /// <summary> 46 /// UsedRangeを二次元配列で取得する 47 /// </summary> 48 /// <returns>UsedRangeの二次元配列</returns> 49 public object[,] GetUsedRange() 50 { 51 // Usedrangeを二次元配列に格納する 52 return _worksheet.UsedRange.Value; 53 } 54 55 private bool disposedValue = false; 56 57 protected virtual void Dispose(bool disposing) 58 { 59 if (!disposedValue) 60 { 61 if (disposing) 62 { 63 // TODO: Managed Objectの破棄 64 } 65 66 if (_workbook != null) 67 { 68 _workbook.Close(); 69 Marshal.ReleaseComObject(_workbook); 70 _workbook = null; 71 } 72 73 if (_excel != null) 74 { 75 _excel.Quit(); 76 Marshal.ReleaseComObject(_excel); 77 _excel = null; 78 } 79 80 disposedValue = true; 81 } 82 } 83 84 ~ExcelManager() 85 { 86 Dispose(false); 87 } 88 89 public void Dispose() 90 { 91 Dispose(true); 92 GC.SuppressFinalize(this); 93 } 94 } 95} 96
よろしくお願いいたします。



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