使用Linq to XML,XMLNS,XDeclaration,单元格格式(工作)创建Office Excel文档

时间:2010-12-22 21:04:59

标签: c# .net excel linq-to-xml ms-office

我需要在C#和Linq中将此XML复制到XML。除了正常的.NET之外,我不希望任何依赖于其他库。 XML如下所示。

问题:我无法弄清楚如何打印这两行:

<?mso-application progid="Excel.Sheet"?>
<Data ss:Type="String">name</Data>

完整的XML文档:

<?xml version="1.0" encoding="utf-8" ?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:x="urn:schemas-microsoft-com:office:excel"
  xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml"
  xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
  xmlns:o="urn:schemas-microsoft-com:office:office"
  xmlns:html="http://www.w3.org/TR/REC-html40"
  xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet">
    <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"></OfficeDocumentSettings>
    <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"></ExcelWorkbook>
    <Worksheet ss:Name="Sheet 1">
        <Table>
            <Row>
                <Cell>
                    <Data ss:Type="String">name</Data>
                    </Cell>
                                <Cell>
                    <Data ss:Type="String">status</Data>
                </Cell>
                           </Row>
            <Row>
                <Cell>
                    <Data ss:Type="String">Niike2</Data>
                </Cell>
                <Cell>
                    <Data ss:Type="String">Enabled</Data>
                </Cell>
            </Row>
        </Table>
    </Worksheet>
</Workbook>

代码:

XNamespace ns = "urn:schemas-microsoft-com:office:spreadsheet";
XDocument doc = new XDocument(
    new XDeclaration("1.0", "UTF-8", string.Empty),
        new XComment(String.Format("Exported: {0}", DateTime.Now)),
        new XElement(ns + "Workbook",
            new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
            new XAttribute(XNamespace.Xmlns + "x", "urn:schemas-microsoft-com:office:excel"),
            new XAttribute(XNamespace.Xmlns + "x2", "http://schemas.microsoft.com/office/excel/2003/xml"),
            new XAttribute(XNamespace.Xmlns + "o", "urn:schemas-microsoft-com:office:office"),
            new XAttribute(XNamespace.Xmlns + "html", "http://www.w3.org/TR/REC-html40"),
            new XAttribute(XNamespace.Xmlns + "c", "urn:schemas-microsoft-com:office:component:spreadsheet"),
            new XElement(ns + "Worksheet",
            new XElement(ns + "Table",
                new XElement(ns + "Row",
                    new XElement(ns + "Cell", "name")
                    )
                )
            )
        );

2 个答案:

答案 0 :(得分:5)

第二行&lt;? ....?&gt;被称为处理指令。其余的只是操纵命名空间。

XNamespace ss = "urn:schemas-microsoft-com:office:spreadsheet";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace x = "urn:schemas-microsoft-com:office:excel";
XNamespace x2 = "http://schemas.microsoft.com/office/excel/2003/xml";
XNamespace o = "urn:schemas-microsoft-com:office:office";
XNamespace html = "http://www.w3.org/TR/REC-html40";
XNamespace c = "urn:schemas-microsoft-com:office:component:spreadsheet";

XDocument doc = new XDocument(
        new XDeclaration("1.0", "UTF-8", string.Empty),
        new XComment(String.Format("Exported: {0}", DateTime.Now)),
        new XProcessingInstruction("mso-application", "progid=\"Excel.Sheet\""),        
        new XElement("Workbook",            
            new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
            new XAttribute(XNamespace.Xmlns + "x", "urn:schemas-microsoft-com:office:excel"),
            new XAttribute(XNamespace.Xmlns + "x2", "http://schemas.microsoft.com/office/excel/2003/xml"),
            new XAttribute(XNamespace.Xmlns + "ss", "urn:schemas-microsoft-com:office:spreadsheet"),
            new XAttribute(XNamespace.Xmlns + "o", "urn:schemas-microsoft-com:office:office"),
            new XAttribute(XNamespace.Xmlns + "html", "http://www.w3.org/TR/REC-html40"),
            new XAttribute(XNamespace.Xmlns + "c", "urn:schemas-microsoft-com:office:component:spreadsheet"),
            new XElement("Worksheet", new XAttribute(ss + "Name", "Sheet 1"),               
                new XElement("Table",
                    new XElement("Row",
                        new XElement("Cell",
                            new XElement("Data", new XAttribute(ss + "Type", "String"),"status"))
                    )
                )
            )
        )
    );

答案 1 :(得分:3)

使用上一个答案的输入完成了问题。这只是为了向您展示如果有人在将来搜索这些内容时如何获得所需的结果。创建此项以在Office Excel中打开。因此,Linq To XML导出到.xml文件,以便能够在Excel中轻松打开。

目标格式:

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>
<ss:Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet">
  <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office" />
  <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel" />
  <ss:Worksheet ss:Name="Sheet 1">
    <ss:Table>
      <ss:Row>
        <ss:Cell>
          <ss:Data ss:Type="String">name</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">sku</ss:Data>
        </ss:Cell>
      </ss:Row>
      <ss:Row>
        <ss:Cell>
          <ss:Data ss:Type="String">Suunto Elementum Terra</ss:Data>
        </ss:Cell>
        <ss:Cell>
          <ss:Data ss:Type="String">SS014522000</ss:Data>
        </ss:Cell>
      </ss:Row>
    </ss:Table>
  </ss:Worksheet>
</ss:Workbook>

生成所需XML的代码。

// Linq to XML - Namespaces
XNamespace ns = "urn:schemas-microsoft-com:office:spreadsheet";
XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";
XNamespace x = "urn:schemas-microsoft-com:office:excel";
XNamespace x2 = "http://schemas.microsoft.com/office/excel/2003/xml";
XNamespace ss = "urn:schemas-microsoft-com:office:spreadsheet";
XNamespace o = "urn:schemas-microsoft-com:office:office";
XNamespace html = "http://www.w3.org/TR/REC-html40";
XNamespace c = "urn:schemas-microsoft-com:office:component:spreadsheet";

// Linq to XML - Document
XDocument doc = new XDocument(
    new XDeclaration("1.0", "UTF-8", string.Empty),
    new XProcessingInstruction("mso-application", "progid=\"Excel.Sheet\""),
    new XElement(ns + "Workbook",
        new XAttribute("xmlns", ns.NamespaceName),
        new XAttribute(XNamespace.Xmlns + "xsi", xsi.NamespaceName),
        new XAttribute(XNamespace.Xmlns + "x", x.NamespaceName),
        new XAttribute(XNamespace.Xmlns + "x2", x2.NamespaceName),
        new XAttribute(XNamespace.Xmlns + "ss", ss.NamespaceName),
        new XAttribute(XNamespace.Xmlns + "o", o.NamespaceName),
        new XAttribute(XNamespace.Xmlns + "html", html.NamespaceName),
        new XAttribute(XNamespace.Xmlns + "c", c.NamespaceName),
        new XElement(o + "OfficeDocumentSettings",
            new XAttribute("xmlns", o.NamespaceName)),
        new XElement(x + "ExcelWorkbook",
            new XAttribute("xmlns", x.NamespaceName)),
        new XElement("Worksheet",
            new XAttribute(ss + "Name", "Sheet 1"),
            new XElement("Table", // 1st Table
                new XElement("Row", // First Row
                    new XElement("Cell", // First Cell on First Row
                        new XElement("Data", new XAttribute(ss + "Type", "String"), "name") // Data in Cell A1
                    ),
                    new XElement("Cell",
                        new XElement("Data", new XAttribute(ss + "Type", "String"), "age") // Data in Cell B1
                    )
                )
            )
        )
    )
);
// Loop through a collection. Each iteration is a new row
foreach (Product product in products)
{
    // Linq to XML - Data
    doc.Descendants("Row").First().AddAfterSelf(
        new XElement("Row",
            new XElement("Cell",
                new XElement("Data", new XAttribute(ss + "Type", "String"), product.Name)), // Data in Cell A2
            new XElement("Cell",
                new XElement("Data", new XAttribute(ss + "Type", "String"), product.Age) // Data in Cell B2
            )
        )
    );
}
// Namespace fix. Deletes any empty xmlns="" text in every node.
foreach (XElement e in doc.Root.DescendantsAndSelf())
{ 
    if (e.Name.Namespace == string.Empty) 
    {
        e.Name = ns + e.Name.LocalName;
    } 
}
相关问题