私は生後 2 週間の新しい C#「プログラマー」なので、間違いを許してください (ただし、指摘してください :))。Excel ドキュメントの最初のシートをデータ グリッド ビューにインポートする簡単な方法に問題があります。これは私のコードです:
public void OpenFile(string filePath)
{
try
{
//Clear data grid view and refresh.
gridData.Rows.Clear();
gridData.Refresh();
//Components declaration/initialization.
Microsoft.Office.Interop.Excel.Application excelApp;
Microsoft.Office.Interop.Excel.Workbook workbook;
Microsoft.Office.Interop.Excel.Worksheet worksheet;
Microsoft.Office.Interop.Excel.Range range;
excelApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
DataGridViewRow draftRow = new DataGridViewRow();
DataGridViewTextBoxCell draftCell;
//Opening Excel file.
workbook = excelApp.Workbooks.Open(filePath, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets.get_Item(1);
//Geting range of excel file.
range = worksheet.UsedRange;
//Sheet extraction into 2-dimensional array.
object[,] valueArray = (object[,])range.get_Value(XlRangeValueDataType.xlRangeValueDefault);
//Loading values into data grid view from array without header.
for(int row = 2; row < range.Rows.Count; row++)
{
for(int column = 1; column < range.Columns.Count; column++)
{
draftCell = new DataGridViewTextBoxCell();
draftCell.Value = valueArray[row,column].ToString();
draftRow.Cells.Add(draftCell);
}
//HERE IS THE PROBLEM :(
gridData.Rows.Add(draftRow);
draftRow = new DataGridViewRow();
}
//Closing excel app.
workbook.Close(true, null, null);
excelApp.Quit();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
throw;
}
}
私の問題は、draftRow を gridData (私の DataGridView オブジェクト) に追加しようとした時点で発生します。「System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません」という null 例外が発生します。、しかし、何が間違っているのか、それを修正する方法がわかりません。この時点で DataGridView オブジェクトが存在します。
イベント onClick に同様のコードがあり、問題はありません。
この件に関して何かお役に立てれば幸いです。
編集:私のぼんやりのため、両方のforループでセルと行の範囲をインクリメントするのを完全に忘れていました。この場合、最後のセルなしで行を保存することで終了しました。全体として、次のようになります。
//Loading values into data grid view from array without header.
for(int row = 2; row <= range.Rows.Count; row++)
{
for(int column = 1; column <= range.Columns.Count; column++)
{
draftCell = new DataGridViewTextBoxCell();
draftCell.Value = valueArray[row,column].ToString();
draftRow.Cells.Add(draftCell);
}
gridData.Rows.Add(draftRow);
draftRow = new DataGridViewRow();
}