Как мне вставить OpenXML в буфер обмена, чтобы он вставлялся в Excel? - PullRequest
5 голосов
/ 01 сентября 2010

Я создаю OpenXml, используя библиотеку DocumentFormat.OpenXML от Microsoft.Я пытаюсь выяснить, как вставить этот документ в буфер обмена, чтобы я мог вставить свои данные в Excel (как если бы они были скопированы из Excel).Я могу видеть форматированные данные OpenXml, поступающие из Excel, когда я копирую из 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);

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Я создал 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)
1 голос
/ 25 мая 2011

Вы не можете. Я прошел через это с Microsoft, и Office не примет формат OpenXML в буфере обмена или перетаскивание из любого приложения, кроме Office. (Они также утверждают, что Office сам не использует этот формат, но ClipSpy показывает, что они используют - в формате плоского пакета.)

HTML - ваш лучший выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...