Excel 97-2003 ブック (.xls) をプログラムで扱う – 準備


◆Excel 97-2003 ブック (.xls) をプログラムから扱う

Excel 97-2003 ブック (.xls) の BIFF8 バイナリ形式をプログラムから扱うには、いくつかの方法があります。

  • オートメーションで Excel を起動して操作する
  • フリーのコンポーネントを使用する
  • 市販のコンポーネントを使用する

オートメーションで Excel を起動して操作する方法については、Excel そのものを動かすため、ファイルを扱うという点に関しては最も確実な方法となります。しかしながら、実行環境に Excel がインストールされている必要がある、サーバーサイドでの使用が推奨されていない、動作速度が遅い等、さまざまな制約があるため、多様化するシステムで使用するにはあまり適していません。
Office のサーバーサイド オートメーションについて

Excel 97-2003 ブック (.xls) を扱うフリーのコンポーネントとして、NPOI があります。NPOI は Java の Apache POI を .NET 向けに作成したライブラリで、CodePlex のサイトからダウンロードすることができます。導入コストがかからないため、手軽に使用することができますが、問題が発生した場合等は解決するためのスキルが必要になります。

市販のコンポーネントとしては、グレープシティさんの「PowerTools ComponentOne Studio 2012J」に含まれる「PowerTools XLS for .NET」や、アドバンスソフトウェアの「ExcelCreator」があります。これらのコンポーネントは体験版が公開されているため、機能や要件の確認を行うことができます。問題が発生した場合はメーカーに問い合わせることもできます。


何回かにわたりその方法を紹介したいと思いますので、今回は C# のコンソールアプリケーションプロジェクトで NPOI と ExcelCreator を使用するための準備とブックを新規に作成する例について紹介します。


◆検証を行う環境

  • Windows 8 x64
  • Visual Studio 2012 Premium


◆NPOI を使用する

NPOI を使用するには、CodePlex のサイトからバイナリをダウンロードし、解凍したフォルダを任意の場所にコピーします。

.NET Framework 2.0 用のアセンブリと 4 用のアセンブリが用意されているので、コンソールアプリケーションのプロジェクトを作成し、適切なアセンブリを参照設定に追加すれば使用できるようになります。

ブックを新規に作成するコード(NPOI)

using System.IO;

namespace NPOIConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var workbook = new NPOI.HSSF.UserModel.HSSFWorkbook();
            workbook.CreateSheet("Sheet1");
            using (var fileStream = new FileStream("NPOICreate.xls", FileMode.OpenOrCreate, FileAccess.Write))
                workbook.Write(fileStream);
        }
    }
}

作成したブックの内容を確認すると、Excel で作成したブックと比べてフォント情報や書式情報が異なることが分かります。内容から推測すると英語版の Excel に合わせた仕様となっているようです。

フォント情報(レコード ID:0×0031) – Arial がデフォルト

[ID:0x0031(Length:21)]
C8 00 00 00 FF 7F 90 01 00 00 00 00 00 00 05 00 | ネ............... |
41 72 69 61 6C                                  | Arial            |
[ID:0x0031(Length:21)]
C8 00 00 00 FF 7F 90 01 00 00 00 00 00 00 05 00 | ネ............... |
41 72 69 61 6C                                  | Arial            |
[ID:0x0031(Length:21)]
C8 00 00 00 FF 7F 90 01 00 00 00 00 00 00 05 00 | ネ............... |
41 72 69 61 6C                                  | Arial            |
[ID:0x0031(Length:21)]
C8 00 00 00 FF 7F 90 01 00 00 00 00 00 00 05 00 | ネ............... |
41 72 69 61 6C                                  | Arial            |

書式情報(レコード ID:0x041e) – 7 レコード

