Open XML SDK添加TIFF格式ImagePart时生成.bin文件问题求助
问题描述
我用电子表格输入文件、MemoryStream、Open XML SDK及ImageMagick开发了一套图片替换流程:
- 读取电子表格中嵌入图片的流
- 将流转换为TIFF格式
- 将新图片作为文件及新ImagePart嵌入包中
- 修改图片控件(
Blip.Embed)的关联,从旧图片指向新图片 - 删除旧ImagePart移除旧图片
所有功能运行正常,但通过内存流创建的新嵌入文件被保存为image.bin而非预期的image.tiff,即便我已经指定了ImagePartType.Tiff:
ImagePart new_ImagePart = worksheetPart.AddImagePart(ImagePartType.Tiff);
生成的ImagePart Uri为xl/media/image.bin,提取后修改扩展名.tiff能正常打开,TIFF格式合规,Excel中图片也能正常显示,但需要修正底层文件扩展名的问题。待转换的原始嵌入文件(Excel保存的jpg/png)在包中都有正确扩展名。
解决方案
问题出在AddImagePart(ImagePartType)的默认逻辑上,它不会自动根据指定的类型生成对应扩展名的文件名。要在创建ImagePart时直接指定目标Uri,就能让包内文件使用正确的.tiff扩展名。
实现步骤
- 生成不重复的目标文件名(避免和现有媒体文件冲突)
- 使用带TargetUri参数的
AddImagePart重载创建ImagePart - 向新ImagePart写入流数据
代码示例
// 遍历现有ImagePart,获取最大编号生成唯一文件名 var existingImageParts = worksheetPart.ImageParts.ToList(); int nextImageId = existingImageParts.Count > 0 ? existingImageParts.Max(p => int.Parse(Path.GetFileNameWithoutExtension(p.Uri.ToString()).Replace("image", ""))) + 1 : 1; string targetFileName = $"image{nextImageId}.tiff"; Uri targetUri = new Uri($"xl/media/{targetFileName}", UriKind.Relative); // 创建指定Uri的TIFF类型ImagePart ImagePart newImagePart = worksheetPart.AddImagePart(ImagePartType.Tiff, targetUri); // 将内存流写入ImagePart stream.Position = 0; newImagePart.FeedData(stream);
说明
- 这样创建的ImagePart Uri会是
xl/media/imageX.tiff,扩展名完全符合预期 - 确保文件名唯一是为了避免覆盖包内已有的媒体文件,也符合Excel默认的命名规则
- 写入流的逻辑和之前一致,无需修改
内容的提问来源于stack exchange,提问作者Asbjoedt
相关产品推荐
相关产品推荐

