3

谁能告诉我如何将 Fontfamily/size 应用于类型的 AltChunk

AlternativeFormatImportPartType.TextPlain

这是我的代码,但我根本不知道该怎么做(即使谷歌也没有帮助)

MainDocumentPart main = doc.MainDocumentPart;
string altChunkId = "AltChunkId" + Guid.NewGuid().ToString().Replace("-", "");
var chunk = main.AddAlternativeFormatImportPart
    (AlternativeFormatImportPartType.TextPlain, altChunkId);

using (var mStream = new MemoryStream())
{
    using (var writer = new StreamWriter(mStream))
    {
        writer.Write(value);
        writer.Flush();
        mStream.Position = 0;
        chunk.FeedData(mStream);
    }
}

var altChunk = new AltChunk();
altChunk.Id = altChunkId;

OpenXmlElement afterThat = null;
foreach (var para in main.Document.Body.Descendants<Paragraph>())
{
    if (para.InnerText.Equals("Notizen:"))
    {
        afterThat = para;
    }
}

main.Document.Body.InsertAfter(altChunk, afterThat);

如果我这样做,我会得到大小为“10,5”的“Courier New”

更新

这是我想出的有效解决方案:

将纯文本转换为 RTF,更改 Fontfamily/size 并将其应用于 WordProcessingDocument!

public static string PlainToRtf(string value)
{
    using (var rtf = new System.Windows.Forms.RichTextBox())
    {
        rtf.Text = value;
        rtf.SelectAll();
        rtf.SelectionFont = new System.Drawing.Font("Calibri", 10);

        return rtf.Rtf;
    }
}

var chunk = main.AddAlternativeFormatImportPart
        (AlternativeFormatImportPartType.Rtf, altChunkId);

using (var mStream = new MemoryStream())
{
    using (var writer = new StreamWriter(mStream))
    {
        var rtf = PlainToRtf(value);
        writer.Write(rtf);
        writer.Flush();
        mStream.Position = 0;
        chunk.FeedData(mStream);
    }
}
//proceed with creating AltChunk and inserting it to the Document...
4

1 回答 1

1

如何将 FontFamily/Size 应用于类型 [TextPlain] 的 AltChunk

恐怕这是不可能的,无论如何,OpenXml SDK 都不可能。

为什么?

altChunk (Anchor for Imported External Content)对象被进一步设计用于导入文档中的内容。它们是“临时”对象:它只是对外部内容的引用,它“按原样”合并到文档中,然后,当使用 Word 打开和保存文档时,Word 会将此外部内容转换为有效的OpenXml 内容。

因此,对于新创建的文档,您不能循环进入段落以检索它并应用样式。

例如,如果您导入rtf内容,则必须rtf在导入之前应用样式。

在纯文本 TextPlain (= Text file .txt) 的情况下,没有样式转换(文本文件没有附加样式,您可以在记事本中更改字体,它将适用于所有文档,这是一个应用程序级别的属性) .

我可以确认 Word 默认会创建一个样式"Courier New 10,5"来显示文件的内容。我刚测试过。

我能做些什么?

使用 Word 打开/保存文档应用样式。请注意,您必须检索段落,或者您可以尝试检索在文档中创建的样式并在此处更改字体。此链接可以帮助实现此目的: 如何:将样式应用于文字处理文档中的段落(Open XML SDK)

或者它可能存在(?)一个类似这样的注册表项,您可以更改它以更改 Word 在您的计算机上的默认行为。即使是这样,它也不能解决第一次在客户端打开的新创建文档的问题。

OP的注意事项:

我认为该问题的一个可能解决方案是将PlainText 转换为RTF 应用StyleInformation,然后将其作为AltChunk 附加到WordProcessingDocument。

我完全同意。请注意,当他说应用 StyleInformation时,它意味着在 rtf 级别。

于 2013-09-12T22:04:35.050 回答