スポンサーリンク

C++CLIでMicrosoft Word文書を作成する

参考文献

https://gist.github.com/meki/7e8b462a8d36919d778f

https://www.c-sharpcorner.com/article/word-automation-using-C-Sharp/

ざっくり言うと上記なのだけれど、C++CLIの場合はコピペでは到底動かない。

C++CLIで動かす場合の注意

引数

引数は全てObject^型でなければならない

  Object^ oMissing = ::System::Reflection::Missing::Value;
  Object^ oTrue = true;
  Object^ oFalse = false;
  Object^ filename = ::System::IO::Directory::GetCurrentDirectory() + "\\out.docx";

引数は一切省略できない

https://gist.github.com/meki/7e8b462a8d36919d778f

ではSaveAs2の引数はファイル名のみだが、C++CLIでは以下のように全て指定する。

  Object^ filename = ::System::IO::Directory::GetCurrentDirectory() + "\\out.docx";
  document->SaveAs2(
    filename,
    oMissing, oMissing, oMissing, oMissing,
    oMissing, oMissing, oMissing, oMissing,
    oMissing, oMissing, oMissing, oMissing, 
    oMissing, oMissing, oMissing, oMissing
  );

名前空間と型

  using namespace Microsoft::Office::Interop::Word;

これはやらない方がいい。

Microsoft::Office::Interop::Word::Systemというのがあり、using namespaceをするとそれと衝突してコンパイルが通らなくなる。

参照の追加

ソースコード

#include "pch.h"

using namespace System;

/// <summary>
/// 文書の末尾位置を取得する.
/// </summary>
/// <returns></returns>
int getLastPosition(Microsoft::Office::Interop::Word::Document^ document)
{
  return document->Content->End - 1;
}

/// <summary>
/// 文書の末尾にテキストを追加する.
/// </summary>
void addTextSample(
  Microsoft::Office::Interop::Word::Document^ document, 
  Microsoft::Office::Interop::Word::WdColorIndex color, 
  System::String^ text)
{
  
  Object^ before = getLastPosition(document);
  Object^ dce = document->Content->End - 1;

  Microsoft::Office::Interop::Word::Range^ rng = document->Range(dce, dce);
  rng->Text += text;

  Object^ after = getLastPosition(document);

  document->Range(before, after)->Font->ColorIndex = color;
}


int main(array<::System::String ^> ^args)
{

  Microsoft::Office::Interop::Word::Application^ 
    word = gcnew Microsoft::Office::Interop::Word::Application();

  word->Visible = false;

  Object^ oMissing = ::System::Reflection::Missing::Value;

  Microsoft::Office::Interop::Word::Document^ 
    document = word->Documents->Add(oMissing, oMissing, oMissing, oMissing);

  Object^ oTrue = true;
  Object^ oFalse = false;

  ////////////////////////////////////////
  // テキストを追加
  addTextSample(document, Microsoft::Office::Interop::Word::WdColorIndex::wdGreen, "Hello, ");
  addTextSample(document, Microsoft::Office::Interop::Word::WdColorIndex::wdRed, "World");
  ////////////////////////////////////////



  // 名前を付けて保存
  Object^ filename = ::System::IO::Directory::GetCurrentDirectory() + "\\out.docx";
  document->SaveAs2(
    filename,
    oMissing, oMissing, oMissing, oMissing,
    oMissing, oMissing, oMissing, oMissing,
    oMissing, oMissing, oMissing, oMissing, 
    oMissing, oMissing, oMissing, oMissing
  );

  // 文書を閉じる
  ((Microsoft::Office::Interop::Word::_Document^)(document))->Close(oFalse, oMissing, oMissing);
  ((Microsoft::Office::Interop::Word::_Application^)word)->Quit(oMissing, oMissing, oMissing);

    return 0;
}

実行結果

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: