这是一个有点抽象的问题,但我希望有人可以分享一些对此的见解,因为谷歌没有给我任何明确的答案。我的任务是在 Excel 应用程序和 QuickBooks 之间导入和导出数据,但有一些要求:
这是我得到的:
[尝试#1]
我第一次尝试这个问题,我尝试在 Visual Studio 中创建 Excel 插件并添加 QuickBooks SDK 作为参考,这导致插件无法加载。我不知道到底为什么,我只是得到一个通用的“无法找到或无法加载加载项”,当您单击详细信息时,它会详细说明异常:
Could not load file or assembly 'ExcelAddIn3, Version=1.0.0.0, Culture=neutral' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
************** Exception Text **************
System.IO.FileLoadException: Could not load file or assembly 'ExcelAddIn3, Version=1.0.0.0, Culture=neutral' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047)
File name: 'ExcelAddIn3, Version=1.0.0.0, Culture=neutral'
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)
at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)
at Microsoft.VisualStudio.Tools.Office.Runtime.DomainCreator.ExecuteCustomization.CreateEntryPoint(String entryPointTypeName)
at Microsoft.VisualStudio.Tools.Office.Runtime.DomainCreator.ExecuteCustomization.Microsoft.VisualStudio.Tools.Office.Runtime.Interop.IExecuteCustomization2.LoadEntryPoints(IntPtr serviceProvider)
************** Loaded Assemblies **************
mscorlib
Assembly Version: 4.0.0.0
Win32 Version: 4.7.3221.0 built by: NET472REL1LAST_C
CodeBase: file:///C:/Windows/Microsoft.NET/Framework64/v4.0.30319/mscorlib.dll
----------------------------------------
Microsoft.VisualStudio.Tools.Office.Runtime
Assembly Version: 10.0.0.0
Win32 Version: 10.0.60828.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualStudio.Tools.Office.Runtime/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualStudio.Tools.Office.Runtime.dll
----------------------------------------
System.Core
Assembly Version: 4.0.0.0
Win32 Version: 4.7.3221.0 built by: NET472REL1LAST_C
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System
Assembly Version: 4.0.0.0
Win32 Version: 4.7.3190.0 built by: NET472REL1LAST_C
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Configuration
Assembly Version: 4.0.0.0
Win32 Version: 4.7.3056.0 built by: NET472REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Assembly Version: 4.0.0.0
Win32 Version: 4.7.3056.0 built by: NET472REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Security
Assembly Version: 4.0.0.0
Win32 Version: 4.7.3101.0 built by: NET472REL1LAST_B
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Security/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Security.dll
----------------------------------------
Microsoft.VisualStudio.Tools.Applications.Hosting
Assembly Version: 10.0.0.0
Win32 Version: 10.0.60828.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualStudio.Tools.Applications.Hosting/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualStudio.Tools.Applications.Hosting.dll
----------------------------------------
Microsoft.VisualStudio.Tools.Applications.Runtime
Assembly Version: 10.0.0.0
Win32 Version: 10.0.60828.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualStudio.Tools.Applications.Runtime/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualStudio.Tools.Applications.Runtime.dll
----------------------------------------
System.Deployment
Assembly Version: 4.0.0.0
Win32 Version: 4.7.3056.0 built by: NET472REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Deployment/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Deployment.dll
----------------------------------------
Microsoft.VisualStudio.Tools.Applications.ServerDocument
Assembly Version: 10.0.0.0
Win32 Version: 10.0.60828.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualStudio.Tools.Applications.ServerDocument/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualStudio.Tools.Applications.ServerDocument.dll
----------------------------------------
System.Windows.Forms
Assembly Version: 4.0.0.0
Win32 Version: 4.7.3221.0 built by: NET472REL1LAST_C
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Assembly Version: 4.0.0.0
Win32 Version: 4.7.3056.0 built by: NET472REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Xml.Linq
Assembly Version: 4.0.0.0
Win32 Version: 4.7.3056.0 built by: NET472REL1
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml.Linq/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.Linq.dll
----------------------------------------
Microsoft.Office.Tools
Assembly Version: 10.0.0.0
Win32 Version: 10.0.60828.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.Office.Tools/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.Office.Tools.dll
----------------------------------------
Microsoft.Office.Tools.Excel.Implementation
Assembly Version: 10.0.0.0
Win32 Version: 10.0.60828.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.Office.Tools.Excel.Implementation/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.Office.Tools.Excel.Implementation.dll
----------------------------------------
Microsoft.Office.Tools.Common.Implementation
Assembly Version: 10.0.0.0
Win32 Version: 10.0.60828.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.Office.Tools.Common.Implementation/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.Office.Tools.Common.Implementation.dll
----------------------------------------
Microsoft.Office.Tools.Common
Assembly Version: 10.0.0.0
Win32 Version: 10.0.60828.0
CodeBase: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.Office.Tools.Common/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.Office.Tools.Common.dll
----------------------------------------
[尝试#2]
仍然尝试使用外接程序,我创建了一个引用 QBSDK 的单独的类库,并将该库添加为外接程序中的引用。同样的问题,通用错误消息说无法找到或无法加载加载项。
我真的不知道为什么,如果有人有见解,请告诉我。
[尝试#3]
我开始考虑使用 WCF 与运行 QBSDK 的单独程序进行通信。当我创建一个独立的应用程序并引用 SDK 时,它工作得很好。我可以连接到 QB 和我的应用程序并在它们之间交换数据。我从未使用过 WCF,但它给了我一些希望,即使它比我希望的复杂得多,也可以做到这一点。
我的想法是这样的:
Excel 应用程序使用自定义 Excel 加载项,该加载项使用 WCF 命名管道服务器与单独的 .NET 应用程序连接,该应用程序使用 WCF 客户端在两个端点之间发送 qbXML 数据。我什至不知道这是否可能,也不知道我会陷入什么陷阱,但是,除了认输之外,这似乎是我最好的选择。
还有其他更好的方法可以做到这一点吗?
最简单的方法是放弃为 Office 构建加载项(很痛苦 - 只是无缘无故地增加计费时间 - 导致世界各地的儿童挨饿 - 不要打扰)。
最简单的方法是在.net中构建COM对象。然后,任何支持 com 对象的软件(office、windows 脚本)都可以使用该 com 对象。
首先: 在 .net 中构建一个可工作的 COM 对象
说出这段代码:
Imports System.Runtime.InteropServices
Public Class Class1
Function Hello()
MsgBox("Hello World")
End Function
End Class
除了上面的代码之外,不要再写任何东西。您不需要 Office 互操作程序集或上述 .net 项目中引用的任何其他内容。我为上面创建了一个空白的.net 类。没有额外的参考资料或任何东西。
如果你写的比上面多,那么你就到木棚后面去——如果你写的比上面多,你就是在偷窃计费时间。
在上面的VS项目中: 设置项目 x86(对于 Office x32,您必须执行此操作) 选中“注册 COM 互操作(在编译选项下)”复选框
你完成了!
现在,编译以上内容。
现在,在 excel 中的 VBA(例如测试模块)中,使用以下 VBA 代码:
Sub TestC5()
Dim obj As Object
Set obj = CreateObject("ComTest5.Class1")
obj.Hello
End Sub
以上内容适用于 Excel!!!!
好的,现在(并且只有在我们的上述两行代码在 Excel VBA 中工作之后???
现在,只需添加对 QB SDK 的引用,添加所需的属性和方法,然后就可以开始比赛了。
再次: 在添加 SDK 参考之前,让上述 2 行代码正常工作(如果您无法正常工作 - 解雇所有开发人员 - 他们不知道如何构建 COM 对象)。
只需获取一个在 .net 中工作的 COM 对象即可。您可以在 Excel、Word、Access 或任何支持 COM 接口的 Windows 程序中使用它。
我一直使用 QB SDK 执行上述操作。
我有代码可以从 Excel(或 Access)将发票方向推入 QB – 无需导出,无需导入 – 发票直接进入 QuickBooks,无需任何中间文件。
简单地让上面的代码工作
在 Excel VBA 中从 .net 获取上述 SUPER DUPER SUPER EASY “com” 对象。
完成后,添加 .net 的 QBFC13 引用,添加所需的属性和 meahots - 现在您就拥有了从 Excel 到 QB 的工作界面。
我已经在 VBA 中实现了简单的 QuickBooks 桌面 sdk,并且能够在 QuickBooks 中过帐发票、支票和其他文档。我是会计师,因此对 com 对象不太了解...我只从聊天 GP 复制了代码,根据我的需要调整了一些代码并在 Ms access 中进行调试..现在工作效率很高