C#添加Excel文本格式的数据到剪贴板(C# Add excel text-formatted d

2019-08-19 01:07发布

在C#中我需要复制的数据网格行到Excel。 由于连续某些值双打,“ -Infinity ”值是可能的。

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

当我格式的单元格为“ Text粘贴之前”,Excel不会自动插入一个“ = ”的“前-Infinity ”。 顺便说一句,我不需要做Excel中的双重价值任何计算,所以文本的格式将是好的我。

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

Answer 1:

与原始剪贴簿查看器开始,你可以看到复制

在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);
    }


Answer 2:

谢谢(你的)信息。 经过一番搜索多,我发现你可以使用.NET剪贴板类,但你不能传递了一个字符串的SetData()。 这对我的作品:

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


文章来源: C# Add excel text-formatted data to clipboard