Создание документа XML Excel с использованием XDocument

Я пытаюсь создать документ XML Excel, как это

<?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Styles> <Style ss:ID="Default" /></Style> </Styles> <Worksheet ss:Name="Worksheet Name"> <Table> <Row ss:AutoFitHeight="0"> <Cell> <Data ss:Type="String">Test</Data> </Cell> </Row> </Table> </Worksheet> </Workbook> 

Мой текущий результат выглядит следующим образом:

 <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <ss:Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Styles xmlns=""> <Style ss:ID="Default" /> </Styles> <Worksheet ss:Name="Worksheet Name" xmlns=""> <Table> <Row ss:AutoFitHeight="0"> <Cell> <Data ss:Type="String">Test</Data> </Cell> </Row> </Table> </Worksheet> </ss:Workbook> электронная <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <ss:Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Styles xmlns=""> <Style ss:ID="Default" /> </Styles> <Worksheet ss:Name="Worksheet Name" xmlns=""> <Table> <Row ss:AutoFitHeight="0"> <Cell> <Data ss:Type="String">Test</Data> </Cell> </Row> </Table> </Worksheet> </ss:Workbook> электронная <?xml version="1.0"?> <?mso-application progid="Excel.Sheet"?> <ss:Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Styles xmlns=""> <Style ss:ID="Default" /> </Styles> <Worksheet ss:Name="Worksheet Name" xmlns=""> <Table> <Row ss:AutoFitHeight="0"> <Cell> <Data ss:Type="String">Test</Data> </Cell> </Row> </Table> </Worksheet> </ss:Workbook> 

Я не пробовал много разных решений. Мне нужно заменить ss: Workbook with Workbook и избавиться от всего xmlns = "".

Мой текущий код выглядит так (LinqPad):

 void Main() { XNamespace ss = "urn:schemas-microsoft-com:office:spreadsheet"; XNamespace ns = "urn:schemas-microsoft-com:office:spreadsheet"; var workbook = new XElement(ns + "Workbook"); workbook.Add(new XAttribute("xmlns", "urn:schemas-microsoft-com:office:spreadsheet")); workbook.Add(new XAttribute(XNamespace.Xmlns + "o", "urn:schemas-microsoft-com:office:office")); workbook.Add(new XAttribute(XNamespace.Xmlns + "x", "urn:schemas-microsoft-com:office:excel")); workbook.Add(new XAttribute(XNamespace.Xmlns + "ss", "urn:schemas-microsoft-com:office:spreadsheet")); workbook.Add(new XAttribute(XNamespace.Xmlns + "html", "http://www.w3.org/TR/REC-html40")); var styles = new XElement("Styles"); workbook.Add(styles); var style = new XElement("Style"); style.Add(new XAttribute(ss + "ID", "Default")); styles.Add(style); var worksheet = new XElement("Worksheet"); worksheet.Add(new XAttribute(ss + "Name", "Worksheet Name")); workbook.Add(worksheet); var table = new XElement("Table"); worksheet.Add(table); var row = new XElement("Row"); row.Add(new XAttribute(ss + "AutoFitHeight", 0)); table.Add(row); var cell = new XElement("Cell"); var data = new XElement("Data"); data.Add(new XAttribute(ss + "Type", "String")); data.Value = "Test"; cell.Add(data); row.Add(cell); var document = new XDocument(new XDeclaration("1.0", "", null)); document.Add(new XProcessingInstruction("mso-application", "progid=\"Excel.Sheet\"")); document.Add(workbook); var sw = new CustomStringWriter(); document.Save(sw); sw.ToString().Dump(); //sw.ToString().Replace("ss:Workbook", "Workbook").Replace("xmlns=\"\"", "").Dump(); } // Define other methods and classes here class CustomStringWriter : StringWriter { public override Encoding Encoding { get { return null; } } } 

Какие-либо предложения?

Вероятно, ваша проблема заключается в том, что вы не поняли, что пространства имен по умолчанию наследуются от родительских элементов. Возьмите этот XML, например:

 <parent xmlns="http://namespace.com/uri"> <child /> </parent> 

В этом случае у child также есть пространство имен http://namespace.com/uri .

Поэтому причина, по которой ваши элементы Style , Worksheet и т. Д. Имеют xmlns="" состоит в том, что вы явно сказали, что у них нет пространства имен.

Вы должны внести изменения в создание всех этих элементов, чтобы включить правильное пространство имен, например:

 var styles = new XElement(ss + "Styles"); 

Отметим, что LINQ to XML поддерживает гораздо более декларативный подход, чем в настоящее время. Вы можете передать содержимое элемента через конструктор. Таким образом, вы можете переписать бит стилей:

 var styles = new XElement(ss + "Styles", new XElement(ss + "Style", new XAttribute("ID", "Default") ) ); 

Посмотрите эту скрипту, чтобы ваш образец был исправлен и переписан в этом стиле.

  • читать значения excel put в xml
  • Создайте XSD, который можно импортировать в EXCEL с ограничениями на основе значений элементов
  • Команда VBA экспортирует XML в порядке, но не заменяет
  • Как я могу сделать глубокую клонированную строку в файле .xlsx с помощью openXML?
  • Parser для сложного XML-файла
  • xml excel относительный путь
  • Чтение XML с использованием макроса VBA Excel и настройка сгенерированной таблицы
  • получить атрибут имени элемента первого узла из списка узлов
  • Как включить пространство в тег / элемент XML, который преобразуется XSLT в лист Excel
  • Экспорт в файл Excel в формате .zip для уменьшения размера файла. Как сжать xmldata перед отправкой его клиенту?
  • Как экспортировать таблицы Excel в XML, но атрибуты были элементами?
  • Давайте будем гением компьютера.