将XML数据存储在Excel文件中的最佳方法是什么?

时间:2010-12-14 18:55:58

标签: c# xml excel openxml

我正在寻找一种在Excel文件中存储XML数据的方法。 数据应该完全隐藏给用户,它不应该在单元格或注释中,甚至是隐藏的。 此外,应在用户打开时保留数据,然后使用Excel保存文件。 我不是在寻找一种将单元格映射到外部XML数据的方法。 XML数据应该在xlsx文件中。

将使用C#工具输入数据,而不是Excel本身。

3 个答案:

答案 0 :(得分:6)

.xlsx文件实际上只是一个压缩存档(zip文件),所以如果你真的想要添加一个隐藏文件,那么你只需要将一个.xml文件添加到存档中。这样Excel就不会知道它就在那里。

将.xlsx文件重命名为.zip,解压缩,添加文件,然后选择.zip文件的内容并重新存档。重命名为.xlsx,你将拥有隐藏的.xml文件。 (注意:不要压缩顶级文件夹,只压缩内容)

您可以使用像SharpZipLib这样的zip库在C#中执行此操作: http://www.sharpdevelop.net/OpenSource/SharpZipLib/

更新:如果用户从Excel中保存文件,则不会保留此“隐藏”文件。我可以为该场景提出的最好的想法是调用代码作为工作表中嵌入的VBA宏的一部分。

此链接包含有关操作Office包部分的有用信息:http://msdn.microsoft.com/en-us/library/aa982683.aspx

core.xml和app.xml(在docProps文件夹中)包含文档属性,可能是存储其他xml信息的好位置。

答案 1 :(得分:6)

我遇到了同样的问题,这是我使用Microsoft's Custom XML 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 :(得分:2)

Excel是一种用于存储,操作和查看数据的应用程序,因此,它不是用于存储任意不可读数据的。但是,正如您所提到的,您可以在单独的工作表上使用隐藏字段来放置一些信息。