将(xml)文件添加到.xlsx文件中并在“另存为”后保留

时间:2016-10-20 14:36:29

标签: c# excel xlsx

您好我需要将一些数据存储在excel文件(.xlsx)中,以便我可以将文件发送给我们的客户,并在他们将文件发回给我们以更新某些内容时再次从中提取数据。

客户不应该看到我们存储在文件中的数据,当然也无法将其删除(意外)。事实上,他不应该以任何方式意识到这一点。此外,我们还希望在未安装Excel的系统上添加此信息。

我知道.xlsx文件基本上是一个zip文件,因此我可以提取数据并向其中添加文件,再次压缩并拥有一个可以通过Excel打开的有效文件。这里唯一的问题是在Excel中保存该文件后,我的自定义xml文件将从包中删除。所以我需要知道如何解决这个问题。

我有什么:

XNamespace MyNamespace = "http://stackoverflow.com/questions/ask";
XNamespace ExcelNamespace = "http://schemas.openxmlformats.org/package/2006/relationships";
string ExtractionPath = @"C:\temp\test\";
string ExcelFile = @"C:\temp\example.xlsx";

Directory.CreateDirectory(ExtractionPath);
System.IO.Compression.ZipFile.ExtractToDirectory(ExcelFile, ExtractionPath);

var Root = new XElement(MyNamespace + "tracker",
    new XAttribute("version", "1.0.0.1"),
    new XElement("connections"));

var file = Path.Combine(ExtractionPath, "connectioninfo.xml");
if (!File.Exists(file))
{
    var relsPath = Path.Combine(ExtractionPath, "_rels", ".rels");
    var rels = XElement.Load(relsPath);
    rels.Add(new XElement(ExcelNamespace + "Relationship",
        new XAttribute("Id", "XXXX"),
        new XAttribute("Type", "http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml"),
        new XAttribute("Target", "connectioninfo.xml")));
    rels.Save(relsPath);
}
Root.Save(file);

if (File.Exists(ExcelFile)) File.Delete(ExcelFile);
System.IO.Compression.ZipFile.CreateFromDirectory(ExtractionPath, ExcelFile, System.IO.Compression.CompressionLevel.NoCompression, false);

当我运行此代码时,我最终得到一个包含我的connectioninfo.xml文件的文件,我可以在Excel中打开。但是当我在excel中保存该文件并再次解压缩包时,connectioninfo.xml文件就消失了。

所以问题 - >保存后我将文件保存在包中是不是缺少什么?

PS:我也试过以下代码,但同样的问题...... (使用System.IO.Packaging;)

using (Package package = Package.Open(ExcelFile, FileMode.Open, FileAccess.ReadWrite))
{
    Uri uriPartTarget = new Uri("/customXml/example.xml", UriKind.Relative);

    if (!package.PartExists(uriPartTarget))
    {
        PackagePart customXml = package.CreatePart(uriPartTarget,
            "application/vnd.openxmlformats-officedocument.customXmlProperties+xml");

        using (Stream partStream = customXml.GetStream(FileMode.Create,
            FileAccess.ReadWrite))
        {
            var doc = new XElement("test", new XElement("content","Hello world!"));
            doc.Save(partStream);
        }
    }
}

0 个答案:

没有答案