ラベル office の投稿を表示しています。 すべての投稿を表示
ラベル office の投稿を表示しています。 すべての投稿を表示

2010年4月10日土曜日

Word文書のチェックツール2: 指定以外のフォントが使われている場所を見つける

以前「Word文書のチェックツールを作ってみました→障害だらけ。。。」という記事でWord文書の中で指定されたフォント以外を使っている箇所を自動的に探すことをツールで自動化してみる試みについて書きました。

その中で、Range.MoveにWdUnits.CharacterFormattingを渡したときの挙動が不審だと言いましたが、やっと理解することができました。これは文字スタイルが変更されている箇所まで移動なんですね。そう言われると当たり前な気がしますが、ポイントは段落が変わっても、文字スタイルが「段落フォント」である限り、そこでは止まらないということです。

例えば、2つの段落に「見出し1」「本文」という段落スタイルが適用されていて、見出し1のフォント設定が「創英角ゴシックUB」、本文のフォント設定が「MS Pゴシック」だとしても、その間はCharacterFormattingは同じであると判断されます。うーん。便利なような不便なような。。。いや不便ですね :s

私の中でのイメージでは、段落スタイルと文字スタイルは親子関係にあって、1段落の中に複数の文字スタイルがあり、段落が切れると文字スタイルも一旦切れるものだと思っていました。

でも実際は違うんですね。段落スタイルと文字スタイルは完全に別物なんですね。文字スタイルと段落スタイルの片方だけ追っていても、フォントの変更は検出できないんですね。なんてことだ。。。:(

あと、このフォント一覧検出プロジェクト(!?)で試行錯誤してて思いましたが、マクロでの検索(Find)や移動(Move)って驚くほど遅いですね。びっくりします。

ただ文書を走査するだけなら、XML(WordML)に書き出してからDOM使った方が早いに決まっているんですけどね。それだと文書上の何ページの何行何列か分からないので、こんな手法を取らざるを得ないのです。

痛し痒し。。。

2009年5月30日土曜日

Word2007からBloggerに投稿するテスト

Wordの「新規作成」に「新しいブログの投稿」というメニューがありましたので、試しに投稿してみます。XHTMLっぽく投稿できるのでしょうか。

一部だけ太字にしてみるテスト。これがstrongタグになればOK。

リストを作ってみるテスト

  • リスト項目1
  • リスト項目2

うーん。まずなぜか記事全体をspanで囲っているのがいけてないですね。いきなりXHTML違反です。

でもpタグやstrongタグはちゃんとできているみたい。リストもOK。

Wordには組み込みスタイルとして「HTML アドレス」や「HTML 定義」と言った「HTML~」というスタイルがあります。もしかしたらこれを指定された文字列は自動的に<address>や<dfn>に変換されるのでは!? と期待したら残念、普通に<span style="~">であしらわれてしまいます。

結論: 使えない。

残念です。

2009年4月27日月曜日

参考にしちゃダメ!: PowerPointで曲線を描くときのコツ by Microsoft

図形を描くためだけにマウスの速さ変えろとか、やだよ!!:B

OfficeももうVer.12(=2007)まで出ているというのに、オートシェイプの連続直線や曲線の描きにくさは直る気配がない。いい加減制御点をグリッドにスナップするようにしてほしい。何とかいい方法はないかとググった結果が上記のあり様。。。

図形はPowerPoint2007とInkscapeを行ったり来たりで使ってるけど、PowerPointで直線や曲線が楽に描けるようになったら、簡単な図形ならInkscapeいらなくなるかも。

というか、簡単な図形でもInkscape使わなきゃならない現状を何とかしてくれ!:(

2009年4月6日月曜日

Word文書のチェックツールを作ってみました→障害だらけ。。。

仕事で作成しているWordの文書は日本語は「MS Pゴシック」英数字は「Arial」じゃなきゃダメという書式(フォント)の決まりがあります。そのため、提出前にちゃんと指定されているフォントで書かれているか、ディスプレイをにらみながらチェックします。文字にアンチエイリアシング(or Clear Type)を使っていればパッと見てわかるんですが、そうでない人(何でそうしない??)は、300%ぐらいに拡大してにらみつけています。

まーこんなのちゃんとWordのスタイル機能使って作成していれば、チェックするまでもないんですが、たまにどこぞからコピーしてきた個所があると、コピー元のダメダメな書式が反映されてしまい、検閲に引っ掛かります。

さて、こんな作業に労力も掛けていられないので自動化してしまおうと企みました。VBAでちょちょいとできそうなので。私の場合はVBAではなくC# + COMですが。

要は文書内の「文字スタイル」を頭から走査して、そのフォントを確認すればいいわけです。何の複雑さもないですよねー :)

Word文書の操作を学ぶ

ヘルプを見ると、Word文書(Documentオブジェクト)に対する操作の多くは、操作範囲を表すRangeオブジェクトに対して行うと書いてあります。Excelと同じですね。また、そのRangeを移動するためのNextメソッドというのがあることも分かりました(他にも移動する手立てはたくさんあります)。これはExcelにはないWord独自のものですね。Nextメソッドの引数には、どういう単位で移動するかを表すWdUnits型の引数があります。例えば行単位ならWdUnits.wdRow、段落単位ならWdUnits.wdParagraphといった具合です。具体的なコードは以下の通り。

object wdUnit = WdUnits.wdParagraph;
object value = 1;
while ((range = range.Next(ref wdUnit, ref value)) != null)
{
  ErrorList.Items.Add(range.Text);
}

さらにヘルプを見ると(実際にはVisual StudioのInteliSenseが教えてくれたんですが)、WdUnits.wdCharacterFormattingという値があるじゃないですか。これが文字書式単位で移動するというパラメータのようです。もうこれで8割ぐらいできたも同然です :)

8割できたはずが、大きな壁

ところがどうにもうまく動きません!:o 上記のソースでいえば、range.Textで取ってきた値の一覧を見ると、文字書式毎の一覧になりません。というか、そもそも欠落だらけで、何単位で取ってきたのかもよく分かりません! wdCharacterFormattingがうまく動かない(=バグ)なのかと思い、試しにwdRowを指定してみると、実行時に「引数が違います」と怒られてしまいます。もうわけが分からない!!

WordのVBAに関する情報は少なく、この状況を打開できる術がありません。。純正ヘルプとMSDN以外では、日本語の情報はほとんどありません。

困った困った。。。