7

Microsoft Word 14.0 Object Library を使用して .doc ファイルを作成し、段落を追加して保存する C# のプログラムに取り組んでいます。説明されたアクションを実行するボタンを備えた小さなフォームがあります (以下のコードを参照)。この部分は問題ありません。

問題:

作成されたワード ファイルの現在のテキストは次のようになります。

一部のテキスト ベフ = 3.0

私が達成する必要があるのは、下付き文字を含む段落を作成することです(上の段落では、文字「eff」に下付き文字を付ける必要があります):

ここに画像の説明を入力

最終的なドキュメントには、上記のような約 100 行が含まれ、さまざまな文字が下付きになります。

段落全体に行を添える方法を見つけました。

paragraph1.Range.Font.Subscript = 1;

しかし、それを別のキャラクターに実装する方法が見つかりませんでした。

また、Unicode には使用できる下付き文字と数字があることも認識していますが、残念ながら、Unicode には下付き文字形式の完全なアルファベットがないため、これもオプションではありません。

質問: 新しく作成した Word 文書の段落内の下付き文字に「eff」のようなものを挿入して、目標を達成する方法はありますか?

サンプルコード:

private void btnReport_Click(object sender, EventArgs e)
    {

        Word._Application oWord;
        Word._Document oDoc;
        oWord = new Word.Application();
        oDoc = oWord.Documents.Add();


        var paragraph1 = oDoc.Content.Paragraphs.Add();
        paragraph1.Range.Text = "Some text   beff = 3.0";

        SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.Filter = "Word document|*.doc";
        saveFileDialog1.Title = "Save the Word Document";
        if (DialogResult.OK == saveFileDialog1.ShowDialog())
        {
            string docName = saveFileDialog1.FileName;
            if (docName.Length > 0)
            {
                object oDocName = (object)docName;
                oDoc.SaveAs(ref oDocName);
            }
        }
        oWord.Quit();
    }
4

3 に答える 3

6

Word 文書を作成し、下付き文字/上付き文字を含むテキストを追加し、.docx を解凍して XML コンテンツを調べると、下付き文字/上付き文字を含むテキストが別のrun要素に配置されていることがわかります。

これを実現する 1 つの方法は、OpenXML SDKです。SDK をダウンロードしてインストールすると、次のコードを使用できます。

using System;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

namespace OpenXML
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var doc = WordprocessingDocument.Create("C:\\Subscript.docx", WordprocessingDocumentType.Document))
            {
                MainDocumentPart mainPart = doc.AddMainDocumentPart();

                mainPart.Document = new Document();
                Body body = mainPart.Document.AppendChild(new Body());
                Paragraph p = body.AppendChild(new Paragraph());

                p.AppendChild(AddRun(false, "Some text   b "));
                p.AppendChild(AddRun(true, "eff"));
                p.AppendChild(AddRun(false, "= 3.0"));
            }

            Console.WriteLine("Done...");
            Console.ReadLine();
        }

        public static Run AddRun(bool isSubscript, string text)
        {
            Run run = new Run();
            if (isSubscript)
            {
                var props = new RunProperties();
                var fontSize = new FontSizeComplexScript() { Val = "20" };
                var vAlignment = new VerticalTextAlignment() { Val = VerticalPositionValues.Subscript };

                props.Append(fontSize);
                props.Append(vAlignment);
                run.Append(props);
            }
            run.Append(new Text(text));
            return run;
        }
    }
}

編集:

そして、相互運用ソリューションは次のとおりです。

    using WordNS = Microsoft.Office.Interop.Word;

    WordNS.Document doc = _application.ActiveDocument;
    WordNS.Paragraph p = doc.Paragraphs.Add();
    p.Range.Text = "Some text   beff = 3.0";

    int start = p.Range.Text.IndexOf("eff");
    int end = p.Range.Text.IndexOf("=");

    WordNS.Range range = doc.Range(start, end);
    range.Select();

    WordNS.Selection currentSelection = _application.Selection;
    currentSelection.Font.Subscript = 1;

    doc.SaveAs2("C:\\SubscriptInterop.docx");
于 2012-10-26T08:40:07.557 に答える
2

Word で、必要なプロセスをシミュレートする Word マクロを作成します。完了したら、作成された VBA コードを確認します。そのコードは、呼び出す必要がある相互運用機能の動作について、何をどのように行うかを示します。

于 2012-10-22T13:14:17.597 に答える