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

C#将excel文本格式的数据添加到剪贴板,c#,excel,format,cell,clipboard,C#,Excel,Format,Cell,Clipboard,在C#中,我需要将数据网格行复制到excel。因为行中的某些值是双精度的,所以可以使用“-Infinity”值 我尝试将行复制为数据格式。UnicodeText或数据格式。Text但这给了我输出“#NAME?”,我应该看到“-Infinity”(因为标准单元格格式,excel会自动在“-Infinity”中的减号之前插入“=” 当我在粘贴前将单元格格式化为“文本””时,excel不会自动在“-Infinity”之前插入“=”。顺便说一下,我不需要在excel中使用双值进行任何计算,所以文本格式对

在C#中,我需要将数据网格行复制到excel。因为行中的某些值是双精度的,所以可以使用“
-Infinity
”值

我尝试将行复制为
数据格式。UnicodeText
数据格式。Text
但这给了我输出“
#NAME?
”,我应该看到“
-Infinity
”(因为标准单元格格式,excel会自动在“
-Infinity
”中的减号之前插入“
=

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


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

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

到剪贴板会导致Excel将大量不同格式的文件放到剪贴板

其中大多数都没有帮助,但其中一些是excel内部的,这意味着它将(几乎)保证数据与复制的数据相同。如果我是你,我可能会把目标锁定在XML电子表格上,或者如果你感觉勇敢的话,也就是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剪贴板类,但不能将字符串传递给SetData()。这对我很有用:

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

win32 api解决方案不适合我。我有过随机的车祸。 下面的代码也可以很好地使用unicode字符

var xml = File.ReadAllText(@"..\..\SampleData\Clipboard-Example3.xml");

var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
var dataObject = new DataObject();
dataObject.SetData("XML SpreadSheet", stream);

Clipboard.Clear();
Clipboard.SetDataObject(dataObject);

尝试粘贴
1
tab
2
tab
'-Infinity
我知道这个解决方案,但我不希望单元格中有撇号。难道没有一种剪贴板数据格式,excel会自动假定数据必须被解释为文本吗?这似乎很有趣。如何将其复制到剪贴板中?您使用DataFormats.Html还是“XML电子表格”?我尝试了这两种方法,但Excel拒绝粘贴字符串…@iop我同意,这比应该的要难!我已经包括了一个对我有用的代码示例。这太棒了。伟大代码的一个可爱的起点。有一篇帖子,你帮我省下了很多时间去思考为什么我的剪贴板功能不起作用。现在,请在应用程序内部创建正确的XML。
BIFF12
不幸的是,一些bin部分混合在一起。这是
.xlsb
文件格式。嘿,欢迎使用SO。检查你回答的问题的日期是个好主意。你的答案可能仍然是相关的,因为这里的问题总是出现在搜索结果中,但你回答的问题大约有7年了,在编程中这是一个很长的时间:)嘿,谢谢。我从来没有想到过。也许你可以指引我到一个更好的地方发布此解决方案。我一直在寻找类似的解决方案,但没有成功,并将我的发现(经过数小时的研究)放在一个具有匹配上下文的地方。抱歉,.net和c#不是我的领域,所以我不知道如何帮助解决这个问题。@SoftwareEngineer为现有的、旧的问题添加新的答案是很重要的,因为新的解决方法已经出现或正在被发现/创建。所以不要让问题被问两次,所以唯一的机会就是更新现有的问题,即使是来自遥远的过去。这个问题很久以前就被贴出来了,但是这个问题仍然存在。Excel仍然存在,xml仍然被使用,剪贴板也被广泛使用。甚至谷歌也认为它很重要(这个页面是第一个结果)。因此,请停止告诉人们不要把他们的发现贴在“老”问题上,因为这可能会帮助他人并提高So的质量@谢谢,我知道这是怎么回事,我在这里的时间和你一样长。我还知道,新用户往往没有意识到他们的答案是针对老问题的。我没有告诉Steffan不要在这里发布答案,只是他们应该知道日期。事实上,我明确表示,这个答案可能仍然相关。
var xml = File.ReadAllText(@"..\..\SampleData\Clipboard-Example3.xml");

var stream = new MemoryStream(Encoding.UTF8.GetBytes(xml));
var dataObject = new DataObject();
dataObject.SetData("XML SpreadSheet", stream);

Clipboard.Clear();
Clipboard.SetDataObject(dataObject);