是否可以 运行 Excel 中的 QuickBooks SDK?

Is it possible to run the QuickBooks SDK in Excel?

这是一个有点抽象的问题,但我希望有人可以分享一些对此的见解,因为 Google 没有给我任何明确的答案。我的任务是在 Excel 应用程序和 QuickBooks 之间导入和导出数据,但有一些要求:

  1. 它不能使用糟糕的 QuickBooks 导入文件功能。由于它引起的所有问题,我的任务是重写此功能,而且据我所知,它们已被弃用。
  2. 该过程必须从 Excel 应用程序内部开始。只要可以通过在 Excel 表单上按下按钮来完成,就可以使用其他中间技术。

这是我得到的:

[尝试#1]

我第一次尝试这个,我尝试在 Visual Studio 中创建一个 Excel 加载项并添加 QuickBooks SDK 作为参考,这导致加载项无法加载。我不知道为什么,我只是得到一个通用的 'An add-in could not be found or could not be loaded',当您单击详细信息时,它详细说明了异常:

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]

仍在尝试使用加载项,我创建了一个单独的 class 库来引用 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

除了上面的代码,不要再写任何东西。您不需要办公室互操作程序集或上述 .net 项目中引用的任何其他内容。我为上面创建了一个 BLANK .net class。没有额外的参考或任何东西。

如果你写的比上面多,那么你就到木棚后面去——如果你写的比上面多,你就是在窃取计费时间。

在上面的VS项目中: 设置项目 x86(必须为 office x32 执行此操作) 选中一个框“Register for COM interop (under compile options)

大功告成!!!

现在,编译上面的内容。

现在,在 excel 中的 VBA 中(比如测试模块),使用此 VBA 代码:

Sub TestC5()

   Dim obj     As Object

   Set obj = CreateObject("ComTest5.Class1")

   obj.Hello

End Sub

以上内容适用于 Excel!!!!

好的,现在(只有在我们上面的两行代码在 Excel VBA 中工作之后???

现在,只需添加对 QB SDK 的引用,添加所需的属性和方法,即可开始比赛。

再次: 在添加 SDK 参考之前,让上面的两行代码正常工作(如果你不能正常工作 - 解雇你所有的开发人员 - 他们不知道如何构建 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 的工作接口。