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