C# 使用C将HTML内容写入word文档

C# 使用C将HTML内容写入word文档,c#,ms-word,ckeditor,C#,Ms Word,Ckeditor,我正在动态生成word文档,需要使用使用CKeditor控件生成的html内容替换我的特殊标记。这里我使用的word文档是一个包含预输入文本的模板,我使用Microsoft.Office.Interop.word生成文档。现在我可以使用interop的doc.range.find方法找到我的特殊标记。但是当我想用一个HTML内容替换这个标签而不丢失它的样式时。我该怎么做? 使用doc.range.Find.replacement.text是不实际的,因为它只会用html文本替换整个标记 例如:

我正在动态生成word文档,需要使用使用CKeditor控件生成的html内容替换我的特殊标记。这里我使用的word文档是一个包含预输入文本的模板,我使用Microsoft.Office.Interop.word生成文档。现在我可以使用interop的doc.range.find方法找到我的特殊标记。但是当我想用一个HTML内容替换这个标签而不丢失它的样式时。我该怎么做? 使用doc.range.Find.replacement.text是不实际的,因为它只会用html文本替换整个标记

例如: 在我的word文档中,我有一个特殊的标签,如下所示

 ##<Special Conditions Frag>## 
在文档生成过程中,我需要接受来自用户的一些文本,这些文本是通过ckeditor控件输入的。它将是HTML格式,带有body标记和all。我需要在word文档中用上面的特殊条件frag标记替换这个html内容

我的HTML内容如下所示

<html>
 <head>
  <title></title></head>
   <body>
    <p>
 <strong>Sample text</strong>
    </p>
   </body>
</html>

从XML到OOXML,再到互操作,确实有很多可能的变体

一种是使用剪贴板来实现这一点

string html = Clipboard.GetText(TextDataFormat.Html);
您可以在其中操作html字符串,同时将所需的任何html代码发送到剪贴板

//save the html content to a file
File.WriteAllText(temporaryFilePath, html);
您可以将其保存在文件中并打开该文件,您将在浏览器中看到html代码的真正转换

如果要立即将其实现到Word中,可以使用以下内容插入该文件内容:

s.Range.InsertFile(temporaryFilePath);
如果您想浏览所有文档,您可以使用一个循环并检查特定位置的替换

foreach (NetOffice.WordApi.InlineShape s in docWord.InlineShapes)
{
    if (s.Type==NetOffice.WordApi.Enums.WdInlineShapeType.wdInlineShapePicture &&   s.AlternativeText.Contains("|"))
    {
        //save the html content to a file
        File.WriteAllText(temporaryFilePath, html);  
        s.Range.InsertFile(temporaryFilePath);             
    }
}
这是一种将HTML集成到Word中的方法。另一种方法,丑陋的方法,是将html代码转换成图片并插入图片,我不建议这样做。 如果您计划将其扩展到Excel,它的工作方式是相同的,如果您尝试将html实现到Powerpoint中,它将不起作用,但您可以分两步完成。首先将html粘贴到Excel中,选择粘贴的内容并将其粘贴到Powerpoint中,效果良好。如果您粘贴一个表,没问题,只需这样做,然后编写第二个循环来创建一个新表,而不是从Excel复制到Powerpoint中的表

编辑:根据错误 在主要内容中,您应该添加:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

这个问题可以在这里回溯:

谢谢Mike的快速回复。我已经试过使用剪贴板了。当我使用剪贴板时,我遇到了这个错误-在进行OLE调用之前,必须将当前线程设置为单线程单元STA模式。确保主函数上标记了STAThreadAttribute。查看已编辑的注释。您必须在主函数中将属性设置为STAThread。另外,不要忘记在项目中实现这些库。如果无法修复,请尝试设置wordApplication.Application.Visible=true/false;在try/Catch之间,在web应用程序中,我应该在哪里指定[StatThread],有什么想法吗?就在主过程之前。就像我给你的例子一样,同时看看链接。好的,迈克,让我做一些工作,然后让你知道它是否有效。非常感谢你的时间和努力。