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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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

0回答

892閲覧

C# 複数行のエクセルファイルの中から行を指定し、カラムとレコードをDataGridViewで表示させたい

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/07 05:32

編集2022/06/13 19:45

【環境】
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

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

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

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

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

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

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

Zuishin

2022/06/07 05:50

> 変数と配列の理解が乏しいため。 そのような理由がはっきりしているのであれば、どうすればいいか自分で判断できるのでは?
退会済みユーザー

退会済みユーザー

2022/06/07 06:10

Excel ファイルの形式は何ですか? xls? xlsx? 言葉だけだと何がしたいのかイメージし辛いです。サンプルの Excel ファイルを作ってそのスクリーンショットを撮って質問欄に貼って、さらにそれをどのように DataGridView に表示したいのかも Excel で良いので作って画像を貼ることはできませんか? DataGridView には表示するだけでいいのですか? その後ユーザーが DataGridView を見て編集して、編集結果を元の Excel ファイルに書き戻すとかまで必要だとすると話が大きく違ってくるので、そのあたりを明確にしてください。
sueteacher

2022/06/13 10:29

エクセルのファイル形式はxlsxです。DataGridViewはデータを表示するだけです。エクセルファイルはあくまで読取り用で使用します。
退会済みユーザー

退会済みユーザー

2022/06/13 10:45

いまさら何なの?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問