2017-06-15 2 views
0

J'ai reçu un certain nombre de documents Word générés automatiquement à partir d'une base de données tierce. La plupart (sinon la totalité) du contenu se trouve dans des tables. Le problème est que dans de nombreuses cellules, le texte n'est pas entièrement visible en raison du débordement. La largeur de colonne et la hauteur de ligne sont définies avec des valeurs absolues. Les largeurs de colonnes ne peuvent pas être modifiées. En cas de débordement, la hauteur de ligne doit être modifiée pour permettre au texte de s'exécuter sur plusieurs lignes.Dépassement de texte MS Word Table Cell

Ma question est la suivante: est-il possible de trouver les cellules où c'est le cas et seulement pour ces lignes définir la hauteur à wdRowHeightAuto.

J'ai essayé de changer toutes les lignes en hauteur automatique, mais cela perturbe vraiment la mise en page.

Je considère maintenant l'approche suivante, mais je me demande vraiment s'il n'y a pas de manière plus facile.

  1. Pour chaque cellule, définissez Cell.FitText true
  2. Vérifiez si l'échelle de la police a été modifiée
  3. Set FitText Retour false
  4. Si l'échelle de la police a été modifiée par FitText, réglez la hauteur de ligne sur Auto

Toute aide VBA ou C# serait appréciée!

C'est où je suis, mais je reçois des erreurs d'exécution à propos de l'accès à la colonne individuelle n'est pas accessible en raison de la largeur des colonnes différentes. Les rangées individuelles ne sont pas non plus accessibles car il y a des cellules fusionnées.

app = new Word.Application(); 

      foreach (var file in inputFiles) 
      { 
       var doc = app.Documents.Open(file); 

       foreach (var table in doc.Tables) 
       { 
        foreach (var column in table.Columns) 
        { 
         try 
         { 
          foreach (var cell in column.Cells) 
          { 
           cell.FitText = true; 

           bool textIsScaled = false; 

           if (cell.Range.Font.Scaling != 100) 
            textIsScaled = true; 

           cell.FitText = false; 

           if (textIsScaled) 
            cell.HeightRule = WdRowHeightRule.wdRowHeightAuto; 
          } 
         } 
         catch (Exception) 
         { 
          continue; 
         } 
        } 
       } 

       doc.Save(); 

       doc.Close(); 

      } 
+0

Avez-vous essayé d'utiliser 'SomeTable.Rows.HeightRule = wdRowHeightAtLeast', c'est garder la hauteur de ligne à un minimum de ce que vous définissez comme s'il y a du texte supplémentaire la hauteur de ligne ajustera au besoin. –

+0

Merci pour cette suggestion! Le résultat semblait prometteur. Les hauteurs de rangée telles qu'elles sont maintenant ne devraient être changées qu'en cas de débordement. J'ai essayé de définir Table.Rows.HeightRule, mais cela a modifié trop de hauteurs de ligne qui n'ont pas de débordement. Voulant passer la taille de la cellule actuelle au minimum, j'ai essayé d'utiliser SetHeight (cell.Height, wdRowHeightAtLeast), mais là encore j'ai le problème que je ne peux pas accéder à des lignes ou des cellules individuelles à cause des cellules fusionnées. – ltondeleir

Répondre

1

J'ai trouvé une solution grâce à la suggestion de Jean-Pierre Oosthuizen utiliser wdRowHeightAtLeast. Vous pouvez accéder aux cellules individuelles même si les lignes individuelles ne sont pas accessibles (en raison de cellules fusionnées verticalement) en utilisant Range.Cells.

Je passe la hauteur de ligne actuelle au minimum pour wdRowHeightAtLeast afin de m'assurer que la mise en page n'est pas modifiée si le texte entre dans les cellules.

foreach (var table in doc.Tables) 
       { 
        table.Rows.AllowBreakAcrossPages = 0; 

        var cells = table.Range.Cells; 

        foreach (var cell in cells) 
        { 
         try 
         { 
          cell.SetHeight(cell.Height, WdRowHeightRule.wdRowHeightAtLeast); 
         } 
         catch (Exception ex) 
         { 
          Logger.LogError(ex); 
          continue; 
         } 
        } 
       }