ワークシートの基本操作

ワークシートの基本的な操作には、ワークブックにシートを追加、ワークシートをアクティブ化、ワークシートプロパティの取得や設定、ワークシート削除などを含みます。ここではいくつかのサンプルも紹介しています。

新しいワークシートを追加する

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;