ZipArchiveEntry для создания файла xlsx, но обнаружил, что в нем будут потеряны `CompressionOption` и `ContentType`, а также `Uri` и `Package` информация

#.net #zip #openxml #ziparchive

#.net #zip #openxml #ziparchive

Вопрос:

Я пытаюсь использовать ZipArchive и ZipArchiveEntry для создания файла xlsx, но обнаружил, что он потерян CompressionOption и ContentType и Uri и Package информация.

обычная информация, такая как :

но я использовал приведенный ниже код и прочитал

создать код xlsx:

 private static FileStream CreateZipFileStream(string path, Dictionary<string, object> filesTree)
{
    using (FileStream stream = new FileStream(path, FileMode.CreateNew))
    {
        using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Create))
        {
            foreach (var fileTree in filesTree)
            {
                ZipArchiveEntry entry = archive.CreateEntry(fileTree.Key);
                using (var zipStream = entry.Open())
                {
                    var bytes = Encoding.ASCII.GetBytes(fileTree.Value.ToString());
                    zipStream.Write(bytes, 0, bytes.Length);
                }
            }
        }
        return stream;
    }
}
 

читать xlsx:

 using (Package xlsxPackage = Package.Open(fileName, FileMode.Open, FileAccess.Read))
{
    var allParts = xlsxPackage.GetParts();
    //...
}
 

Это покажет, что я потерял информацию

Как я могу добавить эту информацию в xlsx? Спасибо!

Ответ №1:

Использование System.IO.Packaging.ZipPackage может решить проблему, как показано ниже code logic :

         private static FileStream CreateZipFileStream(string path, Dictionary<string,ZipPackageInfo> zipPackageInfos)
        {
            using (FileStream stream = new FileStream(path, FileMode.CreateNew))
            using (Package zip = System.IO.Packaging.ZipPackage.Open(stream, FileMode.OpenOrCreate))
            {
                foreach (var p in zipPackageInfos)
                {
                    Uri uri = PackUriHelper.CreatePartUri(new Uri(p.Key, UriKind.Relative));
                    if (zip.PartExists(uri))
                        zip.DeletePart(uri);
                    PackagePart part = zip.CreatePart(uri, p.Value.ContentType,p.Value.CompressionOption);
                    var bytes = Encoding.ASCII.GetBytes(p.Value.Value.ToString());
                    using (Stream dest = part.GetStream())
                        dest.Write(bytes);
                }
                return stream;
            }
        }