Excel 2007: XML: задыхаясь от отсутствующего классификатора пространства имен ss: - PullRequest
2 голосов
/ 01 апреля 2011

Попытка создать файл Excel 2007 XML с использованием C # и System.XML.Serialization.Корневой элемент XML-файла Excel таков:

<Workbook xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="urn:schemas-microsoft-com:office:spreadsheet">

Многие элементы в пространстве имен по умолчанию имеют атрибуты, квалифицированные как 'ss', что не нужно, так как и 'ss', и пространство имен по умолчанию оба являются "urn: schemas-microsoft-com: office: spreadsheet ".

Например, элемент Style выглядит следующим образом:

   <Style ss:ID="s21">
      <Font x:Family="Swiss" ss:Bold="1"/>
   </Style>

Когда я создаю свои пространства XmlSerializerNamespaces, я добавляю все пространства имен, которыеExcel хочет:

var ns = new XmlSerializerNamespaces();
ns.Add("", "urn:schemas-microsoft-com:office:spreadsheet");
ns.Add("o", "urn:schemas-microsoft-com:office:office");
ns.Add("x", "urn:schemas-microsoft-com:office:excel");
ns.Add("ss", "urn:schemas-microsoft-com:office:spreadsheet");
ns.Add("html", "http://www.w3.org/TR/REC-html40");

В сгенерированном XML пространство имен "" (по умолчанию) опущено, потому что оно совпадает с 'ss'.

Мой объект стиля - это нечто вроде строкиз: [XmlRoot (Namespace = "urn: schemas-microsoft-com: office: spreadsheet")] открытый класс Styles {[XmlAttribute] открытый идентификатор строки {get;задавать;}

    [XmlAttribute]
    public string Name { get; set; }

    [XmlElement]
    public string Font { get; set; }
}

Когда я на самом деле генерирую XML, я получаю:

<ss:Style ID="s21">
          <ss:Font x:Family="Swiss" Bold="1"/>
</ss:Style>

Я не думаю, что с этим технически что-то не так.Excel не возражает против ss: квалификатора для элементов, но он задыхается, потому что он не может иметь атрибут «ID» стиля.Он должен быть жестко запрограммирован для поиска буквенной строки 'ss: ID'?

Если я опускаю 's' в пространствах имен, он производит более чистый XML, но не устраняет мою ошибку.Я также попытался опустить пространство имен 'ss', а затем установить буквально 'ss' пространство имен объекта Style, но оно генерирует некоторое временное пространство имен с именем 'd4p1' и создает настоящий беспорядок.

Anyидеи о том, как заставить Excel читать корректный XML?

А что касается бонусных отметок, как я могу заставить начало моего XML-файла выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet"?>

Очевидно, что первая часть идет сXML-писатель, но есть ли нехакерские способы получить эту вторую строку?

Спасибо, ~ S

1 Ответ

0 голосов
/ 01 апреля 2011

Вместо того, чтобы писать xml самостоятельно, вы рассматривали возможность использования Open XML SDK 2.0 для Microsoft Office ?Помимо помощи в работе с документами Open XML, он также содержит немало документации и, похоже, хорошо подойдет для вашей задачи:

Open XML SDK 2.0 для Microsoft Office построенповерх API System.IO.Packaging и предоставляет строго типизированные классы деталей для управления документами Open XML.В SDK также используется технология .NET Framework Language-Integrated Query (LINQ) для обеспечения строго типизированного доступа объектов к содержимому XML внутри частей документов Open XML.

...