ワークシートの基本的な操作には、ワークブックにシートを追加、ワークシートをアクティブ化、ワークシートプロパティの取得や設定、ワークシート削除などを含みます。ここではいくつかのサンプルも紹介しています。
AddLayer メソッドを使用してワークシートをブックに追加します。
// "Book1"というワークブックにアクセス WorksheetPage wksPage("Book1"); // ワークブックにシートを追加 int index = wksPage.AddLayer("New Sheet"); // 新しいワークシートにアクセス Worksheet wksNew = wksPage.Layers(index);
Workbook は、ワークシートを含むOriginのオジェクトです。ワークブック内のシートをアクティブにするには、関数set_active_layer を使用します。
// フルネームによりワークシートにアクセス Worksheet wks("[Book1]Sheet1"); // このワークシートをアクティブにする set_active_layer(wks);
Destroyメソッドを使用してワークシートを削除します。
Worksheet wks = Project.ActiveLayer(); if( wks ) //アクティブレイヤがワークシートの時 wks.Destroy(); // ワークシート削除
名前でワークシートにアクセスするには、2通りあります。 コンストラクタや付加メソッドにレイヤのフルネームを渡します。 レイヤのフルネームには、[ ] 内にページ名が含まれ、そのあとにレイヤ名が続きます。
// wksPageが、アクセスしたいシートを保持している有効なWorksheetPageであると仮定 string strFullName = okutil_make_book_sheet_string(wksPage.GetName(), "Sheet1"); // ブックとシートの名前がわかれば、手動で文字列を構築可能 string strFullName = okutil_make_book_sheet_string("Book5", "Sheet1");
全レイヤ名がある場合、ワークシートにアクセスできます。
// ワークシートインスタンスを構築して名前の付いたシートを追加 Worksheet wks1(strFullName); // 名前の付いたシートに既存のワークシートインスタンスを付加 wks2.Attach(strFullName);
ワークシートのコレクションを持つワークブックの場合。 foreachステートメントを使用して指定したワークブック内の全ワークシートでループできます。
WorksheetPage wksPage("Book1"); foreach(Layer wks in wksPage.Layers) out_str(wks.GetName());
指定したワークシートに名前または索引でアクセスすることもできます。
//Book1ページには最低2つのシートがあるとする, //これらの名前はSheet1 と Sheet2 WorksheetPage wksPage("Book1"); Worksheet wksFirst = wksPage.Layers(0); //インデックスによる Worksheet wksSecond = wksPage.Layers("Sheet2"); //名前による
Reorder メソッドでワークブック内のワークシートの順序を変更できます。
// このサンプルは、アクティブワークブックに2つのシートがあることが前提 // アクティブなレイヤからアクティブなページを取得 WorksheetPage wksPage; Worksheet wks = Project.ActiveLayer(); if( wks ) wksPage = wks.GetPage(); // 2つ目のワークシートを1番目のポジションに移動 if( wksPage.Reorder(1, 0) ) out_str("Reorder sheets successfully");
AddLayerメソッドは、1つのページから他にコピーするのに使用されます。これは、GraphPage, WorksheetPage あるいは MatrixPageをともに使用できます。
次のサンプルは、アクティブフォルダにある全ワークシートをアクティブワークブックにドラッグして統合する方法を示しています。
WorksheetPage wksPageDest = Project.Pages(); if( !wksPageDest ) // アクティブウィンドウがない、あるいはアクティブウィンドウはワークシートではない return; bool bKeepSourceLayer = false; // コピー後ソースレイヤは削除 Folder fld = Project.ActiveFolder(); foreach(PageBase pb in fld.Pages) { WorksheetPage wbSource(pb); if(!wbSource) continue;//ワークブックではない if(wbSource.GetName() == wksPageDest.GetName()) continue;//目的のブックはスキップ //目的のブックにワークシートをコピーし、ソースブックから削除 foreach(Layer lay in wbSource.Layers) { Worksheet wks = lay; wksPageDest.AddLayer(wks, 0, bKeepSourceLayer); } wbSource.Destroy();//空のワークブックを破棄 }
プログラミングで、テーマツリーを使用してワークシートをフォーマットできます。 以下のサンプルでは、既存テーマツリーを生成して保存する操作を示します。
// ワークシートからフォーマットツリーを取得 Worksheet wks = Project.ActiveLayer(); Tree tr; tr = wks.GetFormat(FPB_ALL, FOB_ALL, TRUE, TRUE); out_tree(tr); // スクリプトウィンドウにツリーを出力
あるいは、次の3つの操作でテーマツリーを行使することもできます。 まず、ワークシートを作成し、データを挿入します。
// ワークシートを作成 Worksheet wks; wks.Create("Origin"); wks.SetCell(0, 0, "abc"); // (0, 0) セルにテキストを入力 // フォーマット適用のためにデータ範囲を確立する DataRange dr; int r1 = 0, c1 = 0, r2 = 4, c2 = 1; dr.Add("Range1", wks, r1, c1, r2, c2);
次に、範囲情報を使用してツリーを構成し、希望のプロパティに値を与えます。
Tree tr; // 塗りつぶし tr.Root.CommonStyle.Fill.FillColor.nVal = SYSCOLOR_LTCYAN; // セル内のテキストの配置、中央は2 tr.Root.CommonStyle.Alignment.Horizontal.nVal = 2; // テキストのフォントサイズ tr.Root.CommonStyle.Font.Size.nVal = 11; // テキストの色 tr.Root.CommonStyle.Color.nVal = SYSCOLOR_BLUE;
そして、データ範囲にフォーマットを適用します。
// 指定したデータ範囲にフォーマットを適用 if( 0 == dr.UpdateThemeIDs(tr.Root) ) // 0はエラーなし { bool bRet = dr.ApplyFormat(tr, true, true); }
Origin Cコードを使用して、指定した範囲のワークシートセルを統合できます。選択範囲はデータ領域あるいは、列ラベル領域を指定することができます。ラベルセルを統合したい場合、次のコードでbLabels をtrueにします。
Worksheet wks; wks.Create("Origin"); //Grid を定義してワークシートに付加 Grid gg; gg.Attach(wks); // 2列の最初の2行を統合する ORANGE rng; rng.r1 = 0; rng.c1 = 0; rng.r2 = 1; rng.c2 = 1; bool bLabels = false; bool bRet = gg.MergeCells(rng, bLabels); if( bRet ) printf("Successfully merged cells in %s!\n", wks.GetName()); else printf("Failed to merge cells in %s!\n", wks.GetName());
ワークシートセルの内容を変更したくないとき、テーマツリーを使用してセルを読み取り専用にすることができます。
次のサンプルでは、ワークシート内のデータセルを読み取り専用にし、列1の2つ目のデータセルを編集可能にする方法を示します。
// デフォルトテンプレート(Origin)を使用してワークシートを作成 // ロングネーム、単位、コメント行が表示される Worksheet wks; wks.Create("Origin"); Tree tr; tr = wks.GetFormat(FPB_ALL, FOB_ALL, true, true); // ワークシートのテーマツリー取得 //テーマツリーから指定したツリーノードを取得し、 // データセルを読み取り専用にセットするために開始 string strName = "ogData"; // 希望のフォーマットでノードを取得するために使用 TreeNode trGrid, trNameStyles; trGrid = tr.Root.Grid; //グリッドノードを取得 if(!trGrid.IsValid()) return; // このノードの子ノードに読み取り専用フォーマットがある trNameStyles = trGrid.NameStyles; if(!trNameStyles.IsValid()) return; TreeNode trNameStyle; bool bRet = false; // 希望のツリーノードを見つけるためにすべての子ノードをループ foreach(trNameStyle in trNameStyles.Children) { // ノード"ogData"を検索 if(0 == trNameStyle.Name.strVal.Compare(strName)) { bRet = true; break; } } if(!bRet) return; trNameStyle.Style.ReadOnly.nVal = 1; // 読み取り専用にするためにすべてのデータセルをセット // テーマツリーから特定のツリーノードを取得/作成するため // 指定したデータセルのお読み取り専用フォーマットをキャンセルするために開始 TreeNode trRangeStyles; trRangeStyles = trGrid.RangeStyles; // GridノードからRangeStylesノードを取得 TreeNode trRangeStyle; if(!trRangeStyles.IsValid()) // RangeStyles ノードがない場合 { // RangeStylesノードを作成 trRangeStyles = trGrid.AddNode("RangeStyles"); // そしてRangeStyle1というサブノードを作成 trRangeStyle = trRangeStyles.AddNode("RangeStyle1"); } else // RangeStyles ノードがある場合 { // 子ノードがいくつあるか検索 int tagNum = trRangeStyles.Children.Count(); // RangeStyle#(# = tagNum+1)という名前のサブノードを作成 trRangeStyle = trRangeStyles.AddNode("RangeStyle"+(tagNum+1)); } // 設定のための範囲を定義。ここでは範囲yは1つのセル // 1から始まる範囲内の左のセル trRangeStyle.Left.nVal = 1; // 2から始まる範囲の上のセル(ラベル行を含む) // 4つのラベル行があるので、5は最初のデータセル trRangeStyle.Top.nVal = 5; // 1つのセルなので範囲の右は左と同じ trRangeStyle.Right.nVal = 1; // 1つのセルなので下のセルと上のセルは同じ trRangeStyle.Bottom.nVal = 5; trRangeStyle.Style.ReadOnly.nVal = 0; // 0にして読み取り専用をキャンセル // ワークシートにフォーマット設定を適用 if(0 == wks.UpdateThemeIDs(tr.Root)) { bool bb = wks.ApplyFormat(tr, true, true); if(bb) { printf("Cell 1 in column 1 is editable.\n"); } }
ラベル行のセルを読み取り専用にすることもできます上述のコードに簡単な変更を加えることで行えます。たとえば、列2以外のコメント行を読み取り専用にする場合、以下のようにして変更を行います。
/* 上述コード内の以下のラインをコメントアウト string strName = "ogData"; */ // これはデータのための行なので、次のようにコメントのための行に変更 string strName = "ogComment"; /* 上記コードの次の4行をコメントアウト trRangeStyle.Left.nVal = 1; trRangeStyle.Top.nVal = 5; trRangeStyle.Right.nVal = 1; trRangeStyle.Bottom.nVal = 5; */ // この4行は2番目のデータセル(ワークシート内で3つのラベル行があると仮定) // の設定のために使用 // ここではコメントセルに対して設定する // コメント行は列2の3番目であると仮定して // 列1ではない trRangeStyle.Left.nVal = trRangeStyle.Right.nVal = 2; // Column 2 // コメント行(ワークシート内で表示された3番目の行) trRangeStyle.Top.nVal = trRangeStyle.Bottom.nVal = 3;