2010-09-01 81 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

相關問題