gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:47:42 27 4
gpt4 key购买 nike

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

我尝试将行复制为 DataFormats.UnicodeTextDataFormats.Text 但这给了我输出“#NAME? ” 我应该看到“-Infinity”的位置(因为 excel 会自动在“-Infinity”的减号前插入一个“=”,因为标准单元格格式)。

当我在粘贴前将单元格格式化为“Text”时,excel 不会自动在“-Infinity”之前插入“=” ”。顺便说一句,我不需要在 excel 中对 double 值进行任何计算,因此文本格式对我来说没问题。

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

最佳答案

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

Excel Snip

到剪贴板导致 Excel 将大量不同的格式扔到剪贴板。

enter image description here

其中大部分都没有帮助,但其中一些是 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>

所以看起来更深一点......当我尝试使用 Clipboard.SetData 将 xml 写入剪贴板时,.Net Clipboard 类似乎做了一些奇怪而不是那么美妙的事情 Clipboard Data

剪贴板一开始是一堆杂乱无章的东西。这当然会导致 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);
}

关于C# 将 excel 文本格式的数据添加到剪贴板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15764828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com