[c#/vsto] remplacer et conserver la mise en forme

remplacer et conserver la mise en forme [c#/vsto] - C#/.NET managed - Programmation

Marsh Posté le 02-05-2006 à 14:00:35    

bon allez une question que le mvp .net et COM trouverons facile.
j'ai des documents words (plein!!) et ceux ci sont assez sales.
je cherche a degager les doubles espaces ou a rajouter des insécables apres certains mots
pour l'instant je fait ca en regexp sur un doc.Content.Text
evidemment le probleme c'est que la propriete Range.Text sort du texte brut, donc je perds toutes les mise en forme (style, ital, bold, exposant...)
 
donc c'est quoi la methode pour lancer des regexp et conserver la mise en forme?
parce que le Range.Find() il est gentil mais c'est juste un str_replace() d'apres ce que je vois.
 
actuellement :  
- j'ouvre un doc word  
- j'extrait le Texte
- je lance un Regexp.Replace(String, Pattern, String).

Reply

Marsh Posté le 02-05-2006 à 14:00:35   

Reply

Marsh Posté le 02-05-2006 à 17:08:18    

tu peux t'inspirer de cette macro VBA à deux balles qui fait ce que tu veux sans les problèmes que tu évoques (Word 2003)
 

Code :
  1. Option Explicit
  2. Public Sub Test()
  3.     Dim str As String
  4.    
  5.     Dim i
  6.     On Error GoTo Fin
  7.    
  8.     For i = 1 To Selection.Characters.Count
  9.         If Selection.Characters(i) = Chr(11) Then Selection.Characters(i) = Chr(13)
  10.            
  11. Test:
  12.         If isBlank(Selection.Characters(i), False) And isBlank(Selection.Characters(i + 1), True) Then
  13.             Selection.Characters(i) = ""
  14.             GoTo Test
  15.         End If
  16.     Next
  17. Fin:
  18.     MsgBox ("Fini" )
  19. End Sub
  20. Public Function isBlank(str As String, withJump As Boolean) As Boolean
  21.     If str = " " Or str = Chr(9) Or (withJump And str = Chr(13)) Then
  22.         isBlank = True
  23.     Else
  24.         isBlank = False
  25.     End If
  26. End Function


 
Seul truc : faut faire CTRL+A avant de lancer la macro, je sais pas comment sélectionner tout le document depuis une macro :ange:

Reply

Marsh Posté le 02-05-2006 à 17:09:30    

A priori, faut simplement jouer avec la collection de Characters de la Selection, et non le Content. La collection permet de déplacer les tags de mise en forme automatiquement.

Reply

Marsh Posté le 03-05-2006 à 18:52:24    

je fait une console app. a priori c'est la meme chose donc ca serait quelque chose comme :
(en c#)

Code :
  1. Word.Document doc = new Word.Document();
  2. doc.ActiveWindow.Selection.WholeStory();


et la t'as tout le doc en selection.
col de Characters? cool :), j'ai passé la journée d'hier a essayer de trouver et je suis passé a autre chose.
je vais essayer ca de ce pas, on va voir ce que ca va donner avec les regexp tiens.


Message édité par pop-pan le 03-05-2006 à 18:53:34
Reply

Marsh Posté le 03-05-2006 à 20:27:06    

Ben essaie de voir si tu peux retrouver les mêmes objets en C# qu'en VBA, y'a pas de raisons qu'ils soient pas les mêmes :)
 
Par contre, je veux bien que tu me dises comment t'arrive à jouer avec Word (donc par extension, Excel) à partir de C#. C'est avec VS 2005 ou VS 2003 ? J'ai essayé avec le 2005, et je me suis résigné à lancer un VBS qui bidouille dans Excel, faute de trouver comment le faire depuis C# :spamafote:

Reply

Marsh Posté le 03-05-2006 à 21:27:55    

fw .net 2.0
sous VS2005
office 2003 + extensions support .net
t'installe vsto.
 
dans tes references tu rajoutes les lib COM office 11
 
dans ton code.
using Microsoft.Office;
using Office = Microsoft.Office.Core;
using Word = Microsoft.Office.Interop.Word;
 
et voila

Reply

Marsh Posté le 04-05-2006 à 12:09:01    

Hmmm. Ok.
Faudra à l'occasion que tu détailles un peu plus (vsto, le nom des objets COM, un petit exemple de code).
 
Parceque c'est ce que j'avais fait. Bon, faut dire que j'utilisais la Béta de VS 2005, et c'est peut-être pour ça que ça marchait pas. Je devrais avoir dès demain le DVD de la vrai version (chez M$, ils encaissent vite les abonnements MSDN, mais ils sont pas rapides pour envoyer les valises de DVD, on les a reçu avant-hier -au bout de 3 mois-, je les aurai ce soir :o)
 
Dans tous les cas, je crois que je vais rester avec mon VBS, car mon souci, c'est qu'il faut que ça marche aussi avec Excel 2000, et si possible 97.
 
D'ailleurs, personne n'a Office 97 sous la main pour me dire si ce script donne un résultat ?
 
Créer un fichier "excel.vbs" contenant le code ci-dessous, puis double-cliquer dessus :

Code :
  1. Option Explicit
  2. Sub test()
  3.     Dim xls
  4.     Dim wkb
  5.     Dim sht
  6.    
  7.     Set xls = CreateObject("Excel.Application" )
  8.     Set wkb = xls.Workbooks.Add()
  9.     Set sht = wkb.Sheets.Add()
  10.    
  11.     sht.Cells(1, 1).Value = "test"
  12.     sht.Cells(1, 2).Value = "1"
  13.     sht.Cells(1, 3).Value = "2"
  14.     sht.Cells(1, 4).Value = "=R1C2+R1C3"
  15.    
  16.     xls.Visible = True
  17. End Sub
  18. Call test()

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed