开发者

Create Office Excel Doc with Linq to XML, XMLNS, XDeclaration, Cell formatting (works)

I need to replicate this XML in C# and Linq to XML. I dont want any dependencies to other libraries other than the normal .NET ones. The XML is shown below.

Problem: I can't figure out how to print these two lines:

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

Full XML document:

<?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>
          开发者_如何学JAVA          <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>

Code:

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")
                    )
                )
            )
        );


The second line with <? .... ?> is called a Processing Instruction. The rest is just manipulating namespaces.

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"))
                    )
                )
            )
        )
    );


Completed the question with input from the previous answer. This is just to show you how to get the desired result if anyone searches for this in the future. This is created to be opened in Office Excel. So Linq To XML exported to an .xml file to be able to be opened in Excel easily.

Goal formatting:

<?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>

Code to generate the desired 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;
    } 
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