【发布时间】:2010-12-14 18:55:57
【问题描述】:
我正在寻找一种将 XML 数据存储在 Excel 文件中的方法。 数据应该对用户完全隐藏,它不应该在单元格或评论中,甚至是隐藏的。 此外,当用户打开并使用 Excel 保存文件时,应保留数据。 我不是在寻找将单元格映射到外部 XML 数据的方法。 XML 数据应该在 xlsx 文件中。
数据将使用 C# 工具输入,而不是 Excel 本身。
【问题讨论】:
我正在寻找一种将 XML 数据存储在 Excel 文件中的方法。 数据应该对用户完全隐藏,它不应该在单元格或评论中,甚至是隐藏的。 此外,当用户打开并使用 Excel 保存文件时,应保留数据。 我不是在寻找将单元格映射到外部 XML 数据的方法。 XML 数据应该在 xlsx 文件中。
数据将使用 C# 工具输入,而不是 Excel 本身。
【问题讨论】:
.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 数据吗?
我遇到了同样的问题,这是我使用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;
【讨论】:
Excel 是用于存储、操作和查看数据的应用程序,因此,它并非旨在存储任意不可读的数据。但是,正如您所提到的,您可以在单独的工作表上使用隐藏字段来放置一些信息。
【讨论】: