ワークシートの基本操作ワークシートの基本的な操作には、ワークブックにシートを追加、ワークシートをアクティブ化、ワークシートプロパティの取得や設定、ワークシート削除などを含みます。ここではいくつかのサンプルも紹介しています。
新しいワークシートを追加する
AddLayer メソッドを使用してワークシートをブックに追加します。
// "Book1"というワークブックにアクセス
WorksheetPage wksPage("Book1");
// ワークブックにシートを追加
int index = wksPage.AddLayer("New Sheet");
// 新しいワークシートにアクセス
Worksheet wksNew = wksPage.Layers(index);
ワークシートをアクティブにする
Active WorksheetActive WindowActive WorkbookActive MatrixbookActive ColumnWorkbook は、ワークシートを含むOriginのオジェクトです。ワークブック内のシートをアクティブにするには、関数set_active_layer を使用します。
// フルネームによりワークシートにアクセス
Worksheet wks("[Book1]Sheet1");
// このワークシートをアクティブにする
set_active_layer(wks);
ワークブックを削除する
ワークブックを削除するDestroyメソッドを使用してワークシートを削除します。
Worksheet wks = Project.ActiveLayer();
if( wks ) //アクティブレイヤがワークシートの時
wks.Destroy(); // ワークシート削除
ワークブック内のワークシートにアクセスするワークブック、1シートを取得ワークブック、名前を取得
名前でワークシートにアクセスするには、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;
|