プロが教えるわが家の防犯対策術!

DatagridviewをExcelシートに保存しています。
それを呼び出し再編集するとセルが青くなったり、セルの値が消えたり、操作ができなくなったり最終的にはエラーが出てしまいます。
これらを回避するにはどうしたらいいでしょうか?コマンドプロンプトかcsc.exeで実装しています。
コードはこちらです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

public class Form1 : Form
{
private DataGridView Grid1;
private DataGridView Grid2;
private DataGridView Grid3;
private DataGridView Grid4;
public Form1()
{
InitializeComponent(); //自動生成するために必要
Grid1.CellFormatting += new DataGridViewCellFormattingEventHandler(dataGridView1_CellFormatting);//計算
}
private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (e.ColumnIndex == 5)
{
int v1, v2, v3;
if (Int32.TryParse((string)Grid1[6, e.RowIndex].Value, out v1)
&& Int32.TryParse((string)Grid1[7, e.RowIndex].Value, out v2)
&& Int32.TryParse((string)Grid1[8, e.RowIndex].Value, out v3))
{
Grid1[5, e.RowIndex].Value = (v1 - v2 - v3).ToString();
}
}
}

private void call(Object sender, EventArgs e)
{
Type objType = Type.GetTypeFromProgID("Excel.Application");
dynamic objXLS = Activator.CreateInstance(objType);
objXLS.Visible = true;

//string Cd = Directory.GetCurrentDirectory(); //現在のファイルパス
string strFileName = "パス名";
dynamic objBook = objXLS.Workbooks.Open(strFileName);
//エクセルに反映
Grid1.Rows[0].Cells[0].Value = objBook.Worksheets(1).Cells(4, 2).Value;
Grid1.Rows[1].Cells[0].Value = objBook.Worksheets(1).Cells(6, 2).Value;
Grid1.Rows[2].Cells[0].Value = objBook.Worksheets(1).Cells(8, 2).Value;
Grid1.Rows[3].Cells[0].Value = objBook.Worksheets(1).Cells(10, 2).Value;
Grid1.Rows[4].Cells[0].Value = objBook.Worksheets(1).Cells(12, 2).Value;
・・・省略(Grid数4つ、列行数様々を反映させています)
objBook.Close(true); objBook = null; //Excelクローズ
objXLS.Quit(); objXLS = null; //Excel終了
}
関係ありそうなコードだけ記載しました。どの部分を修正が必要でしょうか?

「C# DatagridviewにExce」の質問画像

質問者からの補足コメント

  • using Excel = Microsoft.Office.Interop.Excel;
    using System.Runtime.InteropServices;
    using System.Reflection;
    を追加してみましたが、コマンドプロンプトで型または名前空間名 'Office' は名前空間 'Microsoft'
    に存在しません。アセンブリ参照が不足しています。
    と出てしまいました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/05/10 13:49

A 回答 (2件)

(1) プログラムを見ると 「DataGridViewをExcelに保存」でなく、「 Excelの内容をDataGridViewに出力」に見えるのですが。



(2) エラーメッセージには、DoubleをStringにキャストできない、と書いてあります。
提示されたプログラムでstringにキャストしているのは
if (Int32.TryParse((string)Grid1[6, e.RowIndex].Value, out v1)
&& Int32.TryParse((string)Grid1[7, e.RowIndex].Value, out v2)
&& Int32.TryParse((string)Grid1[8, e.RowIndex].Value, out v3))
の部分です。
Grid1[?, e.RowIndex].Value がdoubleになっているのでは?
    • good
    • 0
この回答へのお礼

ありがとうございます。
(1)保存ではなく出力でしたね。失礼しました。
(2)質問にあげたコードでは整数の計算をしています。6~8列は0~10000台の整数、Gridの1列と2列は時間(Excelでいう書式設定HH:mm。それを呼び出すと小数点で表示←ここですね)となっています。回避方法はありますか?

お礼日時:2023/05/07 05:35

using Excel = Microsoft.Office.Interop.Excel;


using System.Runtime.InteropServices;
using System.Reflection;

Excel・・・

Excel のライセンス認証が完了か確認
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。Excelのライセンス認証・・・。やったことないです。調べてみます。今回の質問の重要な解決策になりますでしょうか?

お礼日時:2023/05/07 05:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!