在C#中我需要复制的数据网格行到Excel。 由于连续某些值双打,“ -Infinity
”值是可能的。
我试图复制行作为DataFormats.UnicodeText
或DataFormats.Text
但是这给我的输出“ #NAME?
我应该在哪里看到”,“ -Infinity
”(因为Excel自动插入一个“ =
”,在减去之前“ -Infinity
“由于标准单元格式)。
当我格式的单元格为“ Text
粘贴之前”,Excel不会自动插入一个“ =
”的“前-Infinity
”。 顺便说一句,我不需要做Excel中的双重价值任何计算,所以文本的格式将是好的我。
所以我的问题是,如何将数据复制到剪贴板,并将其粘贴到Excel,同时设置单元格格式“文本”。
与原始剪贴簿查看器开始,你可以看到复制
在Excel中剪贴板结果投掷了大量的不同的格式复制到剪贴板。
其中大部分是没有帮助的,但他们中的一些是内部到Excel,这意味着它将(几乎)保证数据将是相同的拷贝。 如果我是你,我可能会针对XML的电子表格 ,或者如果你感觉勇敢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类确实有些奇怪和不那么美妙的事情,当我试图用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);
}
谢谢(你的)信息。 经过一番搜索多,我发现你可以使用.NET剪贴板类,但你不能传递了一个字符串的SetData()。 这对我的作品:
System::Text::UTF8Encoding^ enc = gcnew System::Text::UTF8Encoding();
System::Windows::Forms::Clipboard::SetData("XML Spreadsheet", gcnew MemoryStream(enc->GetBytes(data)));