C# Excel fájl feldolgozása - in not a valid name... hiba
2021-08-16T07:45:01+02:00
2021-08-16T09:59:39+02:00
2022-07-18T22:26:51+02:00
szmolkalaszlo
Sziasztok!

Egy excel állomány feldolgozása közben "System.Data.OleDb.OleDbException: ''' is not a valid name. Make sure that it does not include invalid characters or punctuation and that it is not too long.'
hibával leáll a program.

A kód nagyjából

using System.Data; using System.Data.OleDb; string szConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source='" + szFilePath + "';Extended Properties="Excel 12.0;HDR=YES;""; OleDbConnection conn = new OleDbConnection(szConnectionString); conn.Open(); string strSQL = "SELECT S2.[Közös. adósz.] AS kadoszam " + "FROM [sheet$] AS S1 INNER JOIN [sheet (2)$] AS S2 ON S1.[vevő] = S2.[ügyfél név] AND S1.[vevő cím] = S2.[központi cím] " + "WHERE LEFT(kelte, 10) BETWEEN '2021.07.01' AND '2021.07.31'"; OleDbDataAdapter objDA = new OleDbDataAdapter(strSQL, conn); DataSet excelDataSet = new DataSet(); objDA.Fill(excelDataSet); //Ezen a soron következik be a hiba.
Többszöri próbálkozás után úgy találtam, hogy a SELECT utasításban a mezőnévben lévő pontok ([Közös. adósz.]) okozzák a hibát. Az egész SELECT utasítás ettől jóval hosszabb, de ez a mező okoz hibát, azért van ennyire lerövidítve.
A feldolgozandó excel fájlt mindig egy számlázóprogramból kapom.
Gondoltam arra, hogy feldolgozás előtt módosítom a mező nevét, de jobban szeretnék egy fájdalommentesebb megoldást.
Esetleg van valakinek ötlete, hogy lehetne ezt az SQL-ben lerendezni, anélkül, hogy meg kelljen változtatni a mező nevét? A pontokat lehetne "semlegesíteni"?
Mutasd a teljes hozzászólást!
ha ezzel az eljárással boldogulsz, akkor ez is jó. 

továbbra is javaslom, hogy a küldő oldalon, ahol az excelt összerakják, ott csináljanak az eredeti sql táblákhoz  view-t, és azt kérd, hogy exportálják. 
view-nál lehet join is, és mező átnevezés is, igy egy db táblát tudnál kapni, amivel már nyilván egyszerú lesz lekezelni. 

de gondolkozz el azon, hogy mi is a cél, mert simán lehet, hogy nem is kell c#, elég ha excelben megmakrózod a tábláidat.
Mutasd a teljes hozzászólást!

  • szia, 

    érdekes megoldás amit alkalmazol, legalábbis számomra. 

    a kérdésem az, hogy minek használsz itt ole csatolást? 
    az sql azt sugallja, (a property is) hogy egy excel táblázatot nyalsz be. 

    az ole csatolást szerintem akkor érdemes alkalmazni ha valami interakció is van. 
    itt ha minden igaz itt statikus beolvasás van,  igy a c# egyéb exceles rutinjait érdemes használni. 
    (pl: Read Excel File in C# (Example)

    ez volt az okoskodás része, a konkrét kérdésedhez: 
    amúgy ha ragaszkodsz az sql-hez és névfeloldási probléma van, akkor az import file gyártójával lenne érdemes leboltolni, pl ugy hogy ő simán csinál egy view-t a táblájáról, ahol már olyan 
    mezőnév van ami neked jó,  és az exportálja...

    vagy van ez sem működik, akkor  itt egy két link ahol a te problémádról értekeznek:
    Excel data column name changing when loaded into dataset using Microsoft.ACE.OLEDB.12.0
    Excel column name containing '.' converted to '#'
    Mutasd a teljes hozzászólást!
  • Köszi a hozzászólásodat!
    Azt biztosan sejted, hogy nem mozgok otthonosan a programozásban. Esetleg még választhattam volna a LINQ lekérdezéseket, de az OLE használatát közelebb érzem magamhoz - persze van amikor az sincs elég közel :)
    De a lényeg az, hogy tulajdonképpen két fájlból kellene lekérdezéseket csinálnom és ehhez a két fájlt csatolnom kell bizonyos mezők párosításával. Erre egyelőre nem találtam jobb megoldást, mint az SQL nyelv használata.
    Az meg a másik, hogy ahogy utánanéztem az ACE.OLEDB csak táblák csatolását támogatja, fájlokét nem. Ezért a lekérdezés indítása előtt az egyik fájlból a megfelelő munkalapot átmásolom a másik fájlba, hogy a két munkalap egy fájlon belül legyen és akkor indulhat a két munkalap, mint két tábla feldolgozása. Az egyik tábla számla adatokat, míg a másik vevő adatokat tartalmaz.
    Ha más megoldás nem lesz, akkor a másolást követően a programban megoldom a mező átnevezését és csak utána indítom a lekérdezést.
    De még várnék kicsit, hátha más is hozzászól a témához.
    A linkeket köszönöm! Átnézem őket.
    Mutasd a teljes hozzászólást!
  • ha ezzel az eljárással boldogulsz, akkor ez is jó. 

    továbbra is javaslom, hogy a küldő oldalon, ahol az excelt összerakják, ott csináljanak az eredeti sql táblákhoz  view-t, és azt kérd, hogy exportálják. 
    view-nál lehet join is, és mező átnevezés is, igy egy db táblát tudnál kapni, amivel már nyilván egyszerú lesz lekezelni. 

    de gondolkozz el azon, hogy mi is a cél, mert simán lehet, hogy nem is kell c#, elég ha excelben megmakrózod a tábláidat.
    Mutasd a teljes hozzászólást!
abcd