Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Boxa membrana tweeter infundata

ajutor

Whisky for Mac

Xiaomi 14 Gpay
 Izolare zid exterior de scandura

Dezinstalare drivere W11 23H3

Recomandare masina de spalat fiab...

BSOD din cauza Intel Audio DSP dr...
 De ce sunt oamenii nostalgici

Cum vand casa fara factura Hidroe...

Scor FICO minim

Tonometru compensat CAS?
 polita RCA ONLINE

Termostat frigider - verificare

Mai au PC-urile vreun viitor?

Centrala termica immergas
 

Vreau un sfat...

- - - - -
  • Please log in to reply
10 replies to this topic

#1
mlhaltza

mlhaltza

    Junior Member

  • Grup: Members
  • Posts: 156
  • Înscris: 09.06.2007
Hello tuturor!

Am următoarea dilemă, pe care sper să o pot rezolva cu ajutorul vostru, prin exemple directe, linkuri sau orice altceva:

- se dă: un director cu aproximativ 200 fișiere word (doc si docx) în care doresc înlocuirea unui set de caractere cu altele (exemplu: *nume* cu numele adevarat al clientilor, etc.). Modificarea manuală este exclusă din start, iar folosirea de macro deasemenea;

- se cere: vreau să fac o mică aplicație, care să înlocuiască anumite seturi de caractere (*nume*, *adresa*, etc.) cu date reale, pentru toate fișierele dintr-un foc, dar, nemodificând directorul cu pricina, acesta constituind un model, ci o copie a acestuia, copie creată tot din acest progrămel într-o altă locație aleasă de mine. Adică, mai exact, din imaginea de mai jos, în momentul în care apăs pe "Go!", (după ce completez toate câmpurile, evident) să mă întrebe unde vreau să salvez (copiez) respectivul director, și să facă înlocuirile propriu-zise.

Attached File  Untitled.jpg   17.51K   29 downloads

Vă mulțumesc anticipat și apreciez orice ajutor!  :worthy:

#2
macaz

macaz

    Junior Member

  • Grup: Members
  • Posts: 108
  • Înscris: 14.06.2007
Banuiesc ca vrei sa faci treaba asta in VB.Net; daca ai Office-ul instalat foloseste-te chiar de el adaugand o referinta la Word in proiectul tau.

Apoi te apuci frumos sa scrii o rutina pe care eu unul as vedea-o asa:

Private Sub Replace(ByRef Source As String, ByRef Destination As String, ByRef Strings As Array)
.
.
.
End Sub

Adica in Source pui calea spre directorul sursa unde se gasesc documentele, in Destination calea spre directorul destinatie unde vor fi salvate documentele editate iar Strings este o matrice bidimensionala cu perechi de siruri (de inlocuit,inlocuitor) pe care rutina va trebui sa le caute si sa le inlocuiasca in documente.

Rutina va trebui sa enumere toate fisierele cu extensiile .doc si .docx din Source sa le deschida, editeze  si  sa le salveze in Destination.

Nu este chiar asa greu, am incercat o varianta de proba  si pe un set de 200 de documente cu 4 perechi de siruri de inlocuit a durat circa 1.5 minute toata operatia.
Toata rutina contine in jur de 25 linii de cod. Daca reusesti sa o scrii restul e joaca.

Nu am pus si codul sursa deoarece sunt curios la implementarea ta.

#3
mlhaltza

mlhaltza

    Junior Member

  • Grup: Members
  • Posts: 156
  • Înscris: 09.06.2007

View Postmacaz, on 6th September 2009, 18:33, said:

Banuiesc ca vrei sa faci treaba asta in VB.Net; daca ai Office-ul instalat foloseste-te chiar de el adaugand o referinta la Word in proiectul tau.

Apoi te apuci frumos sa scrii o rutina pe care eu unul as vedea-o asa:

Private Sub Replace(ByRef Source As String, ByRef Destination As String, ByRef Strings As Array)
.
.
.
End Sub

Adica in Source pui calea spre directorul sursa unde se gasesc documentele, in Destination calea spre directorul destinatie unde vor fi salvate documentele editate iar Strings este o matrice bidimensionala cu perechi de siruri (de inlocuit,inlocuitor) pe care rutina va trebui sa le caute si sa le inlocuiasca in documente.

Rutina va trebui sa enumere toate fisierele cu extensiile .doc si .docx din Source sa le deschida, editeze  si  sa le salveze in Destination.

Nu este chiar asa greu, am incercat o varianta de proba  si pe un set de 200 de documente cu 4 perechi de siruri de inlocuit a durat circa 1.5 minute toata operatia.
Toata rutina contine in jur de 25 linii de cod. Daca reusesti sa o scrii restul e joaca.

Nu am pus si codul sursa deoarece sunt curios la implementarea ta.


Thanks man! N-o fi greu, dar tot nu m-am descurcat...nu-mi iese nimic  :confuzzled:

Mai astept totusi mici indicii. Mersi pentru interes!

#4
macaz

macaz

    Junior Member

  • Grup: Members
  • Posts: 108
  • Înscris: 14.06.2007
Deci adaugi o referinta la Word in proiectul tau: Project->Add Reference... selectezi tabul .Net si cauti Microsoft.Office.Interop.Word in acea lista.

Apoi in form inaintea oricarei declaratii adaugi urmatoarele linii de cod:
Imports MSWord = Microsoft.Office.Interop.Word
Imports System.IO
Aceste doua linii de cod nu erau neaparat necesare dar reprezinta o modalitate mai usoara de scris codul.

Pe urma rutina:
Private Sub Replace(ByRef Source As String, ByRef Destination As String, ByRef Strings As Array)

		Dim Word As New MSWord.Application
		Word.Visible = False
		Dim Doc As MSWord.Document
		Dim docArr As FileInfo() = New DirectoryInfo(Source).GetFiles("*.doc?")
		For Each fi As FileInfo In docArr
			Doc = Word.Documents.Open(fi.FullName)
			For i As Integer = 0 To UBound(Strings)
				Doc.Content.Find.Execute(FindText:=Strings(i, 0), ReplaceWith:=Strings(i, 1), Replace:=MSWord.WdReplace.wdReplaceAll)
			Next
			Doc.SaveAs(Destination & fi.Name)
			Doc.Close()
		Next
		Word.Quit()
		docArr = Nothing
		Doc = Nothing
		Word = Nothing
