Каков наилучший способ хранения данных XML в файле Excel - PullRequest
6 голосов
/ 14 декабря 2010

Я ищу способ хранения данных XML в файле Excel. Данные должны быть полностью скрыты для пользователя, они не должны быть в ячейке или комментарии, даже скрыты. Кроме того, данные должны быть сохранены, когда пользователь открывает, а затем сохраняет файл в Excel. Я не ищу способ сопоставления ячеек с внешними данными XML. Данные XML должны быть внутри файла xlsx.

Данные будут вводиться с использованием инструмента C #, а не самого Excel.

Ответы [ 3 ]

6 голосов
/ 14 декабря 2010

Файл .xlsx на самом деле является просто архивом сжатия (zip-файл), поэтому, если вы действительно хотите добавить скрытый файл, вы можете просто добавить файл .xml в архив.Таким образом, Excel даже не узнает, что это было там.

Переименуйте файл .xlsx в .zip, распакуйте его, добавьте свой файл, затем выберите содержимое файла .zip и повторно заархивируйте их.Переименуйте в .xlsx, и у вас там будет скрытый файл .xml.(ПРИМЕЧАНИЕ: не заархивируйте папку верхнего уровня, только ее содержимое)

Вы можете сделать это в C #, используя zip-библиотеку, например SharpZipLib: http://www.sharpdevelop.net/OpenSource/SharpZipLib/

ОБНОВЛЕНИЕ: Этот «скрытый» файл не будет сохранен, если пользователь сохранит файл из Excel.Лучшая идея, которую я могу придумать для этого сценария, - вызвать код как часть макроса VBA, встроенного в лист.

Эта ссылка содержит полезную информацию о манипулировании частями пакета Office: http://msdn.microsoft.com/en-us/library/aa982683.aspx

core.xml и app.xml (в папке docProps) содержат свойства документа и могут быть хорошим местом для хранения дополнительной информации XML.

6 голосов
/ 13 декабря 2011

У меня была такая же проблема, и вот мой код для ее решения, используя Microsoft XML Custom Parts . (Вы можете найти все необходимые объяснения в моих комментариях в коде).

//Deletes all the previously added parts and adds a new part 
//containing the string argument which has to be in XML format. 


public void addCustomXMLPart(string test)
{
    IEnumerator e = Xlworkbook.CustomXMLParts.GetEnumerator();
    e.Reset();
    CustomXMLPart p;
    //The !p.BuiltIn is because before our customXMLPart there are some
    // Excel BuiltIns of them and if we try to delete them we will get an exception.
    while (e.MoveNext())
    {
        p = (CustomXMLPart)e.Current;
        if (p != null && !p.BuiltIn) 
            p.Delete();
    }
    Xlworkbook.CustomXMLParts.Add(test, Type.Missing);
}

Об объекте xlworkbook, используемом выше:

using Excel = Microsoft.Office.Interop.Excel;

Excel.Workbook XlWorkbook = (Excel.Workbook)
  (Excel.Application)Marshal.GetActiveObject("Excel.Application")).ActiveWorkbook;
2 голосов
/ 14 декабря 2010

Excel - это приложение для хранения, обработки и просмотра данных, и поэтому оно не предназначено для хранения произвольных нечитаемых данных. Однако, как вы упомянули, вы можете использовать скрытые поля на отдельном листе, чтобы поместить некоторую информацию.

...