OleDB-s XLS létrehozás

OleDB-s XLS létrehozás
2010-03-22T11:11:19+01:00
2010-03-22T14:42:17+01:00
2022-11-17T05:00:37+01:00
CzPeet
Aloha!

Az a problémám adódott, hogy nem tudok tetszőleges nevű ExcelSheet-et létrehozni, mert hibát kapok:

---------------------------
'AB123$' - nem érvényes név. Ellenőrizze, hogy nem tartalmaz-e érvénytelen karaktereket vagy írásjeleket, és hogy nem túl hosszú-e.
---------------------------
OK

Azt sikerült kinyomoznom, hogy valószínű az zakkantja meg, hogy az AB123 egy lehetséges cella azonosító az XLS-ben. Szóval az új excelnek hála A1-IV65536 közötti betű-szám kombó sem lehetséges Sheet név.
Legalábbis nekem nem jött össze.


pár sor a kódomból:
String^ conString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\teszt.xls; Extended Properties=Excel 8.0;";

OleDbConnection^ oledbcon = gcnew OleDbConnection(conString);

...
String^ sheetname = "B1";
String^ createstring = "CREATE TABLE ["+ sheetname +"] (:fields);";
String^ insertstring = "INSERT INTO ["+ sheetname +"$] VALUES(:paramList);";

...

cmdInsert->CommandText = insertstring;
adapter->InsertCommand = cmdInsert;
adapter->Update(dt);


és ez a sor dobja a hibát:
adapter->InsertCommand = cmdInsert;
vagyis az Update-hez el sem jut...

Adjatok vmi ötletet pls :)

Aloha Cz
Mutasd a teljes hozzászólást!
A 2 tulajdonság egymástól függetlenül is szerkeszthető. Én a név módosítására leginkább az Excel COM objektum modelljét tartom alkalmasnak, igaz, ez már MS függő dolog. C++-ul nem beszélek, szal az alábbi péld VB-ben lesz, de az objektum típusok, tulajdonságok, metódusok megegyeznek:

Set oApp=CreateObject("Excel.Application")
Set oWb=oApp.Workbooks.Open("...") '... helyére megy az útvonal
oWb.Worksheets(1).Name=... '... helyére megy az új név
oWb.Save
oWb.Close
oApp.Quit
Set oApp=Nothing

szerk.: Az excel OleDB provider-e is MS-es cucc, max nem kell külön fizetni érte.
Mutasd a teljes hozzászólást!

  • A $ jel biztosan érvénytelen munkalapnévben. Tehát mi lenne, ha normális munkalapneveket próbálnál adni, pl. Ablak123.
    Mutasd a teljes hozzászólást!
  • Aloha!
    Ez már félig jó megoldás lenne, csak az a baj, hogy a 'B1' névből '_B1'et csinál....

    Amúgy az Excel pedig megengedi a $ jelet, szóval nem lehet érvénytelen... ezt csak vmiért az OleDB útálja...
    Mutasd a teljes hozzászólást!
  • Amúgy az Excel pedig megengedi a $ jelet, szóval nem lehet érvénytelen... ezt csak vmiért az OleDB útálja...


    Ez nem egészen van így. Egy Worksheet objektumnak ugyanis 2 "neve" van: egyik a fülön található (Name tulajdonság), a másik csak a VBA nyelvből elérhető (CodeName) tulajdonság. A CREATE TABLE excel esetén mindkét nevet ugyanarra az értékre próbálja beállítani, csakhogy a CodeName nem tolerálja a $ karaktert.

    Ezt könnyű kipróbálni:
    1. Nyiss egy excel file-t.
    2. Alt+F11-gyel menj be a kódszerkesztőbe
    3. Project Explorer-ben (alapértelmezetten bal felső sarok) jelöld ki valamelyik munkalapot
    4. A tulajdonság lapon (alapértelmezetten project explorer alatt van) a (Name) (így, zárójelekkel!) tulajdonságot próbáld meg egy $-t tartalmazóra átírni.
    5. Próbáld meg a Name (zárójelek nélkül) tulajdonságot $-t tartalmazóra átírni.

    A 4. pontban hibát fogsz kapni, az 5.-ben nem.

    De alapvetően lényegtelen, mert az OleDB komponens gyakorlatilag bármilyen elnevezési konvenciót rád kényszeríthet. Jobb lenne, ha "úsznál az árral" és olyan nevet választanál, amit változtatás nélkül elfogad.
    Mutasd a teljes hozzászólást!
  • Aloha!

    Na, ezt a "kódszerkesztős" témát nem ismertem, köszi a felvilágosítást.
    Sajnos nem az én progimba kell ez a cucc, én marhára le$z*nám... de az a gáz, hogy a cég ahol dolgozom, kiadott egy szoftvert úgy, hogy saját XLS writer és reader-e volt. sok hátránya volt, pl. feltétlen kellett a gépen lennie egy telepített MSOffice-nak.
    De ami előnye volt, hogy az XLS sheet-nek "bármit" megadhattál. lsd. B1, B-1 stb... A userek a B1-nek rövidítették a Block1-et pl.
    De mivel nem lehetünk MS függőek (legalábbis ilyen szinten nem) lecseréltük az egészet OleDB-re. De itt meg ez a hiba, hogy már egy korábban használt XLS-t nem tudnak használni a Sheetnevek miatt. Szóval ez a szívás.

    De annyit kérdeznék.... h ha a progiban létrehozom a sheet-et work1-gyel (amit most már tudok h a (Name) lesz, akkor nem tudom átírni a Name property-t később?

    és akkor a generált xls sheet (Name)-je a work1, de Name-je pedig B1?
    Mutasd a teljes hozzászólást!
  • A 2 tulajdonság egymástól függetlenül is szerkeszthető. Én a név módosítására leginkább az Excel COM objektum modelljét tartom alkalmasnak, igaz, ez már MS függő dolog. C++-ul nem beszélek, szal az alábbi péld VB-ben lesz, de az objektum típusok, tulajdonságok, metódusok megegyeznek:

    Set oApp=CreateObject("Excel.Application")
    Set oWb=oApp.Workbooks.Open("...") '... helyére megy az útvonal
    oWb.Worksheets(1).Name=... '... helyére megy az új név
    oWb.Save
    oWb.Close
    oApp.Quit
    Set oApp=Nothing

    szerk.: Az excel OleDB provider-e is MS-es cucc, max nem kell külön fizetni érte.
    Mutasd a teljes hozzászólást!
  • Aloha!

    Sajnos ezek szerint simán OleDB-vel nem lehet megoldani...
    Most is úgy van a progiban, hogy vizsgáljuk a lehetséges eseteket, és mi fogjuk el a hibákat, és figyelmeztetjük a Usert...

    Ezt a COM-os megoldásodat fogadom el megoldásnak, és max a documentácuóban hivatkozok erre a linkre :)

    Köszi a segítséget!

    Aloha Cz

    u.i.: igen tudom h MS-es cucc, csak telepített Office nélkül is képes XLS-t generálni....
    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