End Sub
pe care o apelezi sub forma:
Dim srep(,) As String = {{"*nume*", "Popescu"}, {"*adresa*", "Romania"}, {"*telefon*", "123456789"}, {"*mail*", "[email protected]"}}
 Replace("C:\DocSource\", "C:\DocDest\", srep)

Evident inlocuiesti directoarele sursa si destinatie cu ce ai tu nevoie precum si perechile de siruri (de inlocuit,inlocuitor).
Pentru selectarea directoarelor poti folosi un FolderBrowserDialog iar rutina o poti rula intr-un thread separat (cu ajutorul unui BackgroundWorker) pentru a nu ingheta fereastra principala in timpul rularii.

Sper ca acest exemplu sa te lamureasca cat de cat.

#5
mlhaltza

mlhaltza

    Junior Member

  • Grup: Members
  • Posts: 156
  • Înscris: 09.06.2007

View Postmacaz, on 10th September 2009, 20:30, said:

Deci adaugi o referinta la Word in proiectul tau: Project->Add Reference... selectezi tabul .Net si cauti Microsoft.Office.Interop.Word in acea lista.

Apoi in form inaintea oricarei declaratii adaugi urmatoarele linii de cod:
................................................................................
......................

Thanks man! Chiar m-a ajutat. Ce mi-a iesit pana acum: in functie de checkbox-ul selectat (pers fizica sau juridica), copiez directorul corespunzator (modelul cu toate fisierele word) in locatia aleasa printr-un FolderBrowserDialog, unde au loc modificarile, salvarile, etc.

Mai am nevoie insa de inca 4 campuri (textbox sau ceva de genul asta) care sa reprezinte:
- tipul studiilor;
- denumire liceu, universitate, etc.;
- anul inceperii studiilor;
- anul terminarii studiilor

...dar acestea trebuie sa fie "dinamice", adica, la apasarea unui buton de exemplu sa apara iar aceste 4 campuri, ori de cate ori am nevoie, pentru situatiile in care un client poate sa aiba de la 1 set de astfel de date (liceu), pana la n seturi (liceu, facultate, masterat, etc.). As putea sa scriu "de mana" toate aceste date intr-o singura casuta text, dar in functie de numele universitatii/liceului, an incepere/terminare studii, trebuie sa inlocuiesc in fisierele cu pricina, automat, niste paragrafe prestabilite.

Mai exact avand in vedere ca intr-un fisier doc am, continuand exemplul de mai sus caracterele *studii* in urma inlocuirii va rezulta:

client 1
adresa 1
liceu1; numeliceu1; an incepere-an terminare
paragraf corespunzator liceului/anilor, etc.

sau

client 2
adresa 2
liceu2; numeliceu2; an incepere-an terminare
paragraf corespunzator liceului/anilor, etc.
facultate2; numefacultate2; an incepere-an terminare
paragraf corespunzator facultatii/anilor, etc.
masterat2; numemasterat2; an incepere-an terminare
paragraf corespunzator masteratului/anilor, etc.
......etc............................................................

Sper ca m-am facut cat de cat inteles, si astept cu nerabdare orice sfat.
Va multumesc!

#6
macaz

macaz

    Junior Member

  • Grup: Members
  • Posts: 108
  • Înscris: 14.06.2007
Nu prea am inteles mare lucru... este vorba tot de inlocuire a unui text cu altul? sau inserarea unui text in document in functie de cerinte?

Oricum rutina de mai sus nu este limitata la fix patru seturi de siruri, se poate adauga oricate seturi este nevoie adica:

Dim srep(,) As String = {{"*nume*", "Popescu"}, {"*adresa*", "Romania"}, {"*telefon*", "123456789"}, {"*mail*", "[email protected]"}, {"*studii*", "blabla"}}

pentru ca:
 For i As Integer = 0 To UBound(Strings)

in acest caz vor fi 5 perechi de siruri
unde sirul "blabla" reprezinta un sir construit de tine pe baza informatiilor din cele 1 la n textbox-uri.

#7
mlhaltza

mlhaltza

    Junior Member

  • Grup: Members
  • Posts: 156
  • Înscris: 09.06.2007

View Postmacaz, on 13th September 2009, 17:45, said:

Nu prea am inteles mare lucru... este vorba tot de inlocuire a unui text cu altul? sau inserarea unui text in document in functie de cerinte?
.........................

In primul rand iti multumesc ca te implici!
In al doilea rand, da, ai dreptate si m-am folosit la greu de aceste siruri; nu asta e problema. Am incarcat cele 3 screenshoturi pentru ca e mai usor (cred) sa ma fac inteles:
Attached File  1.jpg   28.52K   23 downloadsAttached File  2.jpg   24.74K   21 downloadsAttached File  3.jpg   26.05K   16 downloads

Deci, in primul tab e totul ok si functioneaza asa cum ar trebui; in tabul 2 merge doar daca am o singura categorie de studiu. Ce vreau eu, e, ca la apasarea unui buton "Adauga studii", sa-mi mai introduca inca un tab, si inca unul....etc. cu aceleasi campuri astfel incat, la final, in documentul cu pricina, sa-mi inlocuiasca caracterele *studii* cu respectivele seturi de studii (unu, doua, noua sau cate or fi). Se exclude din start ideea sa pun pe aceeasi pagina (form) de mai multe ori aceleasi campuri (tip studii, nume institutie...)
Nu stiu daca se poate ce vreau eu, si sper ca s-a mai inteles ceva.

P.S. Ideea cu taburi e doar ca exemplu; daca se poate altfel, cu alte instrumente nu este nici o problema
Mersi !  :thumbup:

#8
macaz

macaz

    Junior Member

  • Grup: Members
  • Posts: 108
  • Înscris: 14.06.2007
Am inteles... well nu este nici greu dar nici usor nu e. Adaugarea unui TabPage se face usor, de exemplu:

TabControl1.TabPages.Add("Studii" & (TabControl1.TabPages.Count-1).ToString)

Apelata din evenimentul click al butonului care adauga studii iti va adauga cate un tab nou incepand cu "Studii1".
Problema este adaugarea controalelor pe fiecare pagina astfel creata... in cazul tau este vorba de cinci textbox-uri si tot atatea label-uri.

Eu vad doua variante:
1. Va trebui sa scrii de mana codul care adauga fiecare control, sa pastrezi o variabila obiect (globala) la fiecare textbox din fiecare pagina, eventual o matrice de controale, sa setezi individual proprietatile fiecarui textbox (marime, pozitie, culoare etc) deci destul de greu de manipulat.

2. Creezi un User Control pe care aranjezi cele cinci textbox-uri si etichete dupa cum vrei tu (Project>Add User Control...) pe care il vei adauga ca un nou TabPage de fiecare data cand ai nevoie.
de exemplu sa zicem ca se cheama UserControl1:
Private Sub AddNewTab()
	Dim tp As New TabPage("Studii" & (TabControl1.TabPages.Count - 1).ToString)
	'tp.UseVisualStyleBackColor = True
	tp.Controls.Add(New UserControl1)
	TabControl1.TabPages.Add(tp)
	TabControl1.SelectTab(TabControl1.TabPages.Count - 1)
End Sub
aceasta rutina va adauga la fiecare apel cate un TabPage nou cu toate controalele continute in UserControl1, deci fara prea multe batai de cap.
Partea sexoasa in acest caz este accesarea proprietatilor fiecarui control (proprietatea Text a textbox-urilor) dar se poate si asta.
Apoi colectezi toate sirurile din cele cinci textbox-uri de pe fiecare pagina de proprietati si construiesti cu ele un sir pe care il vei pasa ca text inlocuitor la "*studii*".

Asta daca am inteles eu bine...

#9
mlhaltza

mlhaltza

    Junior Member

  • Grup: Members
  • Posts: 156
  • Înscris: 09.06.2007
Foarte tare partea cu "sexoasa"  :w00t: . Si da...ai inteles perfect ceea ce vreau. Exemplul cu taburi l-am dat tocmai pentru ca am gasit ceva de genul asta pe un site si acolo se vorbea de acelasi lucru, adica "User Control". Si da, chiar este mai complicat un pic cu accesarea textboxurilor din user control...dar muncesc cu drag si spor.
Multumesc pentru informatii; revin cu info.
Esti tare  :thumbup: :worthy:

#10
mlhaltza

mlhaltza

    Junior Member

  • Grup: Members
  • Posts: 156
  • Înscris: 09.06.2007
Pe cât de optimist am fost, pe atât de repede m-am desumflat.  :cursing:
Caut de o săptămână exemple, tutoriale, ceva, dar degeaba...ori găsesc frânturi de informații dar pentru vb4/5/6, ori nu găsesc nimic, și astfel, nu reușesc deloc să "leg" controalele din User Control cu Main Form-ul. Dacă aveți idee cum pot face asta, vă rog... :confuzzled: ; dacă nu, cred că mă las păgubaș.

Mulțam pentru tot!

#11
macaz

macaz

    Junior Member

  • Grup: Members
  • Posts: 108
  • Înscris: 14.06.2007
Sa inteleg ca nu poti sa culegi textul dintr-un textbox de pe acele usercontrols? aka sexoasa? :lol: trebuie oleaca de logica aici!
Daca adaugarea unui nou TabPage se face dupa exemplul meu de mai sus atunci:

-fiecare TabPage nou are un index (in cazul tau indexul 0 este tabul "General" iar celelalte taburi "Studii" incep de la 1)
-un TabPage este un container pentru controale, cu alte cuvinte TabPage(x).Controls returneaza o colectie de controale
-pe fiecare TabPage nou creat nu exista decat un singur control (usercontrol1), deci TabPage(x).Controls.Item(0) returneaza o referinta la UserControlul de pe tabul cu indexul x
-fiecare usercontrol este un container pentru controalele continute (textbox-urile alea amarate),  deci TabPage(x).Controls.Item(0).Controls returneaza o colectie de controale

ei bine acum este partea tricky:
-enumeram acea colectie de controale si in functie de numele fiecarui control putem sti daca acel control este un TextBox si actionam in consecinta

-accesam controlul direct!!
   MsgBox(DirectCast(TabControl1.TabPages(x).Controls.Item(0), UserControl1).TextBox1.Text)

unde x  reprezinta indexul tabului ce contine usercontrolul cu textbox-ul de care avem nevoie (poti face o bucla For de la 1 la TabControl1.TabPages.Count - 1, citesti fiecare textbox si construiesti textul ala de care ai nevoie).

Anunturi

Second Opinion Second Opinion

Folosind serviciul second opinion ne puteți trimite RMN-uri, CT -uri, angiografii, fișiere .pdf, documente medicale.

Astfel vă vom putea da o opinie neurochirurgicală, fără ca aceasta să poată înlocui un consult de specialitate. Răspunsurile vor fi date prin e-mail în cel mai scurt timp posibil (de obicei în mai putin de 24 de ore, dar nu mai mult de 48 de ore). Second opinion – Neurohope este un serviciu gratuit.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate