C# 在OpenXML中使用xml映射导入xml

C# 在OpenXML中使用xml映射导入xml,c#,excel,openxml,C#,Excel,Openxml,我一直在尝试使用OpenXMLSDK中的XML映射将XML数据导入Excel 我发现了多个使用Excel Interop但不使用SDK进行此操作的示例。作为旁注,我对Word文件进行了此操作,但在Excel中的过程不同(Word中的CustomXmlPart,Excel中的CustomXmlMappingPart) 也许直接使用SDK是不可能的。解决方法可能是使用命名范围,但我发现这不太实际 编辑: 该场景使用一个带有XML映射(按照描述创建)的Excel文件作为“模板”来填充数据。可以是客户名

我一直在尝试使用OpenXMLSDK中的XML映射将XML数据导入Excel

我发现了多个使用Excel Interop但不使用SDK进行此操作的示例。作为旁注,我对Word文件进行了此操作,但在Excel中的过程不同(Word中的CustomXmlPart,Excel中的CustomXmlMappingPart)

也许直接使用SDK是不可能的。解决方法可能是使用命名范围,但我发现这不太实际

编辑: 该场景使用一个带有XML映射(按照描述创建)的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);
   }   
}
使用(var fileStream=File.Open(@“c:\temp\test.xslx”,FileMode.Open))
{
SpreadsheetDocument excelDoc=SpreadsheetDocument.Open(fileStream,true);
//只有一个映射
//对word执行此操作时,会出现document.MainDocumentPart.CustomXmlParts
var mapping=excelDoc.WorkbookPart.GetPartSoftType().FirstOrDefault();
XNamespace mappingNS=”http://demoimport.org/xmlimport";
var xmlData=new-XElement(mappingNS+“ImportRoot”,
新XElement(mappingNS+“客户”、“测试客户名称”);
XmlReader=xmlData.CreateReader();
reader.MoveToContent();
使用(MemoryStream ms=new MemoryStream())
{
xmlData.Save(ms);
ms.Position=0;
//破坏文件
//可能是因为CustomXmlMappingsPart
映射。FeedData(ms);
}   
}

免责声明-我不知道这是否是实现这一点的方法,但以下内容适用于我有限的用例

我没有直接使用XML映射部件(
CustomXmlMappingsPart
),而是使用开放式XML生产力工具,发现映射的单元格在
SingleCellTablePart
的集合中包含用于映射的XPath

可以遍历所有
SingleCellTablePart
,在XML文件中找到匹配的元素。我从中找到了一个非常有用的扩展来将数据写入文档。信息技术 只有使用OpenXMLSDK才能完全实现。但是我发现使用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);
    }
}
使用(var fileStream=File.Open(@“c:\temp\test.xlsx”,FileMode.Open))
{
/*简单的xml文件,
* 
*演示客户
* 
*/
XDocument doc=XDocument.Load(@“c:\temp\demodata.xml”);
SpreadsheetDocument excelDoc=SpreadsheetDocument.Open(fileStream,true);
foreach(excelDoc.WorkbookPart.WorksheetParts中的var工作表)
{
//注意,可能存在多个映射。为了简单起见,我只希望有一个映射
var mappings=workSheet.GetPartsOfType().FirstOrDefault();
if(映射==null)
继续;
foreach(mappings.SingleXmlCells中的SingleXmlCellMapping)
{
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))
{
//如果存在加工节点,则从XML文件设置文本值
//来自的电子表格阅读器和工作表编写器https://simpleooxml.codeplex.com/
string column=SpreadsheetReader.ColumnFromReference(cellMapping.CellReference.Value);
uint row=电子表格阅读器.RowFromReference(cellMapping.CellReference.Value);
WorksheetWriter.PasteText(Excel文档、工作表、列、行、matchingNode.Value);
}
}
}
工作表编写器保存(Excel文档,工作表);
}
}

请说明您尝试了哪些方法,哪些方法无效,然后提出具体问题。很难准确地理解你想要达到的目标。谢谢,谢谢,我已经编辑了更多的内容