Jump to content

XLSX to XML automation


Go to solution Solved by snaikers,

Recommended Posts

Sveiki,

 

Ir vid sistēma EMDAS, kas ir e-muita. Kurā var ar roku aizpildīt laikus un var iebarot XML failu.

Ir uzņēmuma sistēma, kas dod ārā excel failu.

Šobrīd cilvēki no tā excel faila ar rokām vada informāciju EMDAS'ā.

 

Vēlos šo procesu automatizēt. Diemžēl pie sistēmas kas dod ārā excel failus netieku un tur neviens arī neko negrib programmēt.

Līdz ar to paliek variants pārvērst excel failu derīgā xml dokumentā.

 

Bet excel fails ir komplicēts, tur nav vienkārša tabula. Tur sākumā ir izmētāti dati pa excel cells. bet ap kādu 70 rowu parādās tikai reāla tabula ar datiem. Excelī atrodamie dati visi ir vajadzīgi un nevar tur neko dzēst.

 

Viens variants ir uzrakstīt xml schemu un pēc tam katru reizi ar roku mapot datus. Bet tāpat paliek daudz manuāla darba katru reizi.

 

Bet varbūt kādam ir zināms library ar kura palīdzību tad var labi konvertēt un mapot datus?

Ja ir, tad būtu labi vēl ar mazu piemēru, lai var saprast.

 

Paldies!

Link to post
Share on other sites

Paldies par daudzajām atbildēm. Beigās izmantošu .net - closedxml un xmlwriter.

--------------------------------------------------------------------------------------------------------------------------

 

closedxml sux, neatbalsta VLOOKUP, pārgāju uz epplus, ar šo bibliotēku viss ok.

Visu ir izdevies sataisīt ar tonnu if'iem.

Gribētos optimizēt ar loopu, bet nevaru izfunktierēt.

 

piemērs:

Ir Excel tabula. Reālā tabula, kur datu daudzums mainās, sākas ar rowu 9.

 

Man risinājums nav visai unikāls. Skatos cik ir kopā rowi (13) atņemu sākuma datu rowu (9), iegūstu ierakstu skaitu  var rows = 4.

Pēc tam taisu lielu blāķi koda:

 

if (rows == 1)

{

rakstam vienu xml elementu ar jāņa datiem

}

if (rows == 2)

{

rakstam vienu xml elemetnu ar jāņa datiem

rakstam otru xml elementu ar pētera datiem

}

if (rows == 3)

{

rakstam vienu xml elemetnu ar jāņa datiem

rakstam otru xml elementu ar pētera datiem

rakstam trešo xml elementu ar uga datiem

}

...........

 

Problēma tā, ka es uz problēmām skatos ļoti plaši. nevaru izdomāt pareizu loopu.

Domāju, ka te man jāsadala, vispirms izdomāt kā loops strādās un tad iespējams vēl ar citu loopu rakstīt datus.

 

 

Edit:

 

Laikam būs tā.

While loops checkos rowu skaitu un pildīsies tik ilgi līdz atlikušais row skaits būs 0.

Viņam iekšā būs for loops, kas pildīsies kopā ar row skaitu.

Edited by snaikers
Link to post
Share on other sites

 

 

Bet excel fails ir komplicēts, tur nav vienkārša tabula. Tur sākumā ir izmētāti dati pa excel cells. bet ap kādu 70 rowu parādās tikai reāla tabula ar datiem. Excelī atrodamie dati visi ir vajadzīgi un nevar tur neko dzēst.
Pag, katru reizi ap kādu citu rindu sākas reālie dati? No kā atkarīgs, no kuras rindas sākas EMDASā importējamie dati?
Link to post
Share on other sites

Sākas visu laiku no vienas rindas, pieņemsim no 70 rindas.

Bet datu tur var būt gan 10 rindu garumā, gan piecu, kā kuru reizi. 

Nu ideja vienkārša, rēķinam rindu skaitu un rakstam xml elementus attiecīgi rindu skaitam.

