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

时间:2017-04-25 18:28:38

标签: c# excel apache-poi openxml-sdk epplus

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

我要求的要点是:

我必须从我们的Intranet CMS中获取大量数据,以及用户上传到其中的附件,并定期将该信息通过电子邮件发送给公司外部的第三方。我们最初是分别发送数据和用户上传的附件,但随着文档变得越来越多而且难以处理 - 我接着尝试将所有内容合并到一个文件中。附件小到可以嵌入,所以我通过使用Spire.XLS创建Excel报告来实现这一点 - 这使我不仅可以将OleObjects添加到包中,而且可以将它们(锚定它们)定位到特定的行或列。好 - 与CMS记录中的数据保持良好的可视链接。因此,我可以将所有数据放在A列到AB列的一行中,并且附件开始出现在AC,AD等列的行尾。

就我如何实现这一点而言 - 我从CMS中获取数据,遍历每个项目(包括附件/文件数据),我得到相关文件类型的默认图像/图标,创建一个OleObject on工作表,然后我定位它 - 有点像这样:

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个工作表选项卡。这对我们来说是一个单一用例,所以我认为他们发现很难证明这个单一开发及其版本的许可成本是合理的。未来的保养。我们也是公共服务,因此预算明智,我们必须尝试以便宜的方式做事!

我知道XLSX / Open XML电子表格文档基本上是压缩/打包的存储容器,因此我已经查看了包含以这种方式添加的一些附件的Excel文件的内容,以及我试图了解各种模式以及如何复制效果,但是我很难说实话,我想知道是否存在其他任何库。已经做过这种腿部工作了吗?

我喜欢EPPlus(Old Codeplex Page | nuget Package)的一件事就是能够获取DataSet或DataTable并将其直接插入到给定单元格引用的工作表中。我也喜欢我可以使用内置的Excel样式或定义我自己的样式并应用它们。在编写非常少的代码时,我可以创建非常可爱的电子表格(我很难过!)。所以最初,我查看了我是否能够使用或扩展EPPlus ...并且如this answer中所述,EPPlus确实暴露了基础XML,但从我能想到的 - 我需要到:

  • 首先将图标/图像数据添加到包中(工作表中文件的实际可视化表示),并在XLSX中的图纸和/或媒体文件夹中生成,
  • 绘图数据需要以新格式和旧版(VML)格式存在(除非Spire XLS只是过度向后兼容吗?旁注: - 我相信如果您使用Office SDK / Excel您可以调用Interop DLL来生成图像信息 - 但由于这是基于服务器的解决方案,我希望尽可能避免这种情况,
  • 我需要为各种XML文件中的那些注册关系ID,
  • 将附件添加为BIN文件(假设它只是一个二进制转储?)并为其创建一个关系ID,
  • 然后以某种方式将所有这些组合在我的工作表XML ...

......头痛诱发!不幸的是,我并不真的对OpenXML-SDK感到失望,我不确定我能多快得到它。我可能会付出很大的努力,但却最终会出现损坏/不合规的文件。除非所有这些只是似乎比实际上更复杂?

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

我已经看到了一些SO答案,例如this one表示可以使用POI嵌入其他MS系列文档,但我不知道.NET fork(NPOI)是否是完全实现这些东西。我发现很少有人使用那个特定的库来做这个...这可能只是因为这个要求有点罕见所以我找不到例子?

有人在Java的POI中解决嵌入问题的另一个例子是here - 但这似乎是用较旧的办公室格式编写并使用OLE1.0嵌入。

刚刚发布,因为我认为你们中的一个超级有帮助的人可能已经做过这样的事情! ;)

感谢您的阅读,对不起,如果我在文字墙上花费了太多时间了解/浪费了太多时间!任何帮助非常感谢!

0 个答案:

没有答案