ワークシート列データの操作
基本的な算術操作
列データに対して基本的な算術演算の操作を行うには、列データをベクトルに取得し、対応ベクトルで操作します。
算術
// 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; // 足し合わせる
式で値を設定Set Column Values
DataObject::SetFormula と DataObject::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, Get/Set Numeric Data
// 最初の列に付加。列のフォーマットが
// 文字と数値(デフォルト)または数値であるか確認
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, Get/Set String Data
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);
}
|