12

私は何時間も探していましたが、これに対する確かな答えを見つけることができないようです。外部データを使用してテキストを編集する必要があるコンテンツコントロールを含む既存のドキュメントがあります。いずれかのコントロールのデータが存在しない場合は、テキストを適切な通知に置き換えて、フォントの色を変更する必要があります。

私はテキストエントリを持っていて、すべてがうまく機能しています。その仕事をしていないように見える唯一の部分は、フォントの色を変更することです。私が持っている現在のコードはエラーを出さず、このメソッドを問題なく実行していますが、完成したドキュメントを見ると、それでも無地の黒いテキストです。

私の色変更方法:(入力は同じタグを持つすべてのコンテンツコントロールのリストです)

public void SetBlueText(List<SdtElement> sdtElement)
{
    foreach (SdtElement element in sdtElement)
    {
        if (element != null)
        {
            RunProperties runProperties = element.Descendants<RunProperties>().FirstOrDefault();
            runProperties.Color = new DocumentFormat.OpenXml.Wordprocessing.Color() { Val = "0EBFE9" };
        }
    }
}

また、これらの2行をこれだけに単純化すると/同じ効果があります

element.Descendants<RunProperties>().FirstOrDefault().Color = 
                        new DocumentFormat.OpenXml.Wordprocessing.Color() { Val = "0EBFE9" };
4

4 に答える 4

16

私は同様の問題に遭遇し、何らかの理由でRunPropertiesオブジェクトにオブジェクトを追加する順序が、フォーマットの更新が機能するかどうかに実際に影響することを発見しました(私が気付いたパターンは、フォーマットを行う前にテキストを追加した場合です。そのテキストのフォーマットは固執しません)。

例:これは機能します(テキストは太字になり、カンブリアの見出し、色は青に設定されます)

Run formattedRun = new Run();
RunProperties runPro = new RunProperties();
RunFonts runFont = new RunFonts() { Ascii = "Cambria(Headings)", HighAnsi = "Cambria(Headings)" };
Bold bold = new Bold();
Text text = new Text("TESTING");
Color color = new Color() { Val = "365F91", ThemeColor = ThemeColorValues.Accent1, ThemeShade = "BF" };
runPro.Append(runFont);
runPro.Append(bold);
runPro.Append(color);
runPro.Append(text);
formattedRun.Append(runPro);

しかし、これはそうではありません(テキストはCambria Headings and Boldになりますが、色は標準の黒のままです)

Run formattedRun = new Run();
RunProperties runPro = new RunProperties();
RunFonts runFont = new RunFonts() { Ascii = "Cambria(Headings)", HighAnsi = "Cambria(Headings)" };
Text text = new Text("TESTING");
Bold bold = new Bold();
Color color = new Color() { Val = "365F91", ThemeColor = ThemeColorValues.Accent1, ThemeShade = "BF" };
runPro.Append(runFont);
runPro.Append(bold);
runPro.Append(text);
runPro.Append(color);
formattedRun.Append(runPro);
于 2013-06-20T18:36:50.900 に答える
6

まあ、私は一種の野蛮人が答えに自分の道を強制しましたが、それはうまくいきます。

List<RunProperties> runProps = element.Descendants<RunProperties>().ToList();
foreach (RunProperties rp in runProps)
{
    rp.Color = new DocumentFormat.OpenXml.Wordprocessing.Color() { Val = "0EBFE9" };
}

誰かがよりエレガントな解決策を持っているなら、それを追加してください、そして私はそれを賛成します。

于 2012-10-31T18:03:10.090 に答える
0

実行時に入力していたWord文書テンプレートにプレーンテキストやその他のコントロールがたくさんあるという意味で、OPに非常によく似たものが必要でした。テキストやその他の書式設定ビットとボブを設定するための拡張メソッドを作成しました。うまくいけば、これは私がしたように困っている人がここに来るのを助けるでしょう:

    public static void ReplaceText(this SdtElement element, string replacementText, bool? isBold = null, bool? isItalic = null, System.Drawing.Color? color = null, VerticalPositionValues? textVerticalType = null, int? fontSizeComplexScript = null)
    {

        // First try to get content blocks from the element
        IEnumerable<SdtContentBlock> childContentBlocks = element.ChildElements.OfType<SdtContentBlock>();

        //Function to generate the new run properties
        RunProperties SetupNewRunProperties(RunProperties oldRunProps) { 

            var props = new RunProperties();

            if (fontSizeComplexScript.HasValue && fontSizeComplexScript.HasValue)
                props.FontSizeComplexScript.Val = fontSizeComplexScript.ToString();
            else if (oldRunProps?.FontSizeComplexScript != null)
                props.FontSizeComplexScript = (FontSizeComplexScript)oldRunProps.FontSizeComplexScript.CloneNode(true);

            if (isBold.HasValue) 
                props.Bold.Val = OnOffValue.FromBoolean(isBold.Value);
            else if(oldRunProps?.Bold != null)
                props.Bold = (Bold)oldRunProps.Bold.CloneNode(true);

            if (isItalic.HasValue)
                props.Italic.Val = OnOffValue.FromBoolean(isItalic.Value);
            else if (oldRunProps?.Italic != null)
                props.Italic = (Italic)oldRunProps.Italic.CloneNode(true);

            if (textVerticalType.HasValue)
                props.VerticalTextAlignment.Val = textVerticalType.Value;
            else if (oldRunProps?.VerticalTextAlignment != null)
                props.VerticalTextAlignment = (VerticalTextAlignment)oldRunProps.VerticalTextAlignment.CloneNode(true);

            if (color.HasValue)
            {
                if (props.Color != null)
                    props.Color.Val = color.Value.ToHexString();
                else
                    props.Color = new Color() { Val = color.Value.ToHexString() };
            }
            else if (oldRunProps?.Color != null)
            {
                props.Color = (Color)oldRunProps?.Color.CloneNode(true);
            }

            return props;
        }

        if (childContentBlocks.Count() > 0)
        {
            SdtContentBlock contentBlock = childContentBlocks.First();
            Paragraph para = contentBlock.ChildElements.OfType<Paragraph>().First();
            if (para != null)
            {
                Run run = para.GetFirstChild<Run>();

                run.RunProperties = SetupNewRunProperties(run.RunProperties);

                Text text = run.GetFirstChild<Text>();
                text.Text = replacementText;
            }
        }
        else
        {
            // Instead, try to get content runs from the element
            IEnumerable<SdtContentRun> childContentRuns = element.ChildElements.OfType<SdtContentRun>();

            if (childContentRuns.Count() > 0)
            {
                Run run = childContentRuns.First().GetFirstChild<Run>();

                run.RunProperties = SetupNewRunProperties(run.RunProperties);

                Text text = run.GetFirstChild<Text>();
                text.Text = replacementText;
            }
        }

    }
于 2020-04-23T12:02:15.487 に答える
-2

色の値は8桁である必要があります。たとえば、Color.Val="FFFF0000"は文字列を赤で表示します。

于 2013-07-22T06:23:14.120 に答える