[ID:0x041e(Length:26)]
05 00 15 00 00 22 24 22 23 2C 23 23 30 5F 29 3B | ....."$"#,##0_); |
28 22 24 22 23 2C 23 23 30 29                   | ("$"#,##0)       |
[ID:0x041e(Length:31)]
06 00 1A 00 00 22 24 22 23 2C 23 23 30 5F 29 3B | ....."$"#,##0_); |
5B 52 65 64 5D 28 22 24 22 23 2C 23 23 30 29    | [Red]("$"#,##0)  |
[ID:0x041e(Length:32)]
07 00 1B 00 00 22 24 22 23 2C 23 23 30 2E 30 30 | ....."$"#,##0.00 |
5F 29 3B 28 22 24 22 23 2C 23 23 30 2E 30 30 29 | _);("$"#,##0.00) |
[ID:0x041e(Length:37)]
08 00 20 00 00 22 24 22 23 2C 23 23 30 2E 30 30 | .. .."$"#,##0.00 |
5F 29 3B 5B 52 65 64 5D 28 22 24 22 23 2C 23 23 | _);[Red]("$"#,## |
30 2E 30 30 29                                  | 0.00)            |
[ID:0x041e(Length:44)]
2A 00 27 00 00 5F 28 2A 20 23 2C 23 23 30 5F 29 | *.'.._(* #,##0_) |
3B 5F 28 2A 20 28 23 2C 23 23 30 29 3B 5F 28 2A | ;_(* (#,##0);_(* |
20 22 2D 22 5F 29 3B 5F 28 40 5F 29             |  "-"_);_(@_)     |
[ID:0x041e(Length:53)]
29 00 30 00 00 5F 28 22 24 22 2A 20 23 2C 23 23 | ).0.._("$"* #,## |
30 5F 29 3B 5F 28 22 24 22 2A 20 28 23 2C 23 23 | 0_);_("$"* (#,## |
30 29 3B 5F 28 22 24 22 2A 20 22 2D 22 5F 29 3B | 0);_("$"* "-"_); |
5F 28 40 5F 29                                  | _(@_)            |
[ID:0x041e(Length:52)]
2C 00 2F 00 00 5F 28 2A 20 23 2C 23 23 30 2E 30 | ,./.._(* #,##0.0 |
30 5F 29 3B 5F 28 2A 20 28 23 2C 23 23 30 2E 30 | 0_);_(* (#,##0.0 |
30 29 3B 5F 28 2A 20 22 2D 22 3F 3F 5F 29 3B 5F | 0);_(* "-"??_);_ |
28 40 5F 29                                     | (@_)             |
[ID:0x041e(Length:61)]
2B 00 38 00 00 5F 28 22 24 22 2A 20 23 2C 23 23 | +.8.._("$"* #,## |
30 2E 30 30 5F 29 3B 5F 28 22 24 22 2A 20 28 23 | 0.00_);_("$"* (# |
2C 23 23 30 2E 30 30 29 3B 5F 28 22 24 22 2A 20 | ,##0.00);_("$"*  |
22 2D 22 3F 3F 5F 29 3B 5F 28 40 5F 29          | "-"??_);_(@_)    |

より詳細な内容については次回以降に書きたいと思います。


◆ExcelCreator を使用する

ExcelCreator を使用するには、アドバンスソフトウェアのサイトから ExcelCreator の体験版をダウンロードします。ExcelCreator は扱うファイルの形式や開発環境によっていくつかのバージョンが存在しますが、.NET 環境で Excel 97-2003 ブック (.xls) を扱うには、ExcelCreator 5.0 for .NET をダウンロードします。

ダウンロードしたファイルを実行すると自動でセットアッププログラムが起動するので、メッセージに従いインストールを進めます。こちらも .NET Framework 2.0 用のアセンブリと 4 用のアセンブリが用意されているので、コンソールアプリケーションのプロジェクトを作成し、適切なアセンブリを参照設定に追加すれば使用できるようになります。

ブックを新規に作成するコード(ExcelCreator 5.0 for .NET)

namespace EC5ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            var xlsCreator = new ExcelCreator.XlsCreator();
            xlsCreator.CreateBook("EC5Create.xls", 1, ExcelCreator.xlVersion.ver2003);
            xlsCreator.CloseBook(true);
        }
    }
}

作成したブックの内容を確認すると、Excel で作成したブックと比べてほぼ同じ内容になっています。

フォント情報(レコード ID:0×0031) – MS Pゴシックがデフォルト

[ID:0x0031(Length:32)]
DC 00 00 00 FF 7F 90 01 00 00 00 03 80 00 08 01 | ワ............... |
2D FF 33 FF 20 00 30 FF B4 30 B7 30 C3 30 AF 30 | -.3. .0.エ0キ0テ0ッ0 |
[ID:0x0031(Length:32)]
DC 00 00 00 FF 7F 90 01 00 00 00 03 80 00 08 01 | ワ............... |
2D FF 33 FF 20 00 30 FF B4 30 B7 30 C3 30 AF 30 | -.3. .0.エ0キ0テ0ッ0 |
[ID:0x0031(Length:32)]
DC 00 00 00 FF 7F 90 01 00 00 00 03 80 00 08 01 | ワ............... |
2D FF 33 FF 20 00 30 FF B4 30 B7 30 C3 30 AF 30 | -.3. .0.エ0キ0テ0ッ0 |
[ID:0x0031(Length:32)]
DC 00 00 00 FF 7F 90 01 00 00 00 03 80 00 08 01 | ワ............... |
2D FF 33 FF 20 00 30 FF B4 30 B7 30 C3 30 AF 30 | -.3. .0.エ0キ0テ0ッ0 |
[ID:0x0031(Length:32)]
78 00 00 00 FF 7F 90 01 00 00 00 03 80 00 08 01 | x............... |
2D FF 33 FF 20 00 30 FF B4 30 B7 30 C3 30 AF 30 | -.3. .0.エ0キ0テ0ッ0 |

書式情報(レコード ID:0x041e) – 11 レコード(Excel と同じ)

[ID:0x041e(Length:24)]
05 00 13 00 00 22 5C 22 23 2C 23 23 30 3B 22 5C | ....."\"#,##0;"\ |
22 5C 2D 23 2C 23 23 30                         | "\-#,##0         |
[ID:0x041e(Length:29)]
06 00 18 00 00 22 5C 22 23 2C 23 23 30 3B 5B 52 | ....."\"#,##0;[R |
65 64 5D 22 5C 22 5C 2D 23 2C 23 23 30          | ed]"\"\-#,##0    |
[ID:0x041e(Length:30)]
07 00 19 00 00 22 5C 22 23 2C 23 23 30 2E 30 30 | ....."\"#,##0.00 |
3B 22 5C 22 5C 2D 23 2C 23 23 30 2E 30 30       | ;"\"\-#,##0.00   |
[ID:0x041e(Length:35)]
08 00 1E 00 00 22 5C 22 23 2C 23 23 30 2E 30 30 | ....."\"#,##0.00 |
3B 5B 52 65 64 5D 22 5C 22 5C 2D 23 2C 23 23 30 | ;[Red]"\"\-#,##0 |
2E 30 30                                        | .00              |
[ID:0x041e(Length:55)]
2A 00 32 00 00 5F 20 22 5C 22 2A 20 23 2C 23 23 | *.2.._ "\"* #,## |
30 5F 20 3B 5F 20 22 5C 22 2A 20 5C 2D 23 2C 23 | 0_ ;_ "\"* \-#,# |
23 30 5F 20 3B 5F 20 22 5C 22 2A 20 22 2D 22 5F | #0_ ;_ "\"* "-"_ |
20 3B 5F 20 40 5F 20                            |  ;_ @_           |
[ID:0x041e(Length:46)]
29 00 29 00 00 5F 20 2A 20 23 2C 23 23 30 5F 20 | ).).._ * #,##0_  |
3B 5F 20 2A 20 5C 2D 23 2C 23 23 30 5F 20 3B 5F | ;_ * \-#,##0_ ;_ |
20 2A 20 22 2D 22 5F 20 3B 5F 20 40 5F 20       |  * "-"_ ;_ @_    |
[ID:0x041e(Length:63)]
2C 00 3A 00 00 5F 20 22 5C 22 2A 20 23 2C 23 23 | ,.:.._ "\"* #,## |
30 2E 30 30 5F 20 3B 5F 20 22 5C 22 2A 20 5C 2D | 0.00_ ;_ "\"* \- |
23 2C 23 23 30 2E 30 30 5F 20 3B 5F 20 22 5C 22 | #,##0.00_ ;_ "\" |
2A 20 22 2D 22 3F 3F 5F 20 3B 5F 20 40 5F 20    | * "-"??_ ;_ @_   |
[ID:0x041e(Length:54)]
2B 00 31 00 00 5F 20 2A 20 23 2C 23 23 30 2E 30 | +.1.._ * #,##0.0 |
30 5F 20 3B 5F 20 2A 20 5C 2D 23 2C 23 23 30 2E | 0_ ;_ * \-#,##0. |
30 30 5F 20 3B 5F 20 2A 20 22 2D 22 3F 3F 5F 20 | 00_ ;_ * "-"??_  |
3B 5F 20 40 5F 20                               | ;_ @_            |
[ID:0x041e(Length:26)]
17 00 15 00 00 5C 24 23 2C 23 23 30 5F 29 3B 5C | .....\$#,##0_);\ |
28 5C 24 23 2C 23 23 30 5C 29                   | (\$#,##0\)       |
[ID:0x041e(Length:31)]
18 00 1A 00 00 5C 24 23 2C 23 23 30 5F 29 3B 5B | .....\$#,##0_);[ |
52 65 64 5D 5C 28 5C 24 23 2C 23 23 30 5C 29    | Red]\(\$#,##0\)  |
[ID:0x041e(Length:32)]
19 00 1B 00 00 5C 24 23 2C 23 23 30 2E 30 30 5F | .....\$#,##0.00_ |
29 3B 5C 28 5C 24 23 2C 23 23 30 2E 30 30 5C 29 | );\(\$#,##0.00\) |
[ID:0x041e(Length:37)]
1A 00 20 00 00 5C 24 23 2C 23 23 30 2E 30 30 5F | .. ..\$#,##0.00_ |
29 3B 5B 52 65 64 5D 5C 28 5C 24 23 2C 23 23 30 | );[Red]\(\$#,##0 |
2E 30 30 5C 29                                  | .00\)            |

