.net - ZipArchiveEntry 创建 xlsx 文件,但发现它会丢失 `CompressionOption` 和 `ContentType` 和 `Uri` 和 `Package` 信息
问题描述
我尝试使用ZipArchive
andZipArchiveEntry
创建xlsx文件,但发现它会丢失CompressionOption
andContentType
和Uri
andPackage
信息。
正常信息,例如:
但我使用下面的代码阅读
创建 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?谢谢!
解决方案
使用System.IO.Packaging.ZipPackage
可以解决问题,如下代码逻辑:
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;
}
}
推荐阅读
- r - 通过 IWLS 实现具有两个过离散参数的负二项式
- ocaml - OCaml 中递归返回类型的问题
- metal - 如何根据金属上的视口清除颜色?
- uwp - SkiaSharp SKPaint 导致 AccessViolation 错误
- typescript - 如何使用 redux-thunk 和 TypeScript 调度 ThunkAction
- javascript - React Native/React Navigation:App.js 无限循环加载
- c - GCC 给出的初始化元素不是常量,ARMCC 不是
- python - 如何使用 Numpy 将数组大小从 2D 更改为 3D?
- python - 从 python-kafka 转换为 confluent kafka - 如何使用 SASL_SSL、OAUTHBEARER 和令牌创建奇偶校验
- firebase - 无法使用颤振应用程序访问 Firebase 后端