XBase ActiveX Com - type libraries
2021-07-14T19:31:37+02:00
2021-07-19T16:02:12+02:00
2022-08-12T03:45:30+02:00
Garp szerint
Üdv! Az alábbi témában kérnék segítséget.

Az xBase 2.0 -ból szeretnék ActiveX-en keresztül kezelni excel-t. Ez lehetséges, működik is, van rá picike példaprogramrész is, amit ha bedobok a programba, működik is. Ez az alábbi pár sor:

// kód eleje
oExcel := CreateObject( "Excel.Application" )
oSheet := oExcel:workbooks:add():activeSheet
oCell := oSheet:Cells( 1, 1 )
oCell:Value := "Hello"
// kód vége

Elindul az excel, megnyílik a tábla, az (1,1) cella értéket kap, minden frankó. Azóta nagyjából 3 órát töltöttem azzal, hogy próbálom valahonnan megszerezni, megtudni, hogy milyen objektumokat, milyen metódusokat és milyen példányváltozókat használhatnék még. Annyi hamar kiderült, hogy elvileg a "type library" tartalmazza ezeket, de az MSN-en is, máshol is csak használhatatlan blablát kapok akárhogyan keresnék rá erre.

Igazából az lenne a cél, hogy tudjak nyitni pár lapot, laponként be tudjak tölteni egy listafile-t, mondjuk CSV formátumból, illetve esetleg tudjak csinálni egy olyan lapot, ami a többi lapok listáinak a végösszegeiből dolgozva tartalmaz egy pársoros összegzést.

Köszi előre is: MZ
Mutasd a teljes hozzászólást!
Szia!

Microsoft dokumentáció: Excel object model overview
Egyébként az Excel makrófelvevő funkciója is jól használható, a létrehozott makróból át tudod venni, amire szükséged van.