こちらもより詳細な内容については次回以降に書きたいと思います。


◆まとめ

NPOI と ExcelCreator を使ってプログラムから Excel 97-2003 ブックを扱うための準備が整いましたので、次回からは NPOI と ExcelCreator を使って、実際のプログラムから Excel 97-2003 ブックをより細かく扱う方法を紹介していきたいと思います。

DELL XPS 12 BTX に Windows 8 をインストール

10/26 に注文した DELL XPS 12 BTX が 11/20 に納品されたので、セットアップを行いスペックを確認しました。

◆セットアップ

電源を入れてメッセージに従い設定を進めていくだけですぐにセットアップが完了します。Live ID は使わずにセットアップ。

◆DELL XPS 12 BTX スペック

  • CPU:Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz 1.70GHz
  • メモリ:8GB
  • SSD:256GB

◆Windows エクスペリエンス インデックス

以前インストールした DELL Vostro 3300 と比べ、プロセッサのサブスコアは同じですが、メモリ、グラフィクス、ハードディスクにおいて高いスコアをマークしています。さすがに動作が快適です。今後はこのマシンを使ってデモを行い、処理速度の計測や比較にも使っていきたいと思います。

◆感想

高さ 8~20mm、幅 317mm、奥行き 214mm、最小重量 1.52kg と、持ったままデモをするには若干重く感じますが、12.5 インチ Full HD 液晶ディスプレイ (1920×1080)(LED バックライト採用、タッチ機能付き)のおかげで非常に見やすく、また SSD と 8GB のメモリの恩恵もあって動作も快適です。ディスプレイの回転についてもフレームの作りがしっかりしているので安心感があります。

Strict Open XML Spreadsheet 形式の日付データ

Excel 2013 でサポートされた Strict Open XML Spreadsheet 形式では、日付データの保持の仕方が通常のブックと異なり、プログラム中から直接扱うには個別の処理が必要になります。


通常のブック(Strict でない)では、日付のデータはシリアル値として保持されます。.NET 環境でこのデータを日付として読み込むには、Convert クラスの ToDateTime メソッドを使用します。また、データを設定する場合は、DateTime 構造体の ToOADate メソッドで変換した値を設定します。

通常のブック(Strict でない)の xl/worksheets/sheet1.xml データ部分

<sheetData>
  <row r="1" spans="1:1" x14ac:dyDescent="0.15">
    <c r="A1" s="1">
      <v>41229</v>
    </c>
  </row>
</sheetData>


Strict Open XML Spreadsheet 形式では、v タグに ISO 8601 の形式で保持されます。また、c タグに属性 t=”d” が設定されます。

Strict Open XML Spreadsheet 形式の xl/worksheets/sheet1.xml データ部分

<sheetData>
  <row r="1" spans="1:1" x14ac:dyDescent="0.15">
    <c r="A1" s="1" t="d">
      <v>2012-11-16</v>
    </c>
  </row>
</sheetData>


◆設定する日付データ文字列の作成

プログラム中から Strict Open XML Spreadsheet 形式の日付データを設定するには、DateTime 構造体の ToString メソッドを使用して ISO8601 形式の文字列を作成し、v タグにセルのデータとして設定します。データだけを扱う場合はこれだけでよいのですが、正しく日付のデータとして認識させるには、一つ上の階層の c タグに属性 t=”d” を設定する必要があります。また、日付のデータはセルの書式と組み合わせて使用されるため、書式の番号(xl/styles.xml で定義)も c タグの属性として必要になります。ファイルそのものが Strict Open XML Spreadsheet 形式であるという前提の処理になります。

class Program
{
    static void Main(string[] args)
    {
        string s1 = DateTime.Now.ToString("s");  // 並べ替え可能な日付と時刻のパターン(ISO8601 準拠)
        string s2 = DateTime.Now.ToString("o");  // ラウンド トリップする日付と時刻のパターン(ISO8601 準拠)
        string s3 = DateTime.Now.ToString("yyyy-MM-dd'T'HH:mm:ss'Z'");
        string s4 = DateTime.Now.ToString("yyyy-MM-dd");
        Console.WriteLine("s1=[{0}]", s1);
        Console.WriteLine("s2=[{0}]", s2);
        Console.WriteLine("s3=[{0}]", s3);
        Console.WriteLine("s4=[{0}]", s4);
    }
}

実行結果


◆取得した日付データの扱い

プログラム中から Strict Open XML Spreadsheet 形式の日付データを取得する場合、XML から取得したテキストを DateTime 構造体の Parse メソッドを使用して DateTime 構造体に格納することができます。この場合、取得の際に設定されているデータがどういったものかを判定する必要がありますが、c タグの t 属性で判定ができます。それだけでなく、ファイルそのものが Strict Open XML Spreadsheet 形式かどうかについても判定が必要です。その場合はいくつか判定方法があると思いますが、xl/workbook.xml の に設定された conformance 属性で判定するのがよいと思います。先ほど設定で使用したデータをそのまま使います。

class Program
{
    static void Main(string[] args)
    {
        DateTime d1 = DateTime.Parse(s1);  // 並べ替え可能な日付と時刻のパターン(ISO 8601 準拠)
        DateTime d2 = DateTime.Parse(s2);  // ラウンド トリップする日付と時刻のパターン(ISO 8601 準拠)
        DateTime d3 = DateTime.ParseExact(s3, "yyyy-MM-dd'T'HH:mm:ss'Z'", null);
        DateTime d4 = DateTime.Parse(s4);
        Console.WriteLine("d1=[{0}]", d1.ToString());
        Console.WriteLine("d2=[{0}]", d2.ToString());
        Console.WriteLine("d3=[{0}]", d3.ToString());
        Console.WriteLine("d4=[{0}]", d4.ToString());
    }
}

実行結果


◆まとめ

Strict Open XML Spreadsheet 形式の日付データそのものは DateTime クラスのメソッドで比較的簡単に扱えますが、そのファイルが Strict Open XML Spreadsheet 形式 かどうかを判定したり、c タグの属性の扱いを考慮すると、少し処理が面倒そうです。
アドバンスソフトウェアで開発しているコンポーネントでも Strict Open XML Spreadsheet 形式への対応を進めており、上記の形式の違いや面倒な処理の部分をあまり意識せず使用できるよう調整中です。

Excel ブック (*.xlsx) 形式概要


◆Office Open XML

Office 2007 から採用されているファイル形式「Office Open XML」は、XML をベースとしたオフィスソフトウェア用のファイルフォーマット形式です。2006 年 12 月に Ecma International により ECMA-376 として標準化され、2008 年 4 月には ISO と IEC の合同技術委員会 ISO/IEC JTC 1 の副委員会 SC 34 において、ISO/IEC 29500 として標準化されました(Wiki ペディアより)。
詳細な仕様については、Ecma International のホームページから約 5500 ページに渡る仕様書をダウンロードすることができます。


◆Excel ファイル構造

Office 2007 からは XML で記述された文書と画像やプリンタ情報などのバイナリ情報を ZIP でパッケージングして格納するようになりました。Excel の場合、拡張子を「.xlsx」から「.zip」に変更してエクスプローラで構造を確認することができます。



フォルダ内のパス情報

パス 情報
[Content_Types].xml パーツ情報
_rels/.rels リレーション情報全般
docProps/core.xml 作成者、作成日時等の情報
docProps/app.xml アプリケーション情報(バージョン、サマリ等)
xl/_rels/workbook.xml.rels ワークブック内リレーション情報
xl/workbook.xml ファイルバージョン、ウインドウ情報、シート情報一覧等
xl/theme/theme1.xml テーマ情報
xl/worksheets/sheet1.xml シート情報(Sheet1)
xl/worksheets/sheet2.xml シート情報(Sheet2)
xl/worksheets/sheet3.xml シート情報(Sheet3)
xl/styles.xml スタイル情報


Office Open XML 形式を採用することで、下記の利点が期待されます。

  • ファイルサイズの減少
  • データの汎用性向上
  • ファイル破損時のリスクの軽減

ファイルサイズについて、Excel を例にバイナリ形式と Office Open XML 形式のファイルそれぞれのファイルサイズを比較します。

  • 新規に作成した空のファイル(Book1.xlsx、Book1.xls)
  • 1000 セルにランダムな数値を設定したファイル(Num1000.xlsx、Num1000.xls)
  • 1000 セルにランダムな文字列を設定したファイル(Str1000.xlsx、Str1000.xls)

いずれの場合も Office Open XML 形式の方がサイズが小さくなっています。


文字列や画像等の情報を追加した場合、下記のパスに追加されます。

データ パス 情報
文字列 xl/sharedStrings.xml 文字列参照番号と文字列を保持します
計算式 xl/calcChain.xml 数式の参照情報が保持されます
画像 xl/media/image1.png
xl/drawings/_rels/drawing1.xml.rels
xl/drawings/drawing1.xml
描画情報も追加されます
プリンタ情報 xl/printerSettings/printerSettings1.bin バイナリの情報として追加されます。

文書自体は XML でも、その構造を正しく把握して追加したり書き戻しを行うとなると結構な処理が必要となります。そういった部分はコンポーネントを使用した方が効率が飛躍的によくなります。


◆Office Open XML 形式の Excel ファイルを扱うコンポーネント

Office Open XML 形式の Excel ファイルを扱うコンポーネントは、代表的なものとして下記のものがあります。

  • アドバンスソフトウェアの「ExcelCreator 2012」に含まれる「ExcelCreator 8.0 for .NET」
  • グレープシティさんの「PowerTools ComponentOne Studio 2012J」に含まれる「PowerTools XLS for .NET」
  • Microsoft 社が提供している「Open XML SDK」
  • Open XML SDK をラップしたフリーのライブラリ「ClosedXML」
  • System.IO.Packaging をラップした ExcelPackage
  • ExcelPackage を元に開発された EPPlus

最初の 2 つは有料のコンポーネントで xls 形式の記事でも紹介しました。他はフリーのライブラリとなります。フリーのライブラリについては、codeplex やいろいろな blog で取り上げられています。

有料のコンポーネントでは、導入コストはかかりますが、サポート、動作保証において大きなメリットがあります。基本動作についてはメーカーの方で検証を行うことがほとんどですので、動作保証されている環境では安心して使うことができます。また、使用方法についてメーカーに問い合わせを行うことができることもメリットの一つです。何年かに渡る保守が必要なシステムでは、有料のコンポーネントを使用した方が安心と言えると思います。

フリーのコンポーネントの利点としては、導入コストがかからないことが挙げられますが、開発環境、動作環境を含むすべてのメンテナンスが自己責任となります。例えば Open XML SDK は現在バージョンが 2.0 ですが、CTP 版として 2.5 が公開されていて、対象となる .NET Framework が 4 となっています。2.0 の不具合の修正は 2.5 に含まれていますが、2.0 への適用や今後のサポートについては不明となっており、動作環境には注意が必要です。わずかな機能のみの実装であったり、社内ツールなどで決まった範囲での使用の場合はフリーのコンポーネントの方が有利だと思います。


◆まとめ

Office Open XML ファイル形式のデータは、プログラム中から扱うことがより容易になり、システムに直接ファイルを組み込んで使用することでシステムの利便性が向上します。複雑なシステムであっても最終的にデータを見たり加工したり印刷するには Excel が好まれる傾向にあります。コンポーネントを有効に活用することでより使いやすいシステムを構築できると思います。

具体的にデータを扱う方法についてはいずれ紹介したいと思います。

Visual Studio 2010、2012 でツールバーにソリューション プラットフォームを追加する

Visual Studio 2010 からは、標準ではツールバーにソリューション プラットフォームがありません。C++ を使用していると、x86、x64 の切り替えが必要となり、ツールバーにあると便利です。ツールバーにソリューション プラットフォームを追加する方法を記載しておきます。

Visual Studio のメニュー「ツール」から「カスタマイズ」を選択します。

コマンドタブで「ツール バー」から「標準」を選択し、コントロールの一覧から「ソリューション構成」を選択して「コマンドの追加」ボタンをクリックします。

「コマンドの追加」画面で「カテゴリ」から「ビルド」を選択して、コマンドから「ソリューション プラットフォーム」を選択して「OK」ボタンをクリックします。

コントロールの一覧にソリューション プラットフォームが追加されます。

閉じるとツールバーにソリューション プラットフォームが追加されます。