使用Linq创buildOffice Excel文档到XML,XMLNS,XDeclaration,单元格格式(工作)

我需要在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") ) ) ) ); 

第二行用<? ….?>被称为处理指令。 剩下的只是操作命名空间。

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

用前一个答案的input完成了这个问题。 这只是为了告诉你如果有人在未来search这个如何得到期望的结果。 这是创build将在Office Excel中打开。 所以Linq把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; } }