C#添加excel文本格式的数据到剪贴板

在C#中我需要将数据网格行复制到Excel。 由于一行中的某些值是双精度值,所以“ -Infinity ”值是可能的。

我试图复制行作为DataFormats.UnicodeTextDataFormats.Text但这给了我的输出“ #NAME? ”,我应该看到“ -Infinity ”(因为Excel自动插入“ = ”之前减号“ -Infinity “由于标准单元格式)。

在粘贴之前将单元格格式化为“ Text ”时,excel不会在“ -Infinity ”之前自动插入“ = ”。 顺便说一下,我不需要用excel中的double值进行任何计算,所以文本格式对我来说可以。

所以我的问题是如何将数据复制到剪贴板并将其粘贴到Excel中,同时将单元格格式设置为“文本”。

从原始剪贴板查看器开始,您可以看到复制

Excel剪辑

到剪贴板导致在Excel中向剪贴板投掷大量不同的格式。

在这里输入图像说明

这些大多数都没有帮助,但其中一些是内部的,这意味着它将(几乎)保证数据将与复制相同。 如果我是你,我可能会定位XML SpreadSheet,或者如果你感觉勇敢的Biff12这也是XML(但压缩)。 这将使您比普通文本更能控制粘贴。

上面的剪辑就是一个例子

 <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Styles> <Style ss:ID="Default" ss:Name="Normal"> <Alignment ss:Vertical="Bottom"/> <Borders/> <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="11" ss:Color="#000000"/> <Interior/> <NumberFormat/> <Protection/> </Style> <Style ss:ID="s63"> <NumberFormat ss:Format="@"/> </Style> </Styles> <Worksheet ss:Name="Sheet1"> <Table ss:ExpandedColumnCount="2" ss:ExpandedRowCount="2" ss:DefaultRowHeight="15"> <Row> <Cell><Data ss:Type="Number">1</Data></Cell> <Cell><Data ss:Type="Number">2</Data></Cell> </Row> <Row> <Cell><Data ss:Type="String">Test</Data></Cell> <Cell ss:StyleID="s63"><Data ss:Type="String" x:Ticked="1">-Infinity</Data></Cell> </Row> </Table> </Worksheet> </Workbook> 

所以看起来更深一点…看起来.Net剪贴板类做了一些奇怪的事情,当我试图使用Clipboard.SetData将xml写入剪贴板 剪贴板数据

剪贴板以一个箔条装载开始。 这当然会导致Excel拒绝剪贴板内容。

为了解决这个问题,我使用Windows API(user32)调用来处理剪贴板

  [DllImport("user32.dll", SetLastError = true)] static extern uint RegisterClipboardFormat(string lpszFormat); [DllImport("user32.dll")] static extern IntPtr SetClipboardData(uint uFormat, IntPtr hMem); [DllImport("user32.dll", SetLastError = true)] static extern bool CloseClipboard(); [DllImport("user32.dll", SetLastError = true)] static extern bool OpenClipboard(IntPtr hWndNewOwner); private static void XMLSpreadSheetToClipboard(String S) { var HGlob = Marshal.StringToHGlobalAnsi(S); uint Format = RegisterClipboardFormat("XML SpreadSheet"); OpenClipboard(IntPtr.Zero); SetClipboardData(Format, HGlob); CloseClipboard(); Marshal.FreeHGlobal(HGlob); } 

谢谢(你的)信息。 经过一些更多的search,我发现你可以使用.Net剪贴板类,但是你不能传递一个string到SetData()。 这适用于我:

 System::Text::UTF8Encoding^ enc = gcnew System::Text::UTF8Encoding(); System::Windows::Forms::Clipboard::SetData("XML Spreadsheet", gcnew MemoryStream(enc->GetBytes(data)));