var goods = ws.Dimension.End.Row - 70;
 if (goods == 1)
            {
                writer.WriteStartElement("GOOITEGDS");

                writer.WriteStartElement("asdasd", (ws.Cells["B19"].Value).ToString()));
                writer.WriteEndElement();
           
                writer.WriteEndElement();
             }
            else if (goods == 2)
            {..........................................

Kas izvēršas palagā un ne man patiktu to rakstīt, ne kādam kaut ko darīt. pašlaik ideja ir šāda, vēl neesmu notestējis:

 

  
while (goods > 0)
            {
            for (int i=25; i>20; i++)
            {
                //Cells[row, col]

                writer.WriteStartElement("GOOITEGDS");


               writer.WriteStartElement("sadasd", (ws.Cells[5, i].Value).ToString()));
                writer.WriteEndElement();
           
                writer.WriteEndElement();
            }
            var goods = goods -1;
            }
Edited by snaikers
Link to post
Share on other sites

Paldies par novērojumu, matemātiska kļūda.

 

Vineīgais kas man neiet ir šis testa kods.

 

Palasīšu, kas viņam nepatīk

writer.WriteStartElement("sadasd"+i);

while (goods > 0)
            {
            for (int i=25; i>20; i++)
            {
                //Cells[row, col]

                writer.WriteStartElement("GOOITEGDS");


              writer.WriteStartElement("sadasd"+i);
                writer.WriteEndElement();
           
                writer.WriteEndElement();
            }
            var goods = goods -1;
            }
Edited by snaikers
Link to post
Share on other sites
  • Solution

valodai nav ne vainas, tikai es tāds noobs :D c#

ieleja jā, man vajag, lai for loops nekad nebeigtos, jo visu nosaka while loops, cik tad garš viņš būs.

Jā, IDE par "var" uzreiz lamājās, my bad. izlaboju.

Kā arī atradu kļūdu par WriteStartElement.

 

Zemāk kods, pagaidām kļūda outofmemory :D un tagad sapratu savu stulbību, jo no for loopa viņš ārā neiziet :D

ok domāšu tālāk.

while (goods > 0)
            {
            for (int i=25; i>20; i++)
            {
                //Cells[row, col]

                writer.WriteStartElement("GOOITEGDS");


              writer.WriteStartElement("sadasd"+i.ToString());
                writer.WriteEndElement();
           
                writer.WriteEndElement();
            }
            goods = goods -1;
            }

Vienkāršu lietu, pārāk daudz sarežģīju.

un viss ir tā kā man vajag:

var goods = ws.Dimension.End.Row - 70;
var i =25;
while (goods > 0)
            {
  
                //Cells[row, col]

                writer.WriteStartElement("GOOITEGDS");


              writer.WriteStartElement("sadasd"+i.ToString());
                writer.WriteEndElement();
           
                writer.WriteEndElement();
           i++;
            goods = goods -1;
            }
Edited by snaikers
Link to post
Share on other sites

Paldies Mežaveci, skatījos, iebraukt vispār nevarēju, lai nolasītu šūnu, tik daudz koda. Es izgāju cauri kādām 4 vai 5 bibliotēkām, ērtākās bija closedxml, kurai nav VLOOKUP atbalsta, tāpēc atmetu un EPPlus ir viss, ko vajag, ir izdevies panākt visu nepieciešamo funkcionalitāti, tagad tikai atlicis, saprogrammēt visas xml birkas un to mapošana.

            FileInfo fileName = new FileInfo("C:\\temp\\EX1.xlsx");
            ExcelPackage pck = new ExcelPackage(fileName);
            var ws = pck.Workbook.Worksheets["Sheet1"];

            (ws.Cells["B19"].Value).ToString()

Priekš manis nooba ideāli, dabūnu to ko vajag no dažām rindām.

 

Noteikti OpenXML, ir ar daudz vairāk funkcionalitātēm, bet man pietiek ar šo.

 

P.S.

Vēlāk gribēšu vēl to gan jau smuki pasniegt ar GUI. Tur atkal gan jau uz kāda akmens uzkāpšu :D

Edited by snaikers
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...