2017-03-03 27 views
1

私はOpen XML SDKのXMLマッピングを使用してExcelにXMLデータをインポートしようとしていました。OpenXMLでXMLマッピングを使用してxmlをインポート

私はExcel Interopを使用してこれを行う例は複数ありますが、SDKは使用していません。副次的なこととして、私はこれをWordファイルで使用していますが、Excel(WordのCustomXmlPart、ExcelのCustomXmlMappingPart)ではプロシージャが同じではありません。

多分SDKを直接使用することはできません。回避策は名前付き範囲を使用するかもしれませんが、それほど実用的ではありません。

編集: このシナリオでは、データを埋め込むための「テンプレート」として、XMLマッピング(記述されているように作成されたhttps://support.office.com/en-us/article/Import-XML-data-6eca3906-d6c9-4f0d-b911-c736da817fa4?ui=en-US&rs=en-US&ad=US)を持つExcelファイルを使用しています。顧客名、現在の日付なども可能です。

私はこれに類似したものを試しました。 Wordとは対照的に、マッピングはCustomXmlMappingsPartに表示されます。

using (var fileStream = File.Open(@"c:\temp\test.xslx", FileMode.Open)) 
{ 
    SpreadsheetDocument excelDoc = SpreadsheetDocument.Open(fileStream, true); 
    // Only one mapping 
    // When doing this for word, there is a document.MainDocumentPart.CustomXmlParts 
    var mapping = excelDoc.WorkbookPart.GetPartsOfType<CustomXmlMappingsPart>().FirstOrDefault(); 
    XNamespace mappingNS = "http://demoimport.org/xmlimport"; 
    var xmlData = new XElement(mappingNS + "ImportRoot", 
           new XElement(mappingNS + "Customer", "Test Customer Name")); 

    XmlReader reader = xmlData.CreateReader(); 
    reader.MoveToContent(); 

    using (MemoryStream ms = new MemoryStream()) 
    { 
     xmlData.Save(ms); 
     ms.Position = 0; 
     // Corrupts the file 
     // Probably due to CustomXmlMappingsPart 
     mapping.FeedData(ms); 
    } 
} 
+1

あなたが試したことと動作しなかったことを示してから、特定の質問をしてください。あなたが達成しようとしていることを正確に理解することは非常に難しいです。ありがとうございました。 –

+0

ありがとう、私はちょっとした文脈で投稿を編集しました – Adrian

答えて

1

免責事項 - 私はこれはこれを達成するの方法である場合には見当がつかないが、代わりにXMLマッピングパーツ(CustomXmlMappingsPart)と直接作業の私の限られたユースケース

ため、次の作品、 Open XML Productivity Toolを使用して、マップされたセルには、SingleCellTablePartのコレクション内のマッピングのXPathが含まれていることがわかりました。

SingleCellTablePartをすべてトラバースして、一致する要素をXMLファイルで見つけることができます。私はhttps://simpleooxml.codeplex.com/から本当に便利な拡張を発見し、文書にデータを書きました。 は、OpenXML SDKのみを使用して完全に実現することができます。しかし、SDKを使用してセル値を設定することは、思うように自明ではありません。

using (var fileStream = File.Open(@"c:\temp\test.xlsx", FileMode.Open)) 
{ 
    /* Simple xml-file, 
    * <General> 
    * <Customer>Demo Customer</Customer> 
    * </General> 
    */ 
    XDocument doc = XDocument.Load(@"c:\temp\demodata.xml"); 

    SpreadsheetDocument excelDoc = SpreadsheetDocument.Open(fileStream, true); 

    foreach (var workSheet in excelDoc.WorkbookPart.WorksheetParts) 
    { 
     // Note, multiple mappings could exist. For simplicity I expect only one 
     var mappings = workSheet.GetPartsOfType<SingleCellTablePart>().FirstOrDefault(); 
     if (mappings == null) 
      continue; 

     foreach (SingleXmlCell cellMapping in mappings.SingleXmlCells) 
     { 
      if (cellMapping.XmlCellProperties != null && 
       cellMapping.XmlCellProperties.XmlProperties != null) 
      { 
       // cellMapping.XmlCellProperties.XmlProperties.XPath = /General/Customer 
       var matchingNode = doc.XPathSelectElement(cellMapping.XmlCellProperties.XmlProperties.XPath); 
       if(matchingNode != null && !string.IsNullOrEmpty(matchingNode.Value)) 
       { 
        // If a maching node exist, set text value from XML-file 
        // SpreadsheetReader and WorksheetWriter from https://simpleooxml.codeplex.com/ 
        string column = SpreadsheetReader.ColumnFromReference(cellMapping.CellReference.Value); 
        uint row = SpreadsheetReader.RowFromReference(cellMapping.CellReference.Value); 
        WorksheetWriter.PasteText(excelDoc, workSheet, column, row, matchingNode.Value); 
       } 
      } 
     } 
     WorksheetWriter.Save(excelDoc, workSheet); 
    } 
} 
関連する問題