C++でExcelシートにデータを書き込む

データとはセルに格納された情報のことで、MS Excelではさまざまなツールを使って計算や分析を行うことができる。この記事では、C++を使ってエクセル文書を作成し、指定したセルにデータを書き込む方法を紹介する。

以下、2つの例を取り上げます：
* [C++でテキストや数値をセルに書き込む](#cでテキストや数値をセルに書き込む)
* [C++で指定したセル範囲に配列を書き込む](#cで指定したセル範囲に配列を書き込む)

## エクセル処理用C++ライブラリのインストール
[**Spire.XLS for C++**](https://www.e-iceblue.com/Introduce/xls-for-CPP.html)は、あらゆるタイプのC++アプリケーションでExcelファイルの作成、読み込み、書き込み、変換に使用できるプロフェッショナルなExcel C++ APIです。テンプレートからの新規Excelドキュメントの作成、既存Excelドキュメントの編集、Excelファイルの変換など、C++プラットフォームでのExcelプログラミングを高速化するオブジェクトモデルExcel APIを提供します。

以下のリンクをクリックし、チュートリアルに従ってインストールしてください。

https://www.e-iceblue.com/Tutorials/C++/Spire.XLS-for-C++/Getting-Started/How-to-Integrate-Spire.XLS-for-C++-in-a-C++-Application.html


## C++でテキストや数値をセルに書き込む
指定したセルにテキスト値や数値値を割り当てるには、**`Worksheet->GetRange()->SetText()`** または **`Worksheet->GetRange()->SetNumberValue()`** メソッドを使用します。

**サンプル C++ コード：**
```cpp
#include "Spire.Xls.o.h";

using namespace Spire::Xls;

int main() {

    std::wstring outputFile = L"WriteDataToCells.xlsx";

    //Workbookオブジェクトを作成する
    intrusive_ptr<Workbook> workbook = new Workbook();

    //最初のシートを入手する
    intrusive_ptr<Worksheet> sheet = dynamic_pointer_cast<Worksheet>(workbook->GetWorksheets()->Get(0));

    //指定したセルにテキストと数値を書き込む
    sheet->GetRange(1, 1)->SetText(L"商品ID");
    sheet->GetRange(1, 2)->SetText(L"商品名");
    sheet->GetRange(1, 3)->SetText(L"在庫状況");
    sheet->GetRange(1, 4)->SetText(L"数量");

    sheet->GetRange(2, 1)->SetText(L"SP-001");
    sheet->GetRange(2, 2)->SetText(L"商品A");
    sheet->GetRange(2, 3)->SetText(L"在庫補充");
    sheet->GetRange(2, 4)->SetNumberValue(110);

    sheet->GetRange(3, 1)->SetText(L"SP-002");
    sheet->GetRange(3, 2)->SetText(L"商品B");
    sheet->GetRange(3, 3)->SetText(L"使用中");
    sheet->GetRange(3, 4)->SetNumberValue(82);

    sheet->GetRange(4, 1)->SetText(L"SP-003");
    sheet->GetRange(4, 2)->SetText(L"商品C");
    sheet->GetRange(4, 3)->SetText(L"在庫切れ");
    sheet->GetRange(4, 4)->SetNumberValue(0);

    //指定したセルにスタイルを適用する
    intrusive_ptr <CellStyle> style = dynamic_pointer_cast<CellStyle>(workbook->GetStyles()->Add(L"newStyle"));
    style->GetFont()->SetIsBold(true);
    sheet->GetRange(1, 1, 1, 4)->SetStyle(style);

    //ファイルに保存
    workbook->SaveToFile(outputFile.c_str(), ExcelVersion::Version2016);
    workbook->Dispose();
}
```

出力：
![WriteDataToExcel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/813deda7-232e-4af2-eb06-5cbd540efc19.png)


## C++で指定したセル範囲に配列を書き込む
Spire.XLS for C++ が提供する **`Worksheet->InsertArray()`** メソッドを使用すると、プログラマはワークシートの指定したセル範囲にベクトルを書き込むことができます。ワークシートに配列を書き込む前に、配列をベクトルに変換する必要があります。

**サンプル C++ コード：**
```cpp
#include "Spire.Xls.o.h";

using namespace Spire::Xls;
using namespace std;

int main() {

    wstring outputFile = L"WriteArraysToCellRanges.xlsx";

    //Workbookオブジェクトを作成する
    intrusive_ptr<Workbook> workbook = new Workbook();

    //最初のシートを入手する
    intrusive_ptr<Worksheet> sheet = dynamic_pointer_cast<Worksheet>(workbook->GetWorksheets()->Get(0));

    //二次元配列の作成
    wstring twoDimensionalArray[4][5] = {
        {L"SKU", L"説明", L"購入日", L"購入価格"},
        {L"SP7875", L"品目 1", L"2024/1/31", L"2000"},
        {L"TR87680", L"品目 2", L"2024/3/10", L"1500"},
        {L"MK676554", L"品目 3", L"2024/3/25", L"560"},
    };

    //行番号と列番号を取得
    int rowNum = sizeof(twoDimensionalArray) / sizeof(twoDimensionalArray[0]);
    int columnNum = sizeof(twoDimensionalArray[0]) / sizeof(twoDimensionalArray[0][0]);

    //2次元配列を複数の1次元ベクトルに分割する
    for (size_t i = 0; i < rowNum; i++)
    {
        vector<LPCWSTR> vec_temp;
        for (size_t j = 0; j < columnNum; j++)
        {
            vec_temp.push_back(twoDimensionalArray[i][j].c_str());
        }

        //ワークシートにベクトルを挿入する
        sheet->InsertArray(vec_temp, 1+i, 1, false);
    }

    //指定したセルにスタイルを適用する
    intrusive_ptr <CellStyle> style = dynamic_pointer_cast<CellStyle>(workbook->GetStyles()->Add(L"newStyle"));
    style->GetFont()->SetIsBold(true);
    sheet->GetRange(1, 1, 1, 4)->SetStyle(style);

    //ファイルに保存
    workbook->SaveToFile(outputFile.c_str(), ExcelVersion::Version2016);
    workbook->Dispose();
}
```

出力：
![WriteArrayToExcel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/7a535ec2-ec6b-5b5e-b8ea-74272c95e9c7.png)

* * *

> C++を使用してExcel XLSまたはXLSXファイルを操作するスキルについてもっと知りたいですか？このチュートリアルをご覧ください：
>
>https://www.e-iceblue.com/Tutorials/C++/Spire.XLS-for-C++/Program-Guide/Spire.XLS-for-C++-Program-Guide-Content.html