- PR -

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

投稿者投稿内容
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-11-02 12:16
引用:

Jittaさんの書き込みより
BBコードというもので、リンクを張ることができるので、これを利用してください。


この会議室のスレッドもBBコード表示できること、気がつきませんでした。
教えていただいたように編集しておきました。Jittaさんありがとうございました。

引用:

今一度、このスレッドに掲載されているコードのみで
確認してもらえないですか。


「リストボックスへの表示」「データグリッドへの表示」ともに
きちんとできています。
引用:

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


ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-11-02 12:50
引用:

このスレッドに掲載されているコードのみで
確認してもらえないですか。


 確認できました。」
「ListBox」「2つめのDataGrid」への書きこみはきちんとできています。

それで、今作成中のアプリDataGridの列表示にそのまま<全く、同じコード>を埋め込むと、前に報告したエラーになる。ということです。

引用:

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


上の「DataGridの列表示」に制約の状況を書いてあります。
Tableの一部をデータグリッドに表示しています。
VS2002C#で,Windows.Form(DOT.NET)のアプリを作ろうとしています。
「生徒名簿」をDataGridに表示しています。(キーの<生徒ID>は表示していません)
    <生徒番号><学年><組><No><氏名><フリガナ><性別>
 このとき,Formにある7つのCheckBoxのチェックの状態によって,個々のデータをグリッド表示したり,しなかったりを繰り返すようにしています。 (CheckedChangeイベント発生のつどに,書き直したSQLを発行して,データを表示しています)
  *DataTable⇒生徒名簿, コネクション⇒ocnMeibo, データアダプター⇒odaMeibo
   データセット⇒dsMeibo1    
(この件について、質問が「IT会議室」と「GDNJ」とで重ならぬよう配慮したつもりですが、
二股ということでお叱りを受けないことを願っております。)






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

[ メッセージ編集済み 編集者: ZEN73 編集日時 2004-11-02 16:08 ]
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-11-03 04:22
引用:

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


とりあえず,[生徒名簿]テーブルの<すべてのデータ>をExcelに表示してみようということで,GetDataView()メソッドを次のように書き換えてみました。
コード:

private DataView GetDataView()
{
// return ((DataTable)dataGrid1.DataSource).DefaultView;
return dsMeibo1.Tables["生徒名簿"].DefaultView;
}


この結果Excelが起動し,「指定されている<学年・組>の学級名簿」の全データが表示されました。(ウレシカッタァ!)

課題は,
  ≪DataGridに表示している「列」のみ≫を≪Excelに表示する≫ことです。
どうぞ,ご教示をよろしくお願いします。









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

コード:


//From_Loadでグリッドの表示内容をカスタマイズしています。
//この内容は前提になります。
//質問をアップする場合は、前提条件や問題現象を再現させるための
//説明が必ず必要となります。
//でなければ、求めている回答が得られにくいです。

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;

DataGridTableStyle dg = new DataGridTableStyle();
dg.MappingName = "GridData";

DataGridColumnStyle dgc1 = new DataGridTextBoxColumn();
dgc1.MappingName = "int1";
dgc1.HeaderText = "カラムの1番目";
dg.GridColumnStyles.Add(dgc1);

DataGridColumnStyle dgc2 = new DataGridTextBoxColumn();
dgc2.MappingName = "int15";
dgc2.HeaderText = "カラムの15番目";
dg.GridColumnStyles.Add(dgc2);

DataGridColumnStyle dgc3 = new DataGridTextBoxColumn();
dgc3.MappingName = "int22";
dgc3.HeaderText = "カラムの22番目";
dg.GridColumnStyles.Add(dgc3);

dataGrid1.TableStyles.Add(dg);
}

