我已经研究了几个星期,并且很难找到解决方案,我希望通过在这里发布一个一般性的问题来获得一些见解。
我有一个已将资源嵌入到(.xlsm)中的类库(在本例中为 .xll)。您可能知道也可能不知道,.xll 与 Excel 相关联,因此当有人打开 .xll 时,它会加载到 Excel 实例中。在我的场景中,当 .xll 加载到 Excel 中时,.xll 会加载嵌入的 .xlsm 的副本。到目前为止,一切都很好。这使我可以向我工作场所的最终用户发送一些东西,无论出于何种意图和目的,它都只是一个奇怪的 Excel 文件。
当用户希望能够保存他们对 Excel 工作表所做的更改时,就会出现问题。如果他们将其保存到桌面(使用 Excel 内置的保存功能),那么保存的只是 .xlsm。再次打开该 .xlsm 时,将不再加载 .xll,并且 .xlsm 中包含的任何 .NET 功能都将不起作用。
此时可能会出现几个问题。首先,为什么不直接向系统注册 .xll 呢?主要是因为如果我注册了 .xll,那么每次有人打开 Excel 时,都会打开 .xll,这意味着我嵌入的 .xlsm 也会打开(请记住,这就是 .xll 在启动时所做的事情。)用户往往会觉得这很烦人... :-)。
接下来,为什么不同时发送两个文件呢?回答:对最终用户的干扰太大(请耐心等待)。爱它或恨它,他们想要一个文件打开然后修改。对他们来说,.xll 只是 .xlsm 的另一个版本,我希望他们保留这种看法,因为这样可以更容易地解释自己。
最后,为什么不将 .xll 作为一个整体分发给我的团队并针对它发布 .xlsms 呢?回答:这些 .xll 将被发送到一大堆随机的地方,我无法控制用户在他们的机器上将拥有什么,所以我更喜欢保持独立。
我想到了两个基本的解决方案。
选项一是弄清楚如何简单地从 .xlsm 重新编译 .xll(可能通过 .xll 的实例),然后将该 .xll 保存到用户选择的位置。这将需要我创建自己的保存方法,因为 Excel 对此无济于事,并且可能包括我需要拦截用户在保存时所做的任何努力,以便我可以将它们重定向到我自己的保存方法。问题是我不知道如何让 .xll 自行重新编译,特别是因为我将把 .xll 发送到不一定有 SDK 的机器上。最重要的是,强迫用户使用我自己的保存方法将是另一个不受欢迎的中断(至少在我看来......)
选项二是创建一个作为可执行文件工作的程序集。基本上它会包含 .xlsm 和 .xll,并且可执行文件会加载 Excel,然后将 .xll 应用到它。只要可执行文件不需要管理员权限,我想我可以将它们发送出去代替常规的旧文件(这里的大多数人甚至从来没有看到扩展名,带有正确的图标,大多数人不能分辨其中的不同之处)。唯一的问题是我无法弄清楚如何在不使用资源文件并将 .xlsm 转换为字节码的情况下将 .xlsm 链接到程序集。这基本上让我们回到了第一方。
本质上,选项 1 要求我弄清楚如何在外国机器上编译,而选项 2 要求我弄清楚如何包含整个 .xlsm 以便我可以修改它并将其放回原来的位置……或者至少把它放在可执行文件可以很容易地再次找到它的地方。
无论如何,如果你做到了这一步,我将永远感激你。我只是想弄清楚下一步该往哪里看,并希望有人能指出我正确的方向。
提前致谢。