1

ある種のテンプレートWordファイル(.dotではない)にOpenXMLを入力しています。私が遭遇した問題は、ドキュメントに新しいテキストを追加するときに、Wordドキュメントのデフォルトのフォントとフォントサイズを使用することです。追加する段落のフォントとサイズ、または追加する既存のテーブルの形式を使用したかったのです。

私は1つの方法を見つけましたが、それは良い方法ではないと思います。それで...それを行うためのより良い方法はありますか?

これは段落からです

    private RunProperties GetRunPropertyFromParagraph(Paragraph paragraph)
    {
        var runProperties = new RunProperties();
        var fontname = "Calibri";
        var fontSize = "18";
        try
        {
            fontname =
                paragraph.GetFirstChild<ParagraphProperties>()
                         .GetFirstChild<ParagraphMarkRunProperties>()
                         .GetFirstChild<RunFonts>()
                         .Ascii;
        }
        catch
        {
            //swallow
        }
        try
        {
            fontSize =
                paragraph.GetFirstChild<Paragraph>()
                         .GetFirstChild<ParagraphProperties>()
                         .GetFirstChild<ParagraphMarkRunProperties>()
                         .GetFirstChild<FontSize>()
                         .Val;
        }
        catch
        {
            //swallow
        }
        runProperties.AppendChild(new RunFonts() { Ascii = fontname });
        runProperties.AppendChild(new FontSize() { Val = fontSize });
        return runProperties;
    }

そしてこれはTableCellから

    private RunProperties GetRunPropertyFromTableCell(TableRow rowCopy, int cellIndex)
    {
        var runProperties = new RunProperties();
        var fontname = "Calibri";
        var fontSize = "18";
        try
        {
            fontname =
                rowCopy.Descendants<TableCell>()
                       .ElementAt(cellIndex)
                       .GetFirstChild<Paragraph>()
                       .GetFirstChild<ParagraphProperties>()
                       .GetFirstChild<ParagraphMarkRunProperties>()
                       .GetFirstChild<RunFonts>()
                       .Ascii;
        }
        catch
        {
            //swallow
        }
        try
        {
            fontSize =
                   rowCopy.Descendants<TableCell>()
                          .ElementAt(cellIndex)
                          .GetFirstChild<Paragraph>()
                          .GetFirstChild<ParagraphProperties>()
                          .GetFirstChild<ParagraphMarkRunProperties>()
                          .GetFirstChild<FontSize>()
                          .Val;
        }
        catch
        {
            //swallow
        }
        runProperties.AppendChild(new RunFonts() { Ascii = fontname });
        runProperties.AppendChild(new FontSize() { Val = fontSize });
        return runProperties;
    }

コードは機能します。少なくとも私が試した文書では。しかし、それはひどい方法のように思えますが、私はより良い解決策を見つけられなかったので、もしあなたがそれを持っているなら共有してください:)

4

1 に答える 1

0

私は次のようにします: Run を更新または置換するときは、古いものを削除するとき、要素に子があるかどうか、次に「RunProperties」である子があるかどうかを確認します。存在する場合は、それらのプロパティを保存し、古いものを削除した後に新しい Run に追加します。

まだ失敗していません。

var bkms = YourBookmarkStart;
OpenXmlElement elem = bkms.NextSibling();
RunProperties oldRunProperties = null;
while (elem != null && !(elem is BookmarkEnd))
{
    OpenXmlElement nextElem = elem.NextSibling();
    if (elem.HasChildren)
    {
        try
        {
             oldRunProperties = (RunProperties)elem.GetFirstChild<RunProperties>().Clone();
        }
        catch { }
    }
    if (!(elem is BookmarkStart))
        elem.Remove();
    elem = nextElem;
}

Run r = new Run(new Text(newText));
if (oldRunProperties != null) r.PrependChild<RunProperties>(oldRunProperties);
bkms.Parent.InsertAfter<Run>(r, bkms);

与えられた段落が持っている実行プロパティを取得する必要があります。

于 2013-03-27T18:06:57.677 に答える