ワークシート列データの操作

基本的な算術操作

列データに対して基本的な算術演算の操作を行うには、列データをベクトルに取得し、対応ベクトルで操作します。

// 1、2列目からデータを取得
// この2列を足す
//  そして結果を3列目に出力
Worksheet wks = Project.ActiveLayer();
if(!wks) 
{
	return;
}
Column col1 = wks.Columns(0);  // 1列目
Column col2 = wks.Columns(1);  // 2列目
Column col3 = wks.Columns(2);  // 3列目

vectorbase &v1 = col1.GetDataObject();  // データオブジェクトを取得
vectorbase &v2 = col2.GetDataObject(); 
vectorbase &v3 = col3.GetDataObject();
v3 = v1 + v2;  // 足し合わせる

式で値を設定

DataObject::SetFormulaDataObject::ExecuteFormulaメソッドは、値の設定ダイアログのように、列/行列値の設定に使用できます。次のサンプルでは、3列のワークシートを作成し、各列の値を式で設定します。

Worksheet wks;
wks.Create("origin", CREATE_VISIBLE);
wks.AddCol();

// 1列目の値をセット
Column colA;
colA.Attach(wks, 0);
colA.SetFormula("5*(i-1)");
colA.ExecuteFormula();

// 次の2列は再計算を自動にセット
Column colB;
colB.Attach(wks, 1);
colB.SetFormula("sin(4*col(A)*pi/180)", AU_AUTO);
colB.ExecuteFormula();

// スクリプト実行前で宣言した変数を使用
Column colC;
colC.Attach(wks, 2);
string strExpression = "cos(Amp*x*pi/180)";
string strBeforeScript = "double Amp=4.5;" + "\r\n" + "range x=col(A);";
string strFormula = strExpression + STR_COL_FORMULAR_SEPARATOR + strBeforeScript;
colC.SetFormula(strFormula, AU_AUTO);
colC.ExecuteFormula();

列をソートする

指定した列をソートするには、まず列データをベクトルに取得し、ベクトルでソートした後で値を戻します。列からデータオブジェクトを取得するためのベクトル参照を使用することで、自動的にベクトルを列に付加し、ベクトルのデータが更新されると列に戻すようにします。

Worksheet wks = Project.ActiveLayer();
if(!wks) 
{
	return;
}
Column col1 = wks.Columns(0);  // 1列目
vectorbase &v1 = col1.GetDataObject();  // 参照を使用してデータオブジェクトを取得
v1.Sort(SORT_DESCENDING);  //降順にソート

列を逆順にする

列データを逆順にするには、まず列データをベクトルに取得し、ベクトルのデータを逆順にしてから戻します。

// 1列目のデータを逆順にする
Worksheet wks = Project.ActiveLayer();
if(!wks) 
{
	return;
}
Column col1 = wks.Columns(0);  // 1列目
vectorbase &v1 = col1.GetDataObject();  // データオブジェクトを取得
vector<uint> vnIndices;  // vector for reverse indices
vnIndices.Data(v1.GetSize() - 1, 0, -1);  // 逆順インデックス
v1.Reorder(vnIndices);  // データを逆順にする

列からデータを取得/設定

列から数値データ値を取得/設定

// 最初の列に付加。列のフォーマットが
// 文字と数値(デフォルト)または数値であるか確認
Column col(wks, 0);

// 列のデータ型をdoubleとする
// 他の数値データ型 int, short, complex などもサポート
vector<double>& vec = col.GetDataObject();

// この列の最後に100を追加
vec.Add(100);

あるいは、Datasetオブジェクトを使用して列の数値データを取得できます。例えば、例えば、

Worksheet wks = Project.ActiveLayer();

Dataset ds(wks, 1);

for(int ii=0; ii<ds.GetSize(); ii++)
    out_double("", ds[ii]);

列から文字列値を取得/設定

Column col(wks, 0); // 1列目に追加

// 列から文字列配列を取得
vector<string> vs;
col.GetStringArray(vs);

// 列に文字列配列を戻す
vs.Add("test");
col.PutStringArray(vs);

列から日時データを取得/設定

列のデータ型が日付や時間の場合、この列から取得したデータは、ユリウス日/時間のデータで、表示-日付-時間-フォーマット文字列ではありません。

// アクティブワークシートを取得
Worksheet wks = Project.ActiveLayer();
Column col1(wks, 0);  // 最初の列
Column col2(wks, 1);  // 2番目の列
// 列フォーマットが日付や時間であるか確認
if(col1.GetFormat() == OKCOLTYPE_DATE || col1.GetFormat() == OKCOLTYPE_TIME)
{
	// 1列目からデータを取得, v1 は ユリウス通日データを保持
	vector &v1 = col1.GetDataObject();  
	vector &v2 = col2.GetDataObject();  // 2列目からデータを取得
	v2 = v1;  // Set 1st column's Julian data to 2nd column
	col2.SetFormat(OKCOLTYPE_DATE);  // 1列目のユリウス通日データを2列目に
	// 表示フォーマットを MM/dd/yyyy HH:mm:ss にセット
	col2.SetSubFormat(LDF_SHORT_AND_HHMMSS_SEPARCOLON);  
}


異なるワークシート/ワークブックの列から取得

全ワークブック中のすべてのワークシートの特定の列について合計を計算するには、現在のフォルダ内のすべてのワークシートをループしることで、目的の列の操作が可能です。

// 現在のフォルダの各ワークブック内の各ワークシートの2番目の列を取得し、その合計を計算して、新しいワークシートに出力
void Calculate_Column_Sum()
{
    StringArray ColNames;
    vector<double> ColMeans;
    int K = 1;
    Dataset ds;
    double colSum;
    Folder fld = Project.ActiveFolder();  // アクティブ/現在のフォルダを取得	
    foreach(PageBase pb in fld.Pages) 
    {  
            // フォルダ内の全ページでループ
            WorksheetPage wksPgSource = pb;  // PageをWorksheetPageに変換
	    // 変換に失敗した場合
	    if(!wksPgSource) 
	    {  
		continue;  // 次のページ
       	    }

	    // ワークブック内の全ワークシートでループ
	    foreach(Layer lay in wksPgSource.Layers) 
	    {
		Worksheet wks = lay; 
                // 列情報取得
		ds.Attach(wks, K);
		DataRange dr;
		dr.Add("X", wks,0,K,-1,K);
		ColNames.Add(dr.GetDescription());			
		// 列の合計を計算
		ds.Sum(colSum);	
		ColMeans.Add(colSum);
	    }

    }	
    // 結果ワークシートを用意
    Worksheet wksResult;
    wksResult.Create("Origin");
    DataRange dr;
    dr.Add(wksResult,0,"X");
    dr.Add(wksResult,1,"Y");
    dr.SetData(&ColMeans,&ColNames);	
}