üdv. Péter
Mutasd a teljes hozzászólást!

  • Köszi a választ, de itt már jártam, el is töltöttem vele egy csomó időt, hogy megpróbáltam innen - először is - megtalálni azokat, amiket az XBase-ből az ActiveX-en keresztül használtak, hogy lássam, miképpen nézhet ki a szintaxis-beli változás (mivel ugye, amit linkeltél, az a visual basic-hez adott doku egyébként is). Hát azt a pár dolgot se sikerült fellelni. Ráadásul alapvetően nem a táblákat akarom masszírozni, csak készítek lekérdezéseket CSV-be, majd ezeket oda akarnám adni ilyen módon az excel-nek és ennyi. Tudjak neki adni egy nevet, tudjam áttolni az adatokat, nagyjából ennyi a fő cél.
    Mutasd a teljes hozzászólást!
  • Közben megkérdeztem az Alaska-t is, kis odafigyeléssel használható az MSN dokumentációja. Ennyi volt a válaszuk:

    A lot of information provided by Microsoft and available online regarding office automation uses VB code, correct. This is because Visual Xbase for Applications is used by many developers, and also because VB is the default macro language in MS Office. Actually, transforming VB to Xbase++ code is very easy because the syntax is similar. The main differences are:
    - the send operator is "." versus ":" in Xbase++
    - function and method calls often do not use brackets, eg. Workbooks.Open Filename=... becomes Workbooks.Open(...) in Xbase++

    With this, you should be able to find your way through most VB examples found online. Also, I'm sure you've seen the examples located in (documents)\xbase++\source\samples\activex? Finally, there is the macro recorder feature in Excel which generates code for the recorded operations. By migrating this code to Xbase++, you could just "play back" the same operations via automation in your app! You can find the macro recorder on the "Developer Tools" tab in Excel, which by default is not visible/enabled.

    Szóval azt hiszem, a téma lezárható, köszönöm a válaszod!
    Mutasd a teljes hozzászólást!
  • Szia!
    Közben C#-ban megcsináltam a .csv beolvasást Excelbe, a munkalap átnevezését és mentést XLSX formátumba. Kiderült, hogy a Visual Studio-ban a Project menüpontnál az Add Reference... alatt van COM objektum hozzáadás és a ott van a Type Libraries alatt felsorolva, ami a PC-n COM képes program.
    C#-ban ez működik, így könnyebb lesz XBase formátumra átírni, mert ebben pl. a konstansok értéke van benne, amit a Visual Studio ki tud írni, de nálad XBase-ben nem tudod megnézni. A konstansok leírását is beletettem a minta kódba, hogy meg tudd nézni, ha más formátum kellene.
    Az elfogadott válaszban lévő leírásban látod pl. a Workbooks.Open() paraméterezését:
    link
    Ez alapján pl. lehetne az Workbooks.Open() negyedik paramétere 4 - az a pontosvesszővel elválasztott .csv fájl, most a paraméter 6 - ehhez megadhatod az elválasztó karaktert (valahol hátrább van egy ";" a paraméterek között,) ha tabulátor kell akkor ide pl. chr(9) is lehet, ahogyan az XBase-ben használható.


    üdv.: Péter

    using Microsoft.Office.Interop.Excel; using System.IO; namespace Excel_csv_beolvasas { class Program { static void Main(string[] args) { Application xlApp; Workbook xlWorkBook; Worksheet xlWorkSheet; string fname; xlApp = new Application(); xlApp.Visible = false; xlApp.DisplayAlerts = false; if (xlApp == null) { System.Console.WriteLine("Excel nem indítható!"); return; } else { fname = @"C:\xls_teszt\Teszt.csv"; if (File.Exists(fname)) { // xlFileformat konstansok: https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.xlfileformat?view=excel-pia // xlPlatform konstansok: https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.xlplatform?view=excel-pia xlWorkBook = xlApp.Workbooks.Open(fname, 0, true, 6 /* Microsoft.Office.Interop.Excel.XlFileFormat.xlCSV */, "", "", true, 2 /* Microsoft.Office.Interop.Excel.XlPlatform.xlWindows */, ";", false, false, 0, true, 1, 0); xlWorkSheet = xlWorkBook.Worksheets.get_Item(1); xlWorkSheet.Name = "Teszt_adatok"; // xlFileformat konstansok: https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.excel.xlfileformat?view=excel-pia xlWorkBook.SaveAs(@"C:\xls_teszt\Teszt.xlsx", 51 /* Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook */); xlWorkBook.Close(false, null, null); } } xlApp.Quit(); } } }
    Mutasd a teljes hozzászólást!
  • Ezzel próbálkoztam:

             oExcel := CreateObject( "Excel.Application" )
             IF NIL == oExcel
                ? "Error"
                ? ComLastError()
                ? ComLastMessage()
             Else   
               oExcel:visible := .T.
               oWB = oExcel:workbooks:open("i:\_x\v11\AKT\teszt.csv")
               oSH = oWB:WorkSheets(1)
               oSH:Name='Ez az új neve'
               oWB:SaveAs("i:\_x\v11\AKT\teszt.xlsx",51)
               oWB:Close()
               oExcel:Quit()
             EndIf


    Eredmény:
    - elindul az excel
    - megnyitja a CSV file-t (nem adtam meg hozzá a néven kívül mást, mert a pontosvesszővel tagolt az alapértelmezése úgyis)
    - hibaüzenetet kapok a Worksheets-re: "A hívást a hívott fél visszautasította"

    Hasonlóan jégre futottam még pénteken, úgyhogy akkor elkezdtem egészen kis lépésekben haladni és akkor nem nyitottam meg file-t, hanem csak ez volt a kód:

           oWB = oExcel:workbooks:add()
           oWB:Sheets:Add()
           oWB:Sheets:Add()
           oWB:Sheets(3):Select()
           oWB:activeSheet:Name='HHAAAARRR'

    Ez működött, idáig. Aztán amikor gondoltam egyet és rögtön az első add után is próbáltam nevet adni a 2. lapnak, akkor is jött "A hívást a hívott fél visszautasította", majd a frissen beszúrt 2 programsort kitöröltem és újra (ford/szerk) után megint futtattam a programot és akkor már jött ez a hibaüzenet az előzőleg jól működő programra is.

    Találtam ezután egy kis eszmecserét a weben rákeresve a "sticky error automation excel" szavakra. Ott VB-ből futottak erre az aknára és a javasolt megoldás az volt, hogy (esetemben) az oWB:Sheets helyett ha használnám az oExcel:workbooks:Sheets-et, akkor megoldódna a probléma. Ez nettó marhaságnak tűnt és esetemben nem is segített.

    A pénteki próbálkozásaim során az derült ki, hogy ha egy kis ideig (pár perc, vagy kicsivel több) hagytam pihenni a témát, akkor a már egyszer hibátlanul működő, később mégis hibát okozó program megint képes volt jól működni. Számomra ez úgy tűnik, mintha egy idő leteltével szűnne meg csak az a kliens alkalmazás, amivel jégre futottam és ha túl hamar próbálkoznék megint, akkor az alkalmazást egy olyan állapotban találnám (kapnám) meg, amihez képest a módosítás hibát okoz. Értetlenül állok a dolog előtt.
    Mutasd a teljes hozzászólást!
  • Most csináltam egy ilyen primitívet:

               oExcel:visible := .T.
               oWB = oExcel:workbooks:open("i:\_x\v11\AKT\teszt.csv")
               oWB:Close()
               oExcel:Quit()

    A close-ra már jön a visszautasítós hibaüzenet.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd