Jump to content

XLSX to XML automation


snaikers
 Share

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 comment
Share on other sites

snaikers
(labots)

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.

Labots - snaikers
Link to comment
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 comment
Share on other sites

snaikers
(labots)

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;
            }
Labots - snaikers
Link to comment
Share on other sites

_dunduks_

Ja dati sākas no 70.rindas, tad pareizi būs var goods = ws.Dimension.End.Row - 69;

  • Patīk 1
Link to comment
Share on other sites

snaikers
(labots)

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;
            }
Labots - snaikers
Link to comment
Share on other sites

snaikers
(labots)

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;
            }
Labots - snaikers
Link to comment
Share on other sites

snaikers
(labots)

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

Labots - snaikers
Link to comment
Share on other sites

Izveido kontu, vai pieraksties esošajā, lai komentētu

Jums ir jābūt šī foruma biedram, lai varētu komentēt tēmas

Izveidot jaunu kontu

Piereģistrējies un izveido jaunu kontu, tas būs viegli!

Reģistrēt jaunu kontu

Pierakstīties

Jums jau ir konts? Pierakstieties tajā šeit!

Pierakstīties tagad!
 Share

×
×
  • Izveidot jaunu...