列データに対して基本的な算術演算の操作を行うには、列データをベクトルに取得し、対応ベクトルで操作します。
// 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::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 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); }