【问题标题】:What is the best way to store XML data in an Excel file将 XML 数据存储在 Excel 文件中的最佳方法是什么
【发布时间】:2010-12-14 18:55:57
【问题描述】:

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

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

【问题讨论】:

    标签: c# xml excel openxml


    【解决方案1】:

    .xlsx 文件实际上只是一个压缩存档(zip 文件),因此如果您真的想添加一个隐藏文件,那么您只需将一个 .xml 文件添加到存档中即可。这样 Excel 甚至都不知道它的存在。

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

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

    更新:如果用户从 Excel 中保存文件,则不会保留此“隐藏”文件。对于这种情况,我能想到的最好办法是将代码作为嵌入在工作表中的 VBA 宏的一部分来调用。

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

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

    【讨论】:

    • 这会在用户发送Save As ... 之后保留 XML 数据吗?
    • 无论是保存还是另存为,它都无法生存。感谢您注意到这一点。我没有仔细阅读问题的那部分内容。
    • 正确,它不会在 Excel.SaveAs 中存活。但是,Word 允许自定义部分。 Excel中是否有等价物?也许是一种特殊的关系类型?见msdn.microsoft.com/en-us/library/bb608618.aspx
    • 在进一步查看 .xlsx 文件的内容时,似乎其中有一些清单文件。 _rels 和 Content_Types.xml 文件似乎存储了包含在存档中的文件列表及其内容类型。可以在这些文件中添加行以指示在保存文件时应保留自定义 .xml 文件。
    • 找到答案:关系类型必须是customXml。然后 Excel 会保留 xml 数据。
    【解决方案2】:

    我遇到了同样的问题,这是我使用Microsoft's Custom XML Parts 处理它的代码。 (您可以在我的代码中的 cmets 中找到所有必要的解释)。

    //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;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我应该使用嵌入式 OLE 对象吗?还是定制零件?
      • 把这个xml存到文件里的目的是什么?
      猜你喜欢
      • 1970-01-01
      • 2011-05-24
      • 2011-09-14
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2010-10-06
      • 2014-01-23
      • 2016-08-09
      相关资源
      最近更新 更多