セルへのアタッチと値のセット

CRAngeクラスでセルにアタッチ

Worksheetオブジェクトへアタッチしたらいよいよセルオブジェクトにアタッチして該当セルを操作します。当コンテンツでは任意のセルをCRangeクラスで扱います。基本型は以下のようになります。

CRangeB cell;
cell.AttachDispatch(
  wsheet.get_Range(COleVariant("A1"),COleVariant("A1"))
);
cell.put_Value(COleVariant("サンプルデータ"));
cell.ReleaseDispatch();

多次元配列を利用した値のセット

ただし、上記のようなコードでセルの選択・値の設定を繰り返すのは非常にパフォーマンスが悪いので値を設定したいデータを多次元配列として複数選択したセルに1回で値をセットします。例えば、下記のようなデータをセットしたい場合は次のようなコードになります。

エクセルへのデータセット例
fig-4.

ここでは多次元配列をCOleSafeArrayクラスで実装しています。コードは煩雑になりますがたくさんのデータをセットする必要がある場合処理速度はひとつずつせっとする場合に比べて格段に速いです。

int cell_data[2][5]={
  {10,20,30,40,50},{60,70,80,90,100}
};

long index[2];
DWORD elements[2] = {2,5};
COleSafeArray sa;

cell.AttachDispatch(
 wsheet.get_Range(COleVariant("A1"),COleVariant("E2"))
);

sa.Create(VT_I4,2,elements);

for(unsignd int i=0;i<elements[0];i++){
  for(unsignd int j=0;j<elements[1];j++){
    index[0] = i;
    index[1] = j;
    sa.PutElement(index,(void*)(&cell_data[i][j]));
  }
}
cell.put_Value(COleVariant(sa));
cell.ReleaseDispatch();
sa.Clear();
sa.Detach();

文字列を配列で設定する場合は多次元配列をBSTR型で作成します。以前、blogに書いた時は数値の場合もBSTR型で値を代入し後に数値演算をするという姑息な手を使っていたのですが数値は数値(VT_Ix)としてセットすれば余計な処理は不要です。

敢えて数値を文字列としてセットしたい場合は以下のコードになります。

BSTR bstr;
CString data_string;
for(int i=0;i<elements[0];i++){
  for(int j=0;j<elements[1];j++){
    index[0] = i;
    index[1] = j;
    data_string.Format("%d",cell_data[i][j]);
    bstr = data_string.AllocSysString();
    sa.PutElement(index,bstr);
    SysFreeString(bstr);
  }
}