2017-06-15 3 views
0

Ich habe eine Reihe von Word-Dokumenten erhalten, die automatisch aus einer Datenbank eines Drittanbieters generiert wurden. Der meiste (wenn nicht der gesamte) Inhalt befindet sich in Tabellen. Das Problem ist, dass in vielen Zellen der Text aufgrund eines Überlaufs nicht vollständig sichtbar ist. Die Spaltenbreite und Zeilenhöhe wird mit absoluten Werten festgelegt. Die Spaltenbreiten können nicht geändert werden. Wenn ein Überlauf vorliegt, sollte die Zeilenhöhe geändert werden, damit der Text über mehrere Zeilen hinweg ausgeführt werden kann.MS Word Tabelle Zelle Textüberlauf

Meine Frage ist: ist es in irgendeiner Weise möglich, die Zellen zu finden, wo dies der Fall ist, und nur für diese Zeilen setzen Sie die Höhe auf wdRowHeightAuto.

Ich habe versucht, nur alle Zeilen auf automatische Höhe zu ändern, aber das verwirrt wirklich das Layout.

Ich denke jetzt über den folgenden Ansatz nach, aber ich frage mich wirklich, ob es keinen einfacheren Weg gibt.

  1. für jede Zelle eingestellt Cell.FitText auf true
  2. Überprüfen Sie, ob Schrift Skala
  3. Set FitText zurück auf false
  4. Wenn Schrift Skala von FitText, stellen Zeilenhöhe auf Auto geändert wurde geändert wurde

Jede Hilfe VBA oder C# würde geschätzt werden!

Dies ist, wo ich bin, aber ich bekomme Laufzeitfehler über den Zugriff auf die einzelne Spalte aufgrund unterschiedlicher Spaltenbreiten nicht zugänglich. Einzelne Zeilen sind auch nicht zugänglich, da es sich um verbundene Zellen handelt.

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

Haben Sie versucht, mit 'SomeTable.Rows.HeightRule = wdRowHeightAtLeast', dann ist dies die Zeilenhöhe auf ein Minimum halten, was Sie legen Sie es als und wenn es zusätzliche Texthöhe der Reihe ist, wird je nach Bedarf anpassen. –

+0

Danke für den Vorschlag! Das Ergebnis sah vielversprechend aus. Die Zeilenhöhen, wie sie jetzt sind, sollten nur geändert werden, wenn ein Überlauf vorliegt. Ich habe versucht, die Table.Rows.HeightRule zu setzen, aber dies änderte zu viele der Zeilenhöhen, die keinen Überlauf haben. Da ich die aktuelle Zellenhöhe als Minimum übergeben möchte, habe ich versucht, die SetHeight (cell.Height, wdRowHeightAtLeast) zu verwenden, aber hier habe ich wieder das Problem, dass ich nicht auf einzelne Zeilen oder Zellen wegen der verbundenen Zellen zugreifen kann. – ltondeleir

Antwort

1

fand ich eine Lösung dank Jean-Pierre Oosthuizen Vorschlag wdRowHeightAtLeast zu verwenden. Sie können auf die einzelnen Zellen zugreifen, auch wenn die einzelnen Zeilen nicht zugänglich sind (aufgrund von vertikal verbundenen Zellen), indem Sie Range.Cells verwenden.

Ich übergebe die aktuelle Zeilenhöhe als Minimum für wdRowHeightAtLeast, um sicherzustellen, dass das Layout nicht geändert wird, wenn der Text in die Zellen passt.

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; 
         } 
        } 
       }