Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将html格式的字符串复制到剪贴板_C#_Html_Winforms_Office Interop - Fatal编程技术网

C# 无法将html格式的字符串复制到剪贴板

C# 无法将html格式的字符串复制到剪贴板,c#,html,winforms,office-interop,C#,Html,Winforms,Office Interop,我正在尝试将html格式的字符串从数据库复制到word文档。我需要能够像子弹一样恢复格式。使用下面的代码,我得到一个异常 “指定的数据类型不可用。” 下面是复制到剪贴板并写入word文档的代码 DataObject clipDO = new DataObject(); clipDO.SetData(DataFormats.Html, HtmlClipboardData(temp)); Thread thread = new Thread(() => Clipboard.SetDataObj

我正在尝试将html格式的字符串从数据库复制到word文档。我需要能够像子弹一样恢复格式。使用下面的代码,我得到一个异常

“指定的数据类型不可用。”

下面是复制到剪贴板并写入word文档的代码

DataObject clipDO = new DataObject();
clipDO.SetData(DataFormats.Html, HtmlClipboardData(temp));
Thread thread = new Thread(() => Clipboard.SetDataObject(clipDO, true));
thread.ApartmentState = ApartmentState.STA;
thread.Start();
thread.Join();
Microsoft.Office.Interop.Word.Paragraph oPara = wordApp.Selection.Paragraphs.Add(ref oMissing);
object pasteType = WdPasteDataType.wdPasteHTML;
oPara.Range.PasteSpecial(ref oMissing, ref oMissing, ref oMissing, ref oMissing, pasteType, ref oMissing, ref oMissing);
代码现在停止工作。当它在早期工作时,它不会将html复制到剪贴板。它将写入word文档,即剪贴板上以前的内容。 下面是我的助手向html字符串添加标题的方法

    private static string HtmlClipboardData(string html)
    {
        StringBuilder sb = new StringBuilder();
        Encoding encoding = Encoding.GetEncoding("utf-8");
        string Header = @"
        Version: 1.0
        StartHTML: {0:000000}
        EndHTML: {1:000000}
        StartFragment: {2:000000}
        EndFragment: {3:000000}
        ";
        string HtmlPrefix = @"
        !DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.0 Transitional//TR""
        html
        head
        meta http-equiv=Content-Type content=""text/html; charset={0}""
        head
        body
        !--StartFragment--
        ";
        HtmlPrefix = string.Format(HtmlPrefix, encoding.WebName);

        string HtmlSuffix = @"
        <!--EndFragment-->
        </body>
        </html>
        ";

        // Get lengths of chunks
        int HeaderLength = encoding.GetByteCount(Header);
        HeaderLength -= 16; // extra formatting characters {0:000000}
        int PrefixLength = encoding.GetByteCount(HtmlPrefix);
        int HtmlLength = encoding.GetByteCount(html);
        int SuffixLength = encoding.GetByteCount(HtmlSuffix);

        // Determine locations of chunks
        int StartHtml = HeaderLength;
        int StartFragment = StartHtml + PrefixLength;
        int EndFragment = StartFragment + HtmlLength;
        int EndHtml = EndFragment + SuffixLength;

        // Build the data
        sb.AppendFormat(Header, StartHtml, EndHtml, StartFragment, EndFragment);
        sb.Append(HtmlPrefix);
        sb.Append(html);
        sb.Append(HtmlSuffix);
        return sb.ToString();
    }
私有静态字符串HtmlClipboardData(字符串html)
{
StringBuilder sb=新的StringBuilder();
Encoding Encoding=Encoding.GetEncoding(“utf-8”);
字符串头=@“
版本:1.0
StartHTML:{0:000000}
EndHTML:{1:000000}
开始片段:{2:000000}
尾端片段:{3:000000}
";
字符串HtmlPrefix=@”
!DOCTYPE HTML PUBLIC”“-//W3C//DTD HTML 4.0//TR”
html
头
meta http equiv=Content Type Content=”“text/html;charset={0}”
头
身体
!--StartFragment--
";
HtmlPrefix=string.Format(HtmlPrefix,encoding.WebName);
字符串HtmlSuffix=@”
";
//获取块的长度
int HeaderLength=encoding.GetByteCount(标头);
HeaderLength-=16;//额外的格式字符{0:000000}
int PrefixLength=encoding.GetByteCount(HtmlPrefix);
int-HtmlLength=encoding.GetByteCount(html);
int-subfixlength=encoding.GetByteCount(HtmlSuffix);
//确定块的位置
int StartHtml=车头长度;
int STARTFRAMENT=起始TML+前置桥长度;
int EndFragment=StartFragment+HtmlLength;
int-EndHtml=EndFragment+后缀长度;
//构建数据
sb.AppendFormat(Header、StartHtml、EndHtml、StartFragment、EndFragment);
sb.追加(HtmlPrefix);
sb.Append(html);
sb.Append(HtmlSuffix);
使某人返回字符串();
}

问题是html字符串没有复制到剪贴板。当我的剪贴板中已经有一些特殊内容(如从命令提示符复制的内容)时,PasteSpecial可以工作并将这些数据粘贴到我的word文档中

尝试使用DataFormats.Text来代替。

你为什么要在线程上工作?这是什么类型的应用程序(控制台、winforms、WPF)?还有,抛出错误的是哪条线?粘贴行或剪贴板设置行?这在asp.net应用程序中。我是在线程中这样做的,因为否则我会得到“在进行OLE调用之前,当前线程必须设置为单线程单元(STA)模式。请确保主函数上标记了STAThreadAttribute。”异常。问题是,我无法通过代码将内容复制到剪贴板。使用剪贴板和ASP.net应用程序中的word,您正在寻求一个充满伤害的世界。首先,word在服务器上不受支持,并且有一个例子解释了您可能遇到的各种问题。此外,通过使用全局剪贴板,如果您的系统中有多个用户,您可能会遇到竞争条件。我的建议是寻找可以在服务器上以线程安全(非UI)方式创建文档的替代方案`“但是HtmlSuffix确实如此,我认为这不仅仅是文章中的格式问题。如果这就是代码的样子,那么这个问题对于特定的程序来说是独一无二的。如果提供了函数返回内容的示例,那么问题可能很明显。