C++CLIでOpen XML SDK 2.5 for Officeを使う

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
かずさん
記事: 4
登録日時: 6ヶ月前

C++CLIでOpen XML SDK 2.5 for Officeを使う

#1

投稿記事 by かずさん » 6ヶ月前

初めて質問致します。
宜しくお願い致します。
 Visual Studio 2017 community C++CLIのマネージにて、Open XML SDK 2.5 for Microsoft Officeの勉強を行っております。
 その中で、C#からC++CLIへ書き換える途中で、どうしても分からない部分が出てきました。

 Open XML SDK 2.5 for Office のクラスを使用して、プログラムによってワープロ ドキュメントに表を追加するコードで、

C#

コード:

    Table table = new Table();

    TableProperties props = new TableProperties(
        new TableBorders(
        new TopBorder
        {
            Val = new EnumValue<BorderValues>(BorderValues.Single),
            Size = 12
        },
        new BottomBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new LeftBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new RightBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new InsideHorizontalBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
        },
        new InsideVerticalBorder
        {
          Val = new EnumValue<BorderValues>(BorderValues.Single),
          Size = 12
    }));

    table.AppendChild<TableProperties>(props);

の Valと Size が、定義されていないとErrorになります。C#では別途Val等について追記しなくても、コンパイラが推測するのか上記は通ります。

当然、参照には当該SDKのdllとWindowsBaseも設定済みで、namespaceも記載済みです。
Val とSizeをどのように書き換えればよいのか、御教授願います。

Math

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

#2

投稿記事 by Math » 6ヶ月前

こういう特殊な質問はMicrosoft のMSDN Forum に聞いた方がいいでしょうね。
https://social.msdn.microsoft.com/forums/ja-jp/home

YuO
記事: 941
登録日時: 8年前
住所: 東京都世田谷区

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

#3

投稿記事 by YuO » 6ヶ月前

C++/CLIには、C#における「オブジェクト初期化子」に相当する物がありません。
このため、プロパティの代入で対応する必要があります。
かずさん さんが書きました:
6ヶ月前

コード:

        new TopBorder
        {
            Val = new EnumValue<BorderValues>(BorderValues.Single),
            Size = 12
        },
は、

コード:

        var topBorder = new TopBorder();
        topBorder.Val = new EnumValue<BorderValues>(BorderValues.Single);
        topBorder.Size = 12;
と同じような意味合いになります。
もちろん式から文になるため、TableBordersのnew呼出の中に上記をそのまま書くことはできず、
newを呼ぶ前にインスタンスを作成しておき、new呼出の引数に作成した変数を渡す形になります。

この変換をC#で行った上で、C++/CLIに変換するのがよいかと思います。
オフトピック
C++/CLIでアプリケーションを作成することは、あまりお薦めできません。
C++/CLIは既存C++ライブラリをC#等で使うための接続用に使う物だとされています。

かずさん
記事: 4
登録日時: 6ヶ月前

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

#4

投稿記事 by かずさん » 6ヶ月前

早々のご返信ありがとうございました。
おかげさまで、コンパイルを無事に行うことができました。

C#とC++CLIとでは、結構、異なるところがあるんですね。

ご教授、ありがとうございました。

naohiro19
記事: 256
登録日時: 9年前
住所: 愛知県

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

#5

投稿記事 by naohiro19 » 6ヶ月前

C# の new は C++/CLIは gcnew です。

コード:

String^ text = gcnew String("テキスト");
と書いて文字列の長さを知りたいときは Length というプロパティを使いますが、プロパティ・メソッドへのアクセスは アロー演算子を使います。

コード:

int len = text->Length;
^(ハット) は .NET Framewokのハンドル型をあらわす記号です。

C++/CLI では 従来のネイティブオブジェクトを持つことができますが、
そのネイティブオブジェクトはポインタである必要があります。

かずさん
記事: 4
登録日時: 6ヶ月前

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

#6

投稿記事 by かずさん » 6ヶ月前

 みなさまより、多くのご教授、ありがたく思っております。御礼申し上げます。
私は、従来よりCとC++しか知らず、現在はMS C++CLIを使っておりますが、MSのC++離れを受けWeb上でも参考文献が少なく、仕方なく、C#のコードをコンバートするしかなく、この度の質問をさせて頂きました。C++が好きなためC#へ移行せず、頑張っております。言葉が足らずに申し訳ありませんでした。今後とも宜しくお願い致します。

かずさん
記事: 4
登録日時: 6ヶ月前

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

#7

投稿記事 by かずさん » 6ヶ月前

報告義務を怠っておりました。

C#

コード:

 new TopBorder
        {
            Val = new EnumValue<BorderValues>(BorderValues.Single),
            Size = 12
        },
のコードに対し、御教授頂いた結果より、

コード:

TopBorder^ topBorder = gcnew TopBorder();
topBorder->Val = gcnew EnumValue<BorderValues>(BorderValues::Single);
topBorder->Size = 12;
とすることにより、コンパイルできました。

ありがとうございました。

Math

Re: C++CLIでOpen XML SDK 2.5 for Officeを使う

#8

投稿記事 by Math » 6ヶ月前

[雑談]
私はC++/CLI でゲームを作る本で勉強しましたがそれがシリーズVS2015用までありましたが本に
今はマイクロソフト非推奨になっていると断り書きがついてました。
VS2017初期にはCLR/CLIもありましたが今はひっそりと空のプロジェクト位になりました。
随分前からメンテナンスもされてなくC#の使用がすすめられています。
C#とにているのはじつはCX-Builderです。(こちらは.NETでなく標準C++)
アンダース・ヘルスバーグ がボーランドから移ってDelphiと似たC#を開発したのですね。https://ja.wikipedia.org/wiki/%E3%82%A2 ... C%E3%82%B0
私は業務でC#を使っていましたよ。

返信

“C言語何でも質問掲示板” へ戻る