Создание документа Office Excel с Linq to XML, XMLNS, XDeclaration, форматирование ячеек (работает) - PullRequest
2 голосов
/ 23 декабря 2010

Мне нужно скопировать этот XML в C # и Linq в 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 ]

5 голосов
/ 23 декабря 2010

вторая строка сназывается Инструкцией обработки.Остальное - просто манипулирование пространствами имен.

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"))
                    )
                )
            )
        )
    );
3 голосов
/ 20 января 2011

Завершен вопрос с вводом из предыдущего ответа.Это просто, чтобы показать вам, как получить желаемый результат, если кто-то ищет его в будущем.Это создано для открытия в 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;
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...