Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将OpenXML放到剪贴板上,以便粘贴到Excel中?_C#_Excel_Clipboard_Openxml - Fatal编程技术网

C# 如何将OpenXML放到剪贴板上,以便粘贴到Excel中?

C# 如何将OpenXML放到剪贴板上,以便粘贴到Excel中?,c#,excel,clipboard,openxml,C#,Excel,Clipboard,Openxml,我正在使用Microsoft的DocumentFormat.OpenXml库生成OpenXml。我想弄清楚如何把这个文档放到我的剪贴板上,这样我就可以把我的数据粘贴到Excel中(就像它是从Excel复制的一样)。当我从Excel中复制时,我能够看到OpenXml格式的数据从Excel中出来。我需要做相反的事情,从WPF应用程序中复制,并使用高级Excel格式粘贴到Excel中(因此需要OpenXML) 以下是我到目前为止的一个片段: MemoryStream documentStream =

我正在使用Microsoft的DocumentFormat.OpenXml库生成OpenXml。我想弄清楚如何把这个文档放到我的剪贴板上,这样我就可以把我的数据粘贴到Excel中(就像它是从Excel复制的一样)。当我从Excel中复制时,我能够看到OpenXml格式的数据从Excel中出来。我需要做相反的事情,从WPF应用程序中复制,并使用高级Excel格式粘贴到Excel中(因此需要OpenXML)

以下是我到目前为止的一个片段:

MemoryStream documentStream = new MemoryStream();
  SpreadsheetDocument spreadsheet = SpreadsheetDocument.Create(documentStream, SpreadsheetDocumentType.Workbook, true);

  // create the workbook
  spreadsheet.AddWorkbookPart();
  Stream workbookStream = spreadsheet.WorkbookPart.GetStream();
  spreadsheet.WorkbookPart.Workbook = new Workbook();     // create the worksheet
  spreadsheet.WorkbookPart.AddNewPart<WorksheetPart>();
  spreadsheet.WorkbookPart.WorksheetParts.First().Worksheet = new Worksheet();

  ...

  const string SPREADSHEET_FORMAT = "XML Spreadsheet";
  Clipboard.SetData(SPREADSHEET_FORMAT, clipboardData);
MemoryStream documentStream=new MemoryStream();
SpreadsheetDocument电子表格=SpreadsheetDocument.Create(documentStream,SpreadsheetDocumentType.Workbook,true);
//创建工作簿
电子表格。AddWorkbookPart();
Stream workbookStream=电子表格.WorkbookPart.GetStream();
电子表格.WorkbookPart.Workbook=新工作簿();//创建工作表
电子表格.WorkbookPart.AddNewPart();
电子表格.WorkbookPart.WorksheetParts.First().Worksheet=新工作表();
...
常量字符串电子表格\u FORMAT=“XML电子表格”;
剪贴板.SetData(电子表格格式,剪贴板数据);

你不能。我已经和微软讨论过这个问题,Office不会接受剪贴板中的OpenXML格式,也不会从Office以外的任何应用程序拖放。(他们还声称Office本身不使用这种格式,但ClipSpy显示他们使用了这种格式,即扁平包格式。)


HTML是最好的选择。

我已经手动构建了XML(不是通过OpenXML),excel已经接受了这一点

关于标题的一些有趣细节:

注意第二行

我发送的完整XML(用于测试):


ClipSpy中显示的格式是XML,但它不是您声称的OpenXML平面包格式——如果仔细看,您会发现它实际上是2003年的XML格式,而不是2007年(以及更高版本)的OpenXML平面包格式。这两种格式不可互换。@s83也使用电子表格ML格式。但是,SpreadsheetML不支持图像,您可以在工作表之间复制/粘贴图像。因此,他们也以某种方式提供了XLSX。剪贴板对象提供了支持图像的其他格式——这些格式都不是OpenXML平面包,也不是OpenXML二进制包(zip文件)。不过有几种Biff格式——其中一种是“Biff12”,它包含一个xlsb(一个非OpenXML zip文件;它可以用打包API打开,但它包含二进制文件而不是XML)。我在剪贴板中没有看到任何OpenXML格式。这将起作用,但XML与OpenXMLSDK不兼容(它是2003格式,而不是OpenXML平面包格式)。
<?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/>
            <Interior/>
            <NumberFormat/>
            <Protection/>
        </Style>
        <Style ss:ID="s21">
            <NumberFormat ss:Format="Currency"/>
        </Style>
        <Style ss:ID="s22">
            <Interior ss:Color="#FFFF00" ss:Pattern="Solid"/>
        </Style>
    </Styles>
    <Worksheet ss:Name="Sheet2">
        <Table ss:ExpandedColumnCount="256" ss:ExpandedRowCount="65536"
         x:FullColumns="1" x:FullRows="1" ss:DefaultRowHeight="13.2">
            <Row>
                <Cell>
                    <Data ss:Type="String">test</Data>
                </Cell>
                <Cell ss:StyleID="s21">
                    <Data ss:Type="Number">1.12</Data>
                </Cell>
                <Cell>
                    <Data ss:Type="Number">1.1213</Data>
                </Cell>
                <Cell ss:StyleID="s21">
                    <Data ss:Type="Number">12.12121</Data>
                </Cell>
                <Cell ss:StyleID="s22">
                    <Data ss:Type="String">test</Data>
                </Cell>
            </Row>
        </Table>
    </Worksheet>
</Workbook>
Dim xml As String = File.ReadAllText("excel.xml")

Dim xmlStream As Stream = New MemoryStream()
xmlStream.Write(System.Text.ASCIIEncoding.ASCII.GetBytes(xml), 0, xml.Length)
Clipboard.SetData("XML Spreadsheet", xmlStream)