使用EPPlus或类似POI的或其他基于OpenXml的库来embedded文件(列/行锚定)的简单方法?

我一直在使用E-IceBlue的Spire.XLS库( License Purchase Page | nuget Package ),虽然非常出色,但我遇到了一些障碍。

我要求的要点是:

我必须从我们的内部networkingpipe理系统取得大量数据,以及用户上传的附件,并定期将这些信息通过电子邮件发送给公司外部的第三方。 我们最初是分别发送数据和用户上传的附件,但是随着文件变得越来越多和笨拙 – 我得到了要求将所有内容合并到一个文件中的请求。 附件足够小,可以embedded,所以我通过使用Spire.XLS创build了一个Excel报告来实现这个function – 这使我不仅可以将OleObjects添加到包中,而且可以将它们定位到特定的行或列,很好地保持与来自CMSlogging的数据的良好的可视链接。 因此,我可以将所有数据放在A到AB列的一行中,并且附件开始出现在列AC,AD等行的末尾。

就我如何实现这一点而言 – 我从CMS获取数据,遍历每个项目(包括附件/文件数据),获取相关文件types的默认图像/图标,在Worksheet上创build一个OleObject,然后我把它定位 – 有点像这样:

MyAttachmentCollection attachments = GetAttachments(itemId); foreach(File attachment in attachments) { string fileType; string localFilePath; // Use WebClient to download file locally.. /* --- pseudo-code omitted for brevity -- */ worksheet.OleObjects.Add(localFilePath, image, OleLinkType.Embed); worksheet.OleObjects.Last().Location = worksheet.Range[row,col + 1]; worksheet.OleObjects.Last().ObjectType = fileType; col++; } 

不错,简单,结果相当不错。 可悲的是,它的成功意味着那些希望以这种方式发送越来越多的数据的权力,而不用为Spire.XLS许可证把现金拿出来。 免费许可只允许200行数据或5个工作表标签。 对于我们来说,这是一个单一的使用案例,所以我认为他们很难certificate这个单一开发的许可证费用和未来的维护成本。 我们也是公共服务,所以在预算方面,我们必须尝试和廉价的做一些事情!

我知道,XLSX / Open XML电子表格文档基本上是压缩/打包的存储容器,所以我查看了包含以这种方式添加的一些附件的Excel文件的内容,我试着去了解各种模式,以及如何复制效果,但是我正在努力将自己的头围绕起来,说实话,我想知道是否有其他图书馆可能存在这样的腿部工作?

我喜欢关于EPPlus( Old Codeplex Page | nuget Package )的一件事是能够获取DataSet或DataTable,并将其直接插入给定单元格引用的工作表中。 我也喜欢,我可以使用内置的Excel样式或定义我自己的并应用这些。 编写非常less的代码时,我可以创build非常可爱的电子表格(令人伤心,我知道!)。 所以最初,我看着是否可以使用或扩展EPPlus …正如在这个答案中所描述的那样,EPPlus确实公开了底层的XML,但是从我能想到的 – 我需要:

  • 首先将图标/图像数据添加到包中(工作表中的文件的实际可视表示),并使其位于XLSX内的graphics和/或媒体文件夹中,
  • 绘图数据将需要以新的格式和传统(VML)格式存在(除非Spire XLS只是过度地向后兼容?注意: – 我相信如果您使用Office SDK / Excel Interop DLL可以调用图像信息生成 – 但因为这是一个基于服务器的解决scheme,我正在寻求避免,如果可能的话),
  • 我需要为各种XML文件中的人员注册关系ID,
  • 添加附件作为BIN文件(假设这只是一个二进制转储?),并创build一个关系ID,
  • 然后以某种方式将所有这一切在我的工作表XML …

引起头痛! 不幸的是,我对OpenXML-SDK没有真正的认同,我不知道我能够多快地把它拿起来。 有一个非常真实的风险,我可以付出很多的努力,只有最终的腐败/不符合文件。 除非所有这些看起来比实际上更复杂?

我之前使用的其他库是NPOI( GitHub repo | nuget Package ) – 这是基于Java POI的Microsoft API文档的Java API。 它支持较旧的Microsoft Office格式以及较新的格式。

我已经看到了一些如此的答案,这表明它可能使用POI来embedded其他MS家族的文档,但是我不知道.NET fork(NPOI)是否完全实现了这个东西。 我发现很less有人使用这个特定的库来做这个事情……这可能只是这个需求有些稀less,所以我找不到例子呢?

解决Java POI中的embedded问题的另一个例子就是在这里 – 但是似乎是用旧的Office格式编写的,并且使用OLE1.0embedded。

只是张贴,因为我认为这可能是你可能有一个超级有用的人在那里做了这种事情之前! ;)

感谢您的阅读,并对不起,如果我有点冗长/浪费太多的时间与文本的墙壁! 任何帮助非常感谢!