@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

[Excelへのデータ移行]についての再質問(できた)

投稿者投稿内容
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-10-31 08:09
[Excelへのデータ移行[C#]
で,コードの書き方を教えていただき(理解できていないところもあるが)

[Excelへのデータ移行]についての質問
で,Excelの各バージョンへの対応の方法を教えていただきました。

このコードを<テキスト型データ>に対応させる方法がわからなくて困っています。

 Jubeiさんのコードの一部を下のように<int⇒string>と変更して試してみたところ,きちんと実行でたのです。

 それで,今作成中のアプリで,<テキスト型データ>にそのまま対応させようとすると,次のように,
引用:

'System.InvalidCastException' のハンドルされていない例外が Cat's Hand.exe で発生しました。
追加情報 : 指定されたキャストは有効ではありません。


とエラーが出て,
コード:

private DataView GetDataView()
{
return ((DataTable)dataGrid1.DataSource).DefaultView;
}


のところで,止まってしまいます。

 勉強不足で,対策はまったくありません。

 どなたか,教えくださるようお願いします。
コード:

private void Form1_Load(object sender, System.EventArgs e)
{
//aaは私が追加
int aa;
DataTable tb = new DataTable("GridData");
for(int i=0; i<30; i++)
{
             //tb.Columns.Add("int"+i.ToString(), typeof(int));
tb.Columns.Add("int"+i.ToString(), typeof(string));
}

for(int i=0; i<30; i++)
{
DataRow dr = tb.NewRow();
for(int j=0; j<dr.ItemArray.Length; j++)
{
////////////////////////////////
//dr[j] = i + j;
////////////////////////////////
aa = i+j;
dr[j] = "abc" + aa.ToString() ;
////////////////////////////////
}
tb.Rows.Add(dr);
}

dataGrid1.DataSource = tb;
}

private DataView GetDataView()
{
return ((DataTable)dataGrid1.DataSource).DefaultView;
}

private string[] GetHeaderArray()
{
DataView dv = GetDataView();
string[] ret = new string[dv.Table.Columns.Count];
for(int i=0; i<ret.Length; i++)
{
ret[i] = dv.Table.Columns[i].Caption;
}
return ret;
}
//private int[,] GetDataArray()
private string[,] GetDataArray()
{
DataView dv = GetDataView();

int r = dv.Count;
int c = dv.Table.Columns.Count;
//int[,] ret = new int[r, c];
string[,] ret = new string[r, c];
for(int i=0; i<r; i++)
{
for(int j=0; j<c; j++)
{
ret[i, j] = (string)dv[i].Row[j];
}
}
return ret;
}

private void button1_Click(object sender, System.EventArgs e)
{
Excel.Application exApp;
Excel._Workbook wkBook;
Excel.Workbooks wkBooks;
Excel.Sheets wkSheets;
Excel._Worksheet wkSheet;
Excel.Range range;

try
{
exApp = new Excel.Application();
wkBooks = exApp.Workbooks;
wkBook = wkBooks.Add(Missing.Value);
wkSheets = wkBook.Worksheets;
wkSheet = (Excel._Worksheet)wkSheets.get_Item(1);

string[] headstr = GetHeaderArray();
for(int i=0; i<headstr.Length; i++)
{
wkSheet.Cells[1,i+1] = headstr[i];
}

range = wkSheet.get_Range("A2", Missing.Value);
//int[,] dataValue = GetDataArray();

string[,] dataValue = GetDataArray();
int r = dataValue.GetLength(0);
int c = dataValue.GetLength(1);
range = range.get_Resize(r,c);
//Excel2002
//range.set_Value(Missing.Value, dataValue);
//Excel2000
range.Value = dataValue;
exApp.Visible = true;
exApp.UserControl = true;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message, "Error");
}
}
}



[ メッセージ編集済み 編集者: ZEN73 編集日時 2004-11-02 06:54 ]

[ メッセージ編集済み 編集者: ZEN73 編集日時 2004-11-02 07:07 ]

[ メッセージ編集済み 編集者: ZEN73 編集日時 2004-11-03 18:54 ]

[ メッセージ編集済み 編集者: ZEN73 編集日時 2004-11-03 18:55 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-10-31 14:21
諸農です。

引用:

 Jubeiさんのコードの一部を下のように<int⇒string>と変更して試してみたところ,きちんと実行でたのです。
 それで,今作成中のアプリで,<テキスト型データ>にそのまま対応させようとすると,次のように,



質問があります。
1.'System.InvalidCastException' の意味は把握されていますか?
2.int→stringの変更に伴って他にも変更する箇所があると予想されますが、何らかの見落としはないでしょうか。
3.エラーは「GetHeaderArray()」「GetDataArray()」メソッドのどちらの呼び出し内で発生しているのでしょうか?
4.フォームにもう一つボタンとグリッドを追加して、追加したボタンのクリックイベントハンドラで「GetDataView()」メソッドを直接呼び出してその戻り値を追加したグリッドにセットするようにしてもエラーは発生するのでしょうか?

障害の絞り込みなど、自分で確認するべき内容は他にもたくさんあると思います。
是非、がんばってください。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-10-31 18:32
引用:

1.'System.InvalidCastException' の意味は把握されていますか?


データの型変換と思ってます。
引用:

2.int→stringの変更に伴って他にも変更する箇所があると予想されますが、何らかの見落としはないでしょうか。


今のところ,見つけることができていません。
引用:

3.エラーは「GetHeaderArray()」「GetDataArray()」メソッドのどちらの呼び出し内で発生しているのでしょうか?


両方でエラーになります。
引用:

4.フォームにもう一つボタンとグリッドを追加して、追加したボタンのクリックイベントハンドラで「GetDataView()」メソッドを直接呼び出してその戻り値を追加したグリッドにセットするようにしてもエラーは発生するのでしょうか?


「グリッドにセットする」しかたを思い出せないでいます。
引用:

障害の絞り込みなど、自分で確認するべき内容は他にもたくさんあると思います。
是非、がんばってください。


string型にして実行できたのに,なぜ自分のアプリに「このまま適用する」ことができないのか,糸口すら見えなず,あれこれもがいています。



Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-10-31 20:26
諸農です。

引用:

「グリッドにセットする」しかたを思い出せないでいます。

string型にして実行できたのに,なぜ自分のアプリに「このまま適用する」ことができないのか,糸口すら見えなず,あれこれもがいています。



う〜む。。

これを見ている人には迷惑な話だと思いますが、こちらで確認したコードをアップします。このコードはZEN73さんがアップしたコードから今回注目している部分に特化して、検証に必要のない部分を取り払ったコードです。

結果として、'System.InvalidCastException' は発生しませんでした。

コード:
private void Form1_Load(object sender, System.EventArgs e)
{
    DataTable tb = new DataTable("GridData");
    for(int i=0; i<30; i++)
    {
        tb.Columns.Add("int"+i.ToString(), typeof(string));
    }
    
    for(int i=0; i<30; i++)
    {
        DataRow dr = tb.NewRow();
        for(int j=0; j<dr.ItemArray.Length; j++)
        {
            dr[j] = "abc" +  (i+j).ToString() ;
        }
        tb.Rows.Add(dr);
    }
    dataGrid1.DataSource = tb;
}

private DataView GetDataView()
{
    return ((DataTable)dataGrid1.DataSource).DefaultView;
}

private string[] GetHeaderArray()
{
    DataView dv = GetDataView();
    string[] ret = new string[dv.Table.Columns.Count];
    for(int i=0; i<ret.Length; i++)
    {
        ret[i] = dv.Table.Columns[i].Caption;
    }
    return ret;
}

private string[,] GetDataArray()
{
    DataView dv = GetDataView();
    
    int r = dv.Count;
    int c = dv.Table.Columns.Count;
    string[,] ret = new string[r, c];
    for(int i=0; i<r; i++)
    {
        for(int j=0; j<c; j++)
        {
            ret[i, j] = (string)dv[i].Row[j];
        }
    }
    return ret;
}

private void button1_Click(object sender, System.EventArgs e)
{
    listBox1.Items.Clear();

    string[] headstr = GetHeaderArray();
    listBox1.Items.Add("---HEADER---");
    foreach(string s in headstr) listBox1.Items.Add(s);

    listBox1.Items.Add("---DATAVALUE---");
    string[,] dataValue = GetDataArray();
    for (int i = 0;i < dataValue.GetLength(0);i++)
    {
        for (int ii = 0;ii < dataValue.GetLength(1);ii++)
        {
            listBox1.Items.Add(dataValue[i,ii]);
        }
    }
}

private void button2_Click(object sender, System.EventArgs e)
{
    dataGrid2.DataSource = GetDataView();
}



引用:

糸口すら見えなず,あれこれもがいています


本当ですか?
少しずつ検証すれば潰せると思いますよ。
デバッグ、検証、勉強も含めて、いいものを作ろうとするのでしたら、
労は厭わないことです。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-11-01 07:18
善浪です。
引用:

これを見ている人には迷惑な話だと思いますが、こちらで確認したコードをアップします。
結果として、'System.InvalidCastException' は発生しませんでした。


jubeiさんにも迷惑をおかけしています。
コードを見たとたんに,jubeiさんのご親切をしみじみと感じ取ることができました。
「何をすべきか」その方向を明らかに示してくださいました。ありがとうございます。
引用:

少しずつ検証すれば潰せると思いますよ。
デバッグ、検証、勉強も含めて、いいものを作ろうとするのでしたら、
労は厭わないことです。


<これからやること>
グリッドのデータはきちんと拾い上げられているのだから,あとは,
≪Excelへのデータ移行部分のデバッグ・検証≫です。がんばります。


[/quote]
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-11-01 17:09
引用:

グリッドのデータはきちんと拾い上げられているのだから,あとは,
≪Excelへのデータ移行部分のデバッグ・検証≫です。がんばります。


ところが,<私のグリッドのデータ>をGetHeaderArray()は全く拾ってくれませんで,以前と同じエラーになります。これから本を広げてDataViewのおさらいです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-01 23:00
引用:

65ページの
 『Excelへのデータ移行[C#]』2003/11/25
で,コードの書き方を教えていただき(理解できていないところもあるが)


これって、このスレッドですね?

引用:

 52ページの
 『[Excelへのデータ移行]についての質問』2004/02/09
で,Excelの各バージョンへの対応の方法を教えていただきました。


このスレッドですね?


スレッドに「返答」すれば、そのスレッドの位置は変わってしまうため、ページ番号は役に立ちません。BBコードというもので、リンクを張ることができるので、これを利用してください。

#このスレッドへリンクを張ったので、元のプログラムが参照できるようにするのが目的

_________________
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-11-02 11:27
諸農です。

引用:

ところが,<私のグリッドのデータ>をGetHeaderArray()は全く拾ってくれませんで,以前と同じエラーになります。



全く同じコードですか?
何か別のことが付け加わっていませんか?
例えばGDNJで投稿しているような、グリッドへの制約条件など。

再現性が確認できなければ、誰もコメントが出来ないのです。
ですので、今一度、このスレッドに掲載されているコードのみで
確認してもらえないですか。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/

スキルアップ/キャリアアップ(JOB@IT)