2010-09-01 54 views
5

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

这里是我到目前为止的代码段:

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

回答

1

你不能。我已经和微软一起经历了这一切,Office不会接受剪贴板中的OpenXML格式,也不会从Office以外的任何应用程序中拖放。 (他们还声称Office本身并不使用这种格式,但ClipSpy表明他们这样做 - 以扁平封装格式)。

HTML是您最好的选择。

+0

在ClipSpy *显示格式为* XML,但但是,它不是您声称的OpenXML扁平封装格式 - 如果仔细观察,您会注意到它实际上是2003 XML格式,而不是2007年(及更高版本)的OpenXML扁平封装格式。这两种格式不可互换。 – BrainSlugs83 2013-06-13 03:11:41

+0

@ BrainSlugs83还使用SpreadsheetML格式。但是SpreadsheetML不支持图像,您可以在工作表之间复制/粘贴图像。所以他们也以某种方式提供XLSX。 – 2013-06-13 14:13:49

+0

支持图像的剪贴板对象提供了其他格式 - 这些格式都不是OpenXML扁平包,也不是OpenXML二进制包(zip文件)。尽管有一些Biff格式 - 其中之一是“Biff12”,其中包含一个xlsb(非OpenXML zip文件;可以使用打包API打开,但它包含二进制文件而不是XML)。我还没有看到剪贴板中的任何OpenXML格式。 – BrainSlugs83 2013-06-14 00:15:34

1

我已经手动构建了XML(不是通过OpenXML),这已被Excel接受。

对头部的一些有趣的细节:

通知第二条线。

完整的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/> 
      <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> 

代码发送到剪贴板(VB.Net):

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) 
+0

这会起作用,但该XML与OpenXML SDK不兼容(它是2003格式,而不是OpenXML扁平封装格式)。 – BrainSlugs83 2013-06-13 03:14:08

相关问题