Можно ли запустить QuickBooks SDK в Excel? - PullRequest
0 голосов
/ 20 ноября 2018

Это немного абстрактный вопрос, но я надеюсь, что кто-то сможет поделиться с ним некоторыми соображениями, потому что Google не дает мне четких ответов. Мне было поручено импортировать и экспортировать данные между приложением Excel и QuickBooks с несколькими требованиями:

  1. Он не может использовать ужасные функции файла импорта QuickBooks. Мне было поручено переписать эту функцию из-за всех проблем, которые она вызывает, и, насколько я могу судить, они в любом случае устарели.
  2. Процесс должен начинаться из приложения Excel. Использование других промежуточных технологий хорошо, если это можно сделать нажатием кнопки в форме Excel.

Вот что у меня есть:

[Попытка # 1]

Моя первая попытка - попытаться создать надстройку Excel в Visual Studio и добавить SDK QuickBooks в качестве ссылки, что привело к сбою загрузки надстройки. Я не знаю точно, почему, я просто получаю универсальное «Надстройка не может быть найдена или не может быть загружена», и когда вы нажимаете на детали, она детализирует исключение:

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 между двумя конечными точками. Я даже не знаю, возможно ли это, или в какие ловушки я вхожу, но, кроме броска в полотенце, это, кажется, моя лучшая ставка.

Есть ли другой, лучший способ сделать это?

1 Ответ

0 голосов
/ 26 ноября 2018

Самый простой подход заключается в создании надстройки для Office (большая боль - просто набирайте оплачиваемые часы без веской причины - создает голодающих детей по всему миру - не беспокойтесь).

Самый простой подход - это создать COM-объект в .net.Этот com-объект может затем использоваться ЛЮБОЙ программой, которая поддерживает com-объекты (офис, сценарии Windows).

Итак, сначала: создайте работающий COM-объект в .net

. Скажите этот код:

Imports System.Runtime.InteropServices

Public Class Class1

    Function Hello()

        MsgBox("Hello World")

    End Function

End Class

НЕ ПИШИТЕ БОЛЬШЕ, чем приведенный выше код.Вам НЕ нужны офисные сборки взаимодействия или НИЧЕГО, как указано в вышеуказанном .net-проекте.Я создал пустой класс .net для выше.Никаких дополнительных ссылок или чего-либо еще.

Если вы написали больше, чем выше, то за деревянным сараем вы идете - вы крадете оплачиваемые часы, если делаете больше, чем выше.

В вышеприведенном проекте VS: Установите проект x86 (вы должны сделать это для Office x32). Установите флажок «Зарегистрироваться для COM-взаимодействия (в опциях компиляции)

ВЫ СДЕЛАНЫ !!!

Теперь скомпилируйте выше.

Теперь, в VBA в Excel (скажем, тестовый модуль), используйте этот код VBA:

Sub TestC5()

   Dim obj     As Object

   Set obj = CreateObject("ComTest5.Class1")

   obj.Hello

End Sub

Выше будет работать сExcel !!!!

Хорошо, сейчас (и только после того, как наши 2 строки кода работают в Excel VBA ???

Теперь просто добавьте ссылку на QB SDK, добавьте свойнеобходимые свойства и методы, и вы снова в гонках.

еще раз: перед добавлением ссылки на SDK, сработайте две вышеупомянутые строки кода (если вы не можете работать выше - запустите все ваши девеверы -они не знают, как построить COM-объект).

Просто получите COM-объект, работающий в .net., который вы можете использовать в Excel, Word, Access или ЛЮБОЙ программе Windows, которая поддерживает COM-интерфейсы.

Я делаю все вышеописанное с помощью QB SDK.

У меня есть код, который из Excel (или Access) может выдвигать направление счетов в QB - нет экспорта, нет импорта - счета идутпрямо в QuickBooks без каких-либо промежуточных файлов.

Простой получить вышерабочий код

Получите вышеупомянутый SUPER DUPER SUPER EASY «com» ​​объект из .net, работающий в Excel VBA.

После этого добавьте ссылку QBFC13 для .net, добавьте необходимые свойства иmeahots - и теперь у вас есть рабочий интерфейс из Excel в QB.

...