//グリッドで表示されている列情報を取得し、その列に対応する
//データテーブルの情報をグリッドの表示にかかわらず全件取得し、
//ListBoxにカンマ区切りで表示します。
//エクセルへのエクスポートは自前で工夫してください。
private void button3_Click(object sender, System.EventArgs e)
{
if (dataGrid1.TableStyles.Count == 0) return;
DataTable dt = dataGrid1.DataSource as DataTable;
if (dt == null) return;
string tname = dt.TableName;
DataGridTableStyle dgts = dataGrid1.TableStyles[tname];
System.Text.StringBuilder HeadLine = new System.Text.StringBuilder();
System.Collections.Specialized.StringCollection ColList =
new System.Collections.Specialized.StringCollection();
foreach(DataGridColumnStyle dgcs in dgts.GridColumnStyles)
{
HeadLine.Append(dgcs.HeaderText);
HeadLine.Append(",");
ColList.Add(dgcs.MappingName);
}
HeadLine.Remove(HeadLine.Length-1,1);
System.Collections.Specialized.StringCollection ValList =
new System.Collections.Specialized.StringCollection();
foreach(DataRow dr in dt.Rows)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach(string col in ColList)
{
sb.Append(dr[col].ToString());
sb.Append(",");
}
sb.Remove(sb.Length-1,1);
ValList.Add(sb.ToString());
}

//表示
listBox1.Items.Clear();
listBox1.Items.Add(HeadLine.ToString());
foreach(string s in ValList) listBox1.Items.Add(s);
}



そのままこのコードを、ZEN73さんが現在作っている
アプリケーションに貼り付けて正常に動作するかどうか
なんてことは、私にはわかりません。
どうか、自己責任でお願いします。


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

[ メッセージ編集済み 編集者: Jubei 編集日時 2004-11-03 14:05 ]
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-11-03 18:50
善浪です。
Jubeiさん,ありがとうございました。すべてがうまくいきました。
(この報告をしようと会議室を開いたとき,Jubeiさんのアドバイスを拝見しました。
 あとで,自分のコードを整理する参考にさせていただきます。重ねて御礼を申し上げ ます)

*多くの方が,このスレッドをご覧になっています。その方々への報告の意味を込めて表題に(できた)の3文字を追加させていただきます。
コード:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Reflection;

namespace Cat_s_Hand
{
    public class FrmMeibo : System.Windows.Forms.Form
    {

        //CheckBoxの配列を作成
        private System.Windows.Forms.CheckBox[]  arrayCBox
			= new System.Windows.Forms.CheckBox[10];

        /*==========Grid2Excel表示用変数=======================*/ 
        public string[] strExcelHeader = 
              {"番号", "年", "組", "No", "氏名", "フリガナ", "性"};
        public int ExcelColNum = 7;
        /*=====================================================*/

        private void GridWidth()
        {
            int iCnt, PlusScroll = 17, PlusWidth = 40;
		
            if(checkBox1.Checked) PlusWidth += 34;
            if(checkBox2.Checked) PlusWidth += 18;
            if(checkBox3.Checked) PlusWidth += 18;
            if(checkBox4.Checked) PlusWidth += 22;
            if(checkBox5.Checked) PlusWidth += 90;
            if(checkBox6.Checked) PlusWidth += 90;
            if(checkBox7.Checked) PlusWidth += 22;
            iCnt = dataGrid1.BindingContext[dsMeibo1, "生徒名簿"].Count;
            if(iCnt > 33)
            {
                PlusScroll = 17;
                dataGrid1.Height = 636;
            }
            else
            {
                PlusScroll = 0;
                dataGrid1.Height = 24 + 18 * (iCnt+1);
            }
            dataGrid1.Width = PlusWidth + PlusScroll;
        }
        private void DataRead()
        {
            string Nen, Kumi;
	
            Nen = cmbNen.Text.Substring(0,1);
            Kumi = cmbKumi.Text.Substring(0,1);

            dsMeibo1.Clear();
            odaMeibo.SelectCommand.Parameters["年"].Value = Nen;
            odaMeibo.SelectCommand.Parameters["組"].Value = Kumi;
	
            odaMeibo.Fill(dsMeibo1, "生徒名簿");
            GridWidth();
        }

        private void arrayCBox_ChekedChanged(object sender, EventArgs e)
        {
            string str;
            str = ((System.Windows.Forms.CheckBox) sender).Text;
            switch(str)
            {
                case "番号" : str="生徒No";   break;
                case "年"   : str="年";       break;
                case "組"   : str="組";       break;
                case "No" : str="番号";     break;
                case "氏名" : str="氏名";     break;
                case "フリガナ": str="フリガナ";    break;
                case "性"   : str="性別";     break;
            }
            CBoxText = str;
            SQL_String();
        }
        private void FrmMeibo_Load(object sender, System.EventArgs e)
        {
            //チェックボックスコントロールの配列に代入
            arrayCBox[1] = checkBox1;
            arrayCBox[2] = checkBox2;
            arrayCBox[3] = checkBox3;
            arrayCBox[4] = checkBox4;
            arrayCBox[5] = checkBox5;
            arrayCBox[6] = checkBox6;
            arrayCBox[7] = checkBox7;
            for(int i=1; i<8; i++)
                arrayCBox[i].CheckedChanged += 
                                new EventHandler(arrayCBox_ChekedChanged);
            DataRead();
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            this.Close();
        }
        private void SQL_String()
        {
            string[] ColName;
            string Select = "";
            //forExcel
            ExcelColNum = 0;
            dataGrid1.TableStyles.Clear();
            DataGridTableStyle tsMeibo = new DataGridTableStyle();
            tsMeibo.MappingName = "生徒名簿";
		
            ColName = new string[8];

            if(checkBox1.Checked)
            {
                ColName[1] = ",生徒No ";
                ExcelColNum++;
                strExcelHeader[ExcelColNum-1] = "番号";
			
                DataGridColumnStyle TextCol11 = new DataGridTextBoxColumn();
                TextCol11.MappingName = "生徒No";
                TextCol11.HeaderText = "番号";
                TextCol11.Width = 34;
                TextCol11.Alignment = HorizontalAlignment.Center;
                TextCol11.NullText = "";
                tsMeibo.GridColumnStyles.Add(TextCol11);
            }
            else 
                ColName[1] = "";
            if(checkBox2.Checked)
            {
                ColName[2] = ",年 ";
                ExcelColNum++;
                strExcelHeader[ExcelColNum-1] = "年";
		
                DataGridColumnStyle TextCol12 = new DataGridTextBoxColumn();
                TextCol12.MappingName = "年";
                TextCol12.HeaderText = "年";
                TextCol12.Width = 18;
                TextCol12.Alignment = HorizontalAlignment.Center;
                TextCol12.NullText = "";
                tsMeibo.GridColumnStyles.Add(TextCol12);
            }
            else 
                ColName[2] = "";
            if(checkBox3.Checked)
            {
                ColName[3] = ",組 ";
                ExcelColNum++;
                strExcelHeader[ExcelColNum-1] = "組";
                DataGridColumnStyle TextCol13 = new DataGridTextBoxColumn();
                TextCol13.MappingName = "組";
                TextCol13.HeaderText = "組";
                TextCol13.Width = 18;
                TextCol13.Alignment = HorizontalAlignment.Center;
                TextCol13.NullText = "";
                tsMeibo.GridColumnStyles.Add(TextCol13);
            }
            else 
                ColName[3] = "";
            if(checkBox4.Checked)
            {
                ColName[4] = ",番号 ";
                ExcelColNum++;
                strExcelHeader[ExcelColNum-1] = "No";
                DataGridColumnStyle TextCol14 = new DataGridTextBoxColumn();
                TextCol14.MappingName = "番号";
                TextCol14.HeaderText = "No";
                TextCol14.Width = 22;
                TextCol14.Alignment = HorizontalAlignment.Center;
                TextCol14.NullText = "";
                tsMeibo.GridColumnStyles.Add(TextCol14);
            }
            else 
                ColName[4] = "";
            if(checkBox5.Checked)
            {
                ColName[5] = ",氏名 ";
                ExcelColNum++;
                strExcelHeader[ExcelColNum-1] = " 氏 名";
                DataGridColumnStyle TextCol15 = new DataGridTextBoxColumn();
                TextCol15.MappingName = "氏名";
                TextCol15.HeaderText = " 氏 名";
                TextCol15.Width = 90;
                TextCol15.Alignment = HorizontalAlignment.Left;
                TextCol15.NullText = "";
                tsMeibo.GridColumnStyles.Add(TextCol15);
            }
            else 
                ColName[5] = "";
            if(checkBox6.Checked)
            {
                ColName[6] = ",[フリガナ] ";
                ExcelColNum++;
                strExcelHeader[ExcelColNum-1] = "フリガナ";
                DataGridColumnStyle TextCol16 = new DataGridTextBoxColumn();
                TextCol16.MappingName = "フリガナ";
                TextCol16.HeaderText = "フリガナ";
                TextCol16.Width = 90;
                TextCol16.Alignment = HorizontalAlignment.Left;
                TextCol16.NullText = "";
                tsMeibo.GridColumnStyles.Add(TextCol16);
            }
            else 
                ColName[6] = "";
            if(checkBox7.Checked)
            {
                ColName[7] = ",性別";
                ExcelColNum++;
                strExcelHeader[ExcelColNum-1] = "性";
                DataGridColumnStyle TextCol17 = new DataGridTextBoxColumn();
                TextCol17.MappingName = "性別";
                TextCol17.HeaderText = "性";
                TextCol17.Width = 22;
                TextCol17.Alignment = HorizontalAlignment.Center;
                TextCol17.NullText = "";
                tsMeibo.GridColumnStyles.Add(TextCol17);
            }
            else
                ColName[7] = "";
		
            dataGrid1.TableStyles.Add(tsMeibo);

            for(int i=1; i<8; i++)
            {
                Select += ColName[i];
            }
            this.oleDbSelectCommand1.CommandText = 
                "SELECT 生徒ID" + Select + " FROM 生徒名簿 WHERE (年 = ?) 
                AND (組 = ?) ORDER BY 生徒No";
            DataRead();        
        }

        private void cmbNen_TextChanged(object sender, System.EventArgs e)
        {
            DataRead();
        }
        private void cmbKumi_TextChanged(object sender, System.EventArgs e)
        {
            DataRead();
        }
		
        /*========== Excelで印刷 ==================================*/
        private string[] GetHeaderArray()
        {
            string[] ret = new string[ExcelColNum];
            for(int i=0; i<ExcelColNum; i++)
            {
                ret[i] = strExcelHeader[i];
            }
            return ret;
        }
        private string[,] GetDataArray(int irow)
        {
            int iRow = irow;
            int iCol = ExcelColNum;
            string[,] ret = new string[iRow,iCol];
            for(int i=0; i<irow; i++)
            {
                for(int j=0; j<iCol; j++)
                {
                    ret[i,j] = dataGrid1[i,j].ToString();
                }
            }
            return ret;
        }

        private void cmbPrint_TextChanged(object sender, System.EventArgs e)
        {
            if(cmbPrint.Text == "Excel")
            {
                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 iCnt = 
                        dataGrid1.BindingContext[dsMeibo1, "生徒名簿"].Count;
                    string[,] dataValue = GetDataArray(iCnt);
				
                    int r = dataValue.GetLength(0);
                    int c = dataValue.GetLength(1);
                    range = range.get_Resize(r,c);
                    //Excel2002
                    //range.set_Value(Missing.Value, dataValue);
                    //Excel2000
                    try
                    {
                        range.Value = dataValue;
                    }
                    catch(Exception ex)
                    {
                        MessageBox.Show("Excel2000で印刷します。"Using Excel",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
            return;
          }
          exApp.Visible = true;
          exApp.UserControl = true;
        }
        catch(Exception ex)
        {
          MessageBox.Show(ex.Message, "Error");
                }
            }
        }
    }
}




Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-11-03 21:02
 Windowsアプリなので、あまり気にしなくてもいいのかもしれませんが、使ったCOMオブジェクトはきちんとリリースしてくださいね。会議室ディレクトリのExcelに行けば、なんのことか分かると思います。「終了させるには?」みたいなスレッドがいくつかあるので、それを見てください。
_________________
ZEN73
常連さん
会議室デビュー日: 2003/03/10
投稿数: 43
投稿日時: 2004-11-04 04:50
引用:

Jittaさんの書き込み (2004-11-03 21:02) より:
 使ったCOMオブジェクトはきちんとリリースしてくださいね。会議室ディレクトリのExcelに行けば、なんのことか分かると思います。「終了させるには?」みたいなスレッドがいくつかあるので、それを見てください。


Jittaさんありがとうございます。
これかな?と思ったのがありました。
コード:
'' Excelの設定を戻して終了
        xlsApp.IgnoreRemoteRequests = False
        xlsApp.ScreenUpdating = True
        xlsApp.DisplayAlerts = True
        xlsApp.SheetsInNewWorkbook = xlsNewSheetCount
        xlsApp.Application.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsApp)
        xlsApp = Nothing


私の場合は,
exApp.Application.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(exApp)
で,よいのでしょうか。お教え願います。

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