View Full Version : [c#] modifica di un doc caricato in un controllo webbrowser
Ciao a tutti, sto creando un'applicativo visual c# con visual Studio 2005 che contiene un componente webBrowser che si occupa di caricare un file word.
Avrei bisogno di modificare dal codice c# il documento word. Ho visto che esiste una proprietà Document che però contiene un oggetto di tipo HtmlDocument che vale null se nel webbrowser metto un doc. Qualcuno sa come si può fare? Ciao e grazie
Non puoi usare più facilmente il controllo RichTextBox? che permette modifiche e salvataggi in maniera facile? tra cui tutti i metodi di selezione testo ...
Einstein
11-07-2006, 16:37
Il controllo WebBrowser non è pensato per gestire i file di Word.
Secondo me ti conviene seguire la strada COM Interop, generando il Managed Wrapper del modello ad oggetti di Word.
Se usi Visual Studio puoi aggiungere la Object Library di Word tra le references del progetto, e l'IDE creerà il managed wrapper per te.
Fatto questo, puoi permetterti una cosa del tipo:
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
Ovviamente chi utilizza il tuo programma dovrà avere anche Word installato.
Ciao
maxithron
11-07-2006, 19:18
In mancanza di VSTO, devi necessariamente appoggiarti a COM come ti è stato suggerito. Un esempio molto banale per l'apertura di un file word, pronto per essere modificato, potrebbe essere:
//supponendo che tu utilizzi un openFileDialog ed un command button:
private void openWordFile(object sender, EventArgs e)
{
OpenFileDialog myDialog = new openFileDialog();
myDialog.InitialDirectory = @"c:\";
myDialog.Filter = "Solo Documenti Word(*.doc)|*.doc";
myDialog.RestoreDirectory = true;
if (myDialog.ShowDialog == DialogResult.OK)
{
try
{
Word.ApplicationClass myWordApplication = new Word.ApplicationClass();
object nomeFile = myDialog.FileName;
object soloInLettura = False;
object visibile = true;
object missing = System.Reflection.Missing.Value;
myWordApplication.Visible = true;
Word.Document myDoc = myWordApplication.Documents.Open(ref nomeFile, ref soloInLettura, ref visible, ref missing, ref missing........blalbla)
myDoc.Activate();
}
catch(Exception ex)
{
//gestisci l'errore
}
}
Ovviamente sono concetti base, ma rendono l'idea di quanto sia semplice gestire determinate cose.
Grazie a tutti per le risposte, in effetti stamattina mi sono messo a fare delle preove con i COM PIA. Sono riuscito a fare qualcosa, però non riesco a visualizzare i doc all'interno dell'interfaccia dell'applicativo c#, ma solo nella finestra di word. C'è modo di aprire i doc in un componente .net e non nella gui di word?
BlackWalker
12-07-2006, 18:17
salve, questa cosa interessa moltoanche a me visto che devo
realizzare un piccolo motore di ricerca.
In pratica, a partire da una data directory nella quale ci sono alcuni documenti word, devo effettuare una ricerca all'interno dei ".doc" di un determinato "testo", e produrre una lista tipo google
con tutti i documenti trovati!
Adesso provo con i COM PIA intanto per vedere se almeno mi apre i ".doc"!
Non so' come effettuare poi una ricerca all'interno del "DOC" aperto!!!
Nessuno puo' darmi una mano?
Oppure se qualcuno conosce qualche sito che vende dei componenti per
farlo puo' segnalarmelo in pvt?
grazie molte! :)
Riassumendo mi sembra di aver capito che senza avere a disposizione i VSTO (Visual Studio Tools for Office) ci sono due approcci fattibili:
1) con il componente webBrowser: sono riuscito a caricare il documento all'interno dell'interfaccia sviluppata con c# ma non a modificare il documento tramite codice
2) con i primary interop assembly di COM sono riuscito a modificare il documento via codice ma non a caricare il documento all'interno dell'interfaccia c#
purtroppo io dovrei riuscire a fare entrambe le cose...
Stavo pensando adesso che forse potrei anche utilizzare un controllo ActiveX (se ne esistono per word) da inserire nella form c#, può essere una soluzione?
BlackWalker
13-07-2006, 17:12
Riassumendo mi sembra di aver capito che senza avere a disposizione i VSTO (Visual Studio Tools for Office) ci sono due approcci fattibili:
1) con il componente webBrowser: sono riuscito a caricare il documento all'interno dell'interfaccia sviluppata con c# ma non a modificare il documento tramite codice
2) con i primary interop assembly di COM sono riuscito a modificare il documento via codice ma non a caricare il documento all'interno dell'interfaccia c#
purtroppo io dovrei riuscire a fare entrambe le cose...
a me, tramite i primary interop assembly di COM mi ha dato errore anche aprendo il doc in questione.....facendo tutto alla lettera come esempi riportati o vedendone altri.
Tu come hai fatto?
E' possibile leggere il ".DOC"?
se puoi fammi sapere, grazie 1000! :D
maxithron
13-07-2006, 17:21
a me, tramite i primary interop assembly di COM mi ha dato errore anche aprendo il doc in questione.....facendo tutto alla lettera come esempi riportati o vedendone altri.
Tu come hai fatto?
E' possibile leggere il ".DOC"?
se puoi fammi sapere, grazie 1000! :D
Se mi posti il codice ci do uno sguardo.
Molto probabilmente, hai dimenticato qualche reference. :)
BlackWalker
13-07-2006, 18:20
Se mi posti il codice ci do uno sguardo.
Molto probabilmente, hai dimenticato qualche reference. :)
ce l'ho in ufficio ora..merda!
Comunque qui a casa uso un modulo ".cs" creato apposta per utilizzare word ma neanche quello va bene, mi da oggetto non trovato appena crea
un istanza dell'oggetto word...
I riferimenti COM di word ci sono.
Non puoi postarmi o in pvt, un piccolo esempio?
Magari poi ci smanetto io! :)
Grazie
BlackWalker
13-07-2006, 18:48
anche se creo un nuovo progetto, referenzio l'oggetto COM di Word
e scrivo solo questa linea:
private Word.ApplicationClass WordApp = new Word.ApplicationClass();
mi da "accesso negato" anche se metto nel web.config questo:
<identity impersonate="true"/>
il quale dovrebbe indicare di utilizzare l'utente attuale, giusto?
Che cavolo...non riesco ad uscirne fuori....aiutino? :D
BlackWalker
13-07-2006, 19:36
risolto modificando gli accessi alla DCOM di word! :D
Ora non so come leggere quello che c'e' scritto nel ".DOC"....si puo' fare?
QUalcuno sa come?
grazie! :D
Cosa intendi esattamente per "leggere"? Un esempio di lettura può essere questo (ti copia il testo del doc negli appunti):
//Avvio Word
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.ApplicationClass();
//Rendo visibile la finestra
app.Visible = true;
//Dichiaro l'oggetto nullo che mi servirà nelle chiamate di apertura e salvataggio a word
object nullobj = System.Reflection.Missing.Value;
//Dichiaro l'oggetto che mi servirà per aprire i file
object file = @"C:\zebrone.doc";
Microsoft.Office.Interop.Word.Document doc = app.Documents.Open(ref file, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj, ref nullobj);
//seleziono tutto
doc.ActiveWindow.Selection.WholeStory();
//copio la selezione
doc.ActiveWindow.Selection.Copy();
System.Windows.Forms.IDataObject data = Clipboard.GetDataObject();
string text = data.GetData(DataFormats.Text).ToString();
//Chiude il documento
doc.Close(ref nullobj, ref nullobj, ref nullobj);
//chiude word
app.Quit(ref nullobj, ref nullobj, ref nullobj);
BlackWalker
14-07-2006, 16:35
Cosa intendi esattamente per "leggere"? Un esempio di lettura può essere questo (ti copia il testo del doc negli appunti):
//Avvio Word
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.ApplicationClass();
//Rendo visibile la finestra
app.Visible = true;
//Dichiaro l'oggetto nullo che mi servirà nelle chiamate di apertura e salvataggio a word
object nullobj = System.Reflection.Missing.Value;
//Dichiaro l'oggetto che mi servirà per aprire i file
object file = @"C:\zebrone.doc";
Microsoft.Office.Interop.Word.Document doc = app.Documents.Open(ref file, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj,
ref nullobj, ref nullobj, ref nullobj, ref nullobj);
//seleziono tutto
doc.ActiveWindow.Selection.WholeStory();
//copio la selezione
doc.ActiveWindow.Selection.Copy();
System.Windows.Forms.IDataObject data = Clipboard.GetDataObject();
string text = data.GetData(DataFormats.Text).ToString();
//Chiude il documento
doc.Close(ref nullobj, ref nullobj, ref nullobj);
//chiude word
app.Quit(ref nullobj, ref nullobj, ref nullobj);
Ciao!
Per leggere intendevo riga per riga, comunque anche questo puo' andare bene.
Come hai letto sopra devo effettuare una ricerca all'interno di un certo numero
di ".DOC" di una parola e, se esiste, effettuare un elenco tipo google, di tutti
i documenti trovati!
Ho pensato di fare cosi:
Mi salvo il ".DOC", dopo che è stato inviato ed aperto, anche in formato "TXT" almeno è piu veloce.
Cosi avro 2 file:
Test.DOC
Test.TXT
Adesso devo fare in modo di effettuare la ricerca di un determinato "testo" inserito nel file ".TXT".
alcuni dubbi:
- Un modo rapido per effettuare questo tipo di ricerca sui file TXT?
- Ogni volta che chiudo il file Word, correttamente, mi rimane nel task manager un'istanza di WORD....come la elimino?
- Invece di utilizzare i ".TXT" che ne dici se utilizzo un database?(ci metto tutte le parole o solo le parole chiave?)
Suggerimenti?
Grazie 1000 :D
Ciao!
- Ogni volta che chiudo il file Word, correttamente, mi rimane nel task manager un'istanza di WORD....come la elimino?
Questo è strano: quando fai
app.Quit(ref nullobj, ref nullobj, ref nullobj);
dovrebbe uccidere il processo
BlackWalker
14-07-2006, 17:20
Questo è strano: quando fai
app.Quit(ref nullobj, ref nullobj, ref nullobj);
dovrebbe uccidere il processo
tu hai controllato bene che non ti rimane in memoria?
Riguardo al resto cosa mi suggerisci? :)
tu hai controllato bene che non ti rimane in memoria?
Si, viene chiuso correttamente; io uso Visual Studio 2005 e Office 2003, forse tu hai delle versioni diverse?
BlackWalker
14-07-2006, 18:28
Si, viene chiuso correttamente; io uso Visual Studio 2005 e Office 2003, forse tu hai delle versioni diverse?
Uso Visual Studio . NET 2003.
Riguardo alle altre cose puoi darmi dei consigli?
Grazie ancora! :D
BlackWalker
14-07-2006, 18:36
La chiusura funziona....avevo fatto una cavolata io :asd:
BlackWalker
14-07-2006, 18:52
rinnovo l'aiuto :D
Come avete letto sopra devo effettuare una ricerca all'interno di un certo numero
di ".DOC" di una parola e, se esiste, effettuare un elenco tipo google, di tutti
i documenti trovati!
Ho pensato di fare cosi:
Mi salvo il ".DOC", dopo che è stato inviato ed aperto, anche in formato "TXT" almeno è piu veloce.
Cosi avro 2 file:
Test.DOC
Test.TXT
Adesso devo fare in modo di effettuare la ricerca di un determinato "testo" inserito nel file ".TXT".
alcuni dubbi:
- Un modo rapido per effettuare questo tipo di ricerca sui file TXT?
- Invece di utilizzare i ".TXT" che ne dite se utilizzo un database?(ci metto tutte le parole o solo le parole chiave?)
Suggerimenti?
Grazie 1000
Puoi aprire i file, caricarli in una lista di stringhe e fare una normale ricerca, oppure se ti serve qualcosa di più raffinato puoi usare le regular expressions.
Sul fronte integrazione word/c# nessuna novità?
Aggiornamento: ho appena scoperto che l'integrazione di un documento Word in una form c# tramite componente webBrowser è possibile con Visual Studio 2003: infatti il controllo webBrowser ha una proprietà Document che contiene un Object castabile con Microsoft.Office.Interop.Word.DocumentClass che è proprio il modello a oggetti del documento, agendo sul quale si riesce e modificare il documento stesso. :cool:
A quanto pare, purtropppo la stessa cosa non si può fare in Visual Studio 2005 perchè la proprietà Document del componente webBrowser è di tipo HtmlDocument e comunque vale NULL quando nel webBrowser viene caricato un file che non sia un documento HTML. :muro:
Forse però è possibile fare la stessa cosa in modo divero: mi sembra strano che nella nuova versione di VS abbiano abolito una caratteristica così utile.
BlackWalker
18-07-2006, 11:21
Puoi aprire i file, caricarli in una lista di stringhe e fare una normale ricerca, oppure se ti serve qualcosa di più raffinato puoi usare le regular expressions.
Scusa, puoi spiegarti meglio come posso fare?
Grazie anticipatamente! :)
Scusa, puoi spiegarti meglio come posso fare?
Certamente, per la ricerca puoi usare qualcosa del genere:
String line;
try
{
//Crea un'istanza di StreamReader per leggere dal file
//L'istruzione using si occupa anche di chiudere lo StreamReader.
using (StreamReader sr = new StreamReader(openFileDialog1.FileName))
{
//Legge le righe del file finchè non è arrivato alla fine
while ((line = sr.ReadLine()) != null)
{
//a questo punto nella stringa "line" hai la riga corrente, se vuoi tutto il documento devi solo concatenarla al suo valore precedente
}
}
}
catch (Exception e1)
{
ErrorForm ef = new ErrorForm(e1.Message);
ef.Show();
ef.BringToFront();
}
A questo punto per ricercare nella tua stringa puoi fare semplicemente
line.IndexOf("Stringa da cercare");
BlackWalker
18-07-2006, 18:07
grazie 1000! :)
adesso provo!!!!
...
- Invece di utilizzare i ".TXT" che ne dite se utilizzo un database?
...
A questo proposito prova a dare un'occhiata a questo (http://www.codeproject.com/cs/samples/wse1.asp) articolo
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.