#.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;
}
}