私の仕事は、単語xmlスキーマのフィールドを繰り返して、画像を置き換えることです。それらの画像は、画像に変換されたExcelチャートです。スキーマ内のフィールドを反復することは、見つかったイメージを削除することにも問題ありません。私の問題は、元の範囲でインラインシェイプを再挿入することです。私は別々のWordRangePointerで見つけられたinlineshapeの範囲を保存していますが、AddPicture()とAddOLEObject()はバリアントを予期しています。 & vtMissingを挿入するだけでドキュメントに画像(またはOLEオブジェクト)を配置することができましたが、イメージは自動的に挿入され、必要な場所には挿入されません。_variant_t範囲ポインタ(AddPicture()メソッド)のC++ Wordオートメーションの問題
MSDN InlineShapes.AddOLEObject()
MSDN InlineShapes.AddPicture()
(InlineShapesが発見された場合)私のコードの一部は、次のようになります。
_variant_t vtTrue(true);
_variant_t vtFalse(false);
_variant_t vtTypeS("Excel.Sheet.8");
_variant_t vtTypeC("Excel.Chart.8");
Word::InlineShapesPtr ishps = spDoc->InlineShapes;
Word::InlineShapePtr is = field->InlineShape;
Word::RangePtr isRangePtr;
Word::DocumentsPtr spDocs = spWordApp->Documents;
Word::_DocumentPtr spDoc = spDocs->Open(&_variant_t(filename));
if (is && (std::string(is->OLEFormat->ProgID).find("Excel.Sheet.8") != std::string::npos))
{
std::cout << "Excel Sheet found" << std::endl;
height = (int)is->Height;
width = (int)is->Width;
isRangePtr= is->Range;
std::pair< long, long > range = std::make_pair(isRangePtr->Start, isRangePtr->End);
//Word::RangePtr r = field->Result;
is->Delete();
//sFullName = "//absolute path.......jpg" ;
// Now AddOleObject
//ishps->AddPicture(sFullName , &vtTrue, &vtTrue, &vtMissing);
sFullName = "//absolute path.......jpg" ;
is = ishps->AddPicture(sFullName , &vtTrue, &vtTrue, &vtMissing);
//is->Range->SetRange(range.first, range.second);
//ishps->AddOLEObject(&vtTypeS , &_variant_t(sFullName), &vtTrue, &vtFalse, &vtMissing, &vtMissing, &vtMissing, &vtMissing);
私はのために& _variant_t(isRangePtr)との最後の引数を交換した場合range私は型の不一致のコンパイルエラーを取得します。私は今なぜCOMインターフェイスの範囲ポインタの_variant_tコンストラクタがあるのではありません。多分そこはありますか?
もう一つの選択肢は、TOPとLEFTプロパティを通して画像の絶対座標を読み取り、範囲なしで挿入することです。しかし、この解決法は、控えめで、なんらかの愚かなものになるでしょう。
本当に助けていただきありがとうございます。
ありがとうございます!
クリス