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

Excelへのデータ移行[C#]

投稿者投稿内容
solt
会議室デビュー日: 2003/08/12
投稿数: 14
投稿日時: 2003-11-23 04:14
DBの内容をdataViewでフィルタリングしてdataGridに表示しています。

現在の段階では、Excelは起動でき、random変数を使いテストデータを作成し、
Excelに移してグラフを作成できます。

後はフィルタリングしたdataGridのデータをExcelに移すだけなんですがデータがうまく移せません。
CSVなども考えたんですが、そのまま移したいと思っています。

dataGrid内:
全て数字で4列31行のデータです。

過去レスも見たんですがイマイチわからず、ご指導お願いします。


Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-23 08:43
こんにちわ。諸農です。

引用:

soltさんの書き込み (2003-11-23 04:14) より:
後はフィルタリングしたdataGridのデータをExcelに移すだけなんですがデータがうまく移せません。



どううまく移せないのでしょうか?

DataGridに表示されているデータへのアクセス方法がわからない?
DataGridに表示されているデータは取得できているが、
Excelオブジェクト(のセル)への、データ移送の方法がわからない?

問題点がどこにあるのか、もう少し具体的に書かれた方が良いかと思います。

ではでは(^^)/
_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
solt
会議室デビュー日: 2003/08/12
投稿数: 14
投稿日時: 2003-11-23 14:02
説明不足ですいません。
とりあえず移してみようと思い、for文を使ってみました。

for(int r = 0;r < dataView.Count;r++)
{
for(int row = 0;row < dataView.Count;row++)
{
sheet.Cell[row.1] = Convert.Toint32(dataGrid[r,0]);
sheet.Cell[row.2] = Convert.Toint32(dataGrid[r,1]);
sheet.Cell[row.3] = Convert.Toint32(dataGrid[r,2]);
sheet.Cell[row.4] = Convert.Toint32(dataGrid[r,3]);
}
}

乱数だとfor文で移せて自動的にグラフが作れるので、このようにしてみたんですが
やはりできませんでした。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-23 17:22
こんにちわ。諸農です。

引用:

soltさんの書き込み (2003-11-23 14:02) より:

乱数だとfor文で移せて自動的にグラフが作れるので、このようにしてみたんですが
やはりできませんでした。



何度もすみません。

エクセルへのデータ移送がうまく行かないのが問題なのか、
エクセルにはデータ移送がうまく行くけども、グラフが出
来ないことが問題なのか、どちらなんでしょう??

乱数を求めてエクセルへデータを移送するコードと、アップ
されたコードとの差異は何でしょうか?


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

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-11-24 07:18
引用:

soltさんの書き込み (2003-11-23 14:02) より:
sheet.Cell[row.1] = Convert.Toint32(dataGrid[r,0]);
sheet.Cell[row.2] = Convert.Toint32(dataGrid[r,1]);
sheet.Cell[row.3] = Convert.Toint32(dataGrid[r,2]);
sheet.Cell[row.4] = Convert.Toint32(dataGrid[r,3]);

乱数だとfor文で移せて自動的にグラフが作れるので、このようにしてみたんですが
やはりできませんでした。


 マニュアル(MSDN)を見ればすむ話のような??

sheet.Cell[row,col] = dataGrid.Items[row][col]


sheet.Cell[row,col]
こっちは単あるタイプミスと思います。乱数の代入はできているのですから。

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-11-24 10:58 ]
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-24 07:34
こんにちわ。

引用:

Jittaさんの書き込み (2003-11-24 07:18) より:
sheet.Cell[row,col] = dataGrid.Items[row][col]



いや、まさか「コンパイルエラー」が問題だったとは思いませんでした。
特に
sheet.Cell[row,col]
の、部分は画面の小さなノートPCのIEだと気付きにくいですね。。

#問題点を明示しない方が多いのは何故なんでしょうか・・

ではでは(^^)/

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

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
solt
会議室デビュー日: 2003/08/12
投稿数: 14
投稿日時: 2003-11-25 05:50
たびたびすいません。
書き直してみたんですが、やはり移送できませんでした。
dataViewの最下行のみが任意の範囲に全て表示されてしまいます。

そこでいろいろ調べてみたんですがC#ではCopyFromRecordsetは使えるんでしょうか?
sheet.get_Range("A1","D31").CopyFromRecordset(dataGrid, dataView.Count, dataView.Count);

このようにしたところ"サポートされていません"とエラーがでてしまいます。
データ量は少ないんでできれば各Cellに1つずつ移送したいんですが・・・。
すいませんがもう少しご指導お願いします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2003-11-25 09:09
私のところでは、以下のコードでDataTableのデータを
Excelに転送できることが確認できています。

コード:

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

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

private int[,] GetDataArray()
{
DataView dv = GetDataView();

int r = dv.Count;
int c = dv.Table.Columns.Count;
int[,] ret = new int[r,c];
for (int i = 0;i<r;i++)
{
for (int ii = 0;ii<c;ii++)
{
ret[i,ii] = (int)dv[i].Row[ii];
}
}
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);

range = wkSheet.get_Range("A1", Missing.Value);
int[,] dataValue = GetDataArray();
int r = dataValue.GetUpperBound(0);
int c = dataValue.GetUpperBound(1);
range = range.get_Resize(r,c);
range.set_Value(Missing.Value,dataValue);
exApp.Visible = true;
exApp.UserControl = true;
}
catch(Exception ex )
{
MessageBox.Show(ex.Message,"Error");
}

}



この発言内容を元に試してみてうまくいった場合ですが、
この会議室を見ている人、今後同様の問題にぶつかるかもしれない人のために、
「今までやっていたことのどの部分でまずかったのか」、
「何をどう変えたらうまくいったのか」を、
具体的な内容でフィードバックしていただけると幸いです。
是非ともお願いします。

_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2003-11-25 09:17 ]

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