2013-06-12 163 views
2

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

例: 在我的Word文档,我有一个特殊的标记像文档生成过程如下所示

##<Special Conditions Frag>## 

我需要接受来自用户的一些文字,这是通过CKEditor的控制输入(这将是HTML格式与身体标记和所有)。而这个html内容我需要用word文档中以上特殊条件frag标签替换。

我的HTML内容看起来像下面

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

回答

2

从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()); 
    } 

的问题都可以在这里回溯:C# WinForms: How to set Main function STAThreadAttribute

+0

迈克感谢您快速response..I使用剪贴板已经尝试。当我使用剪贴板时,出现此错误 - 在进行OLE调用之前,当前线程必须设置为单线程单元(STA)模式。确保您的Main函数具有标记的STAThreadAttribute。 –

+1

看看编辑的评论。您必须在主函数中将属性设置为STAThread。另外,不要忘记将库实现到您的项目中。如果它不解决,尝试在try/catch – mike27015

+0

之间设置'wordApplication.Application.Visible = true/false;'感谢mike,在web应用程序中我应该在哪里指定[stathread],任何想法? –