2016-10-10 8 views
1

セルの最後までワードテーブルをアンダーラインにする方法を解明しようとしています。私は、もし行が長くても短くても問題があるようです。私は、言葉の専門家ではないです、しかし、私はこのコードがvb.netワードテーブルのフォーマット

以下

enter image description here

コードであるを生成するものである...すべての文字が同じサイズではないことを

enter image description here

を想定しています私は上記を作成するために使用しました。私は細胞の長さを確認することができるはずだと思いますか?どんな助けもありがとう。

公共の共有サブCreateWordDocument() あなたの問題には2つの部分がありますWord.Document

 'Start Word and open the document template. 
     oWord = CreateObject("Word.Application") 
     oWord.Visible = True 
     oDoc = oWord.Documents.Add 

     Dim Row As Integer, Column As Integer 
     Dim myTable As Word.Table = oDoc.Tables.Add(oDoc.Bookmarks.Item("\endofdoc").Range, 10, 2) 

     myTable.Range.ParagraphFormat.SpaceAfter = 1 

     Dim mystring As String = "This is my Test name That Runs over to the next line" 
     Dim address1 As String = "123 1st fake street" 
     Dim address2 As String = "Fake town place" 

     Dim mystring2 As String = "This is good line" 
     Dim address3 As String = "321 3rd fake street" 
     Dim address4 As String = "Fake town place" 
     Dim line As String = "_" 

     For Row = 1 To 10 

      If Row <> 5 Then 
       myTable.Rows.Item(Row).Range.Font.Underline = Word.WdUnderline.wdUnderlineSingle 
       myTable.Rows.Item(Row).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft 
       myTable.Rows.Item(Row).Range.Font.Bold = False 
       myTable.Rows.Item(Row).Range.Font.Size = 11 
       myTable.Rows.Item(Row).Range.Font.Underline = Word.WdUnderline.wdUnderlineSingle 
      End If 
      For Column = 1 To 2 

       If Column = 1 And Row = 1 Then 
        myTable.Cell(Row, Column).Range.Text = GetString(mystring) 
       ElseIf Column = 1 And Row = 2 Then 
        myTable.Cell(Row, Column).Range.Text = GetString(address1) 
       ElseIf Column = 1 And Row = 3 Then 
        myTable.Cell(Row, Column).Range.Text = GetString(address2) 
       ElseIf Column = 2 And Row = 1 Then 
        myTable.Cell(Row, Column).Range.Text = GetString(mystring2) 
       ElseIf Column = 2 And Row = 2 Then 
        myTable.Cell(Row, Column).Range.Text = GetString(address3) 
       ElseIf Column = 2 And Row = 3 Then 
        myTable.Cell(Row, Column).Range.Text = GetString(address4) 
       Else 
        myTable.Cell(Row, Column).Range.Text = GetString(line) 
       End If 
      Next 
     Next 

     Dim strCellText As String 
     Dim uResp As String 

     Dim itable As Table 

     For Each itable In oDoc.Tables 
      uResp = "" 
      For Row = 1 To itable.Rows.Count 
       For Col = 1 To itable.Columns.Count 
        strCellText = itable.Cell(Row, Col).Range.Text 
        If strCellText.Length >= 33 Then 
         Console.Write("this will be on a different line") 
        ElseIf strCellText.Length <= 31 Then 
         Console.Write("this will be on a different line") 
        End If 
       Next 
      Next 
     Next 

    Catch ex As Exception 

    End Try 


End Sub 

Public Shared Function GetString(ByVal strGetLine As String) As String 

    If strGetLine.Length <> 30 Then 
     Do Until strGetLine.Length >= 30 
      strGetLine += "_" 
      Dim count As String = strGetLine.Length 
     Loop 
    End If 

    Return strGetLine 

End Function 
+0

まだ喪失しています...私は行が32以上になると、次の行に流出すると思いました。ラインをトリムします。 – coder32

答えて

1

としてWord.Application 薄暗いoDocとして 点心oWordを試してみてください。 1つはフォントです。各行に "_"をあらかじめ決められた幅にパディングしているので、モノスペースのフォントを使用する必要があります。そうしないと、行が不均等に終わります。モノスペースのフォントでは、各文字は同じ幅を持ち、均一な線が得られます。次に、GetString関数は30文字未満の行を取り、それを埋め込みますが、30文字を超える行は処理しません。そのため、行は単独で折り返されます。この2つの問題を解決するために、フォントを固定幅フォント(この場合Courier New)に設定し、GetString関数のロジックを変更しました。現在、行が30文字を超える場合、関数はできるだけ文字列を30文字の限界に分割し、そこに改行を追加してから両方の行をアンダースコアで埋め込むことができるスペースを見つけます。ここで変更して、あなたのコードが含まれています:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    'Added these two Dim's so I could run your example 
    Dim oWord As Object 
    Dim oDoc As Document 

    oWord = CreateObject("Word.Application") 
    oWord.Visible = True 
    oDoc = oWord.Documents.Add 

    Dim Row As Integer, Column As Integer 
    Dim myTable As Word.Table = oDoc.Tables.Add(oDoc.Bookmarks.Item("\endofdoc").Range, 10, 2) 

    myTable.Range.ParagraphFormat.SpaceAfter = 1 

    Dim mystring As String = "This is my Test name That Runs over to the next line" 
    Dim address1 As String = "123 1st fake street" 
    Dim address2 As String = "Fake town place" 

    Dim mystring2 As String = "This is good line" 
    Dim address3 As String = "321 3rd fake street" 
    Dim address4 As String = "Fake town place" 
    Dim line As String = "_" 

    For Row = 1 To 10 
     'Removed this If, because all lines need font set to ensure same width, even if line has no text 
     'If Row <> 5 Then 
     myTable.Rows.Item(Row).Range.Font.Underline = Word.WdUnderline.wdUnderlineSingle 
     myTable.Rows.Item(Row).Range.ParagraphFormat.Alignment = Word.WdParagraphAlignment.wdAlignParagraphLeft 
     myTable.Rows.Item(Row).Range.Font.Bold = False 
     myTable.Rows.Item(Row).Range.Font.Size = 11 
     myTable.Rows.Item(Row).Range.Font.Underline = Word.WdUnderline.wdUnderlineSingle 
     myTable.Rows.Item(Row).Range.Font.Name = "Courier New" 'Set font to a monospaced font 
     'End If 

     For Column = 1 To 2 
      If Column = 1 And Row = 1 Then 
       myTable.Cell(Row, Column).Range.Text = GetString(mystring) 
      ElseIf Column = 1 And Row = 2 Then 
       myTable.Cell(Row, Column).Range.Text = GetString(address1) 
      ElseIf Column = 1 And Row = 3 Then 
       myTable.Cell(Row, Column).Range.Text = GetString(address2) 
      ElseIf Column = 2 And Row = 1 Then 
       myTable.Cell(Row, Column).Range.Text = GetString(mystring2) 
      ElseIf Column = 2 And Row = 2 Then 
       myTable.Cell(Row, Column).Range.Text = GetString(address3) 
      ElseIf Column = 2 And Row = 3 Then 
       myTable.Cell(Row, Column).Range.Text = GetString(address4) 
      Else 
       myTable.Cell(Row, Column).Range.Text = GetString(line) 
      End If 
     Next 
    Next 

    Dim strCellText As String 
    Dim uResp As String 
    Dim itable As Table 
    For Each itable In oDoc.Tables 
     uResp = "" 
     For Row = 1 To itable.Rows.Count 
      For Col = 1 To itable.Columns.Count 
       strCellText = itable.Cell(Row, Col).Range.Text 
       If strCellText.Length >= 33 Then 
        Console.Write("this will be on a different line") 
       ElseIf strCellText.Length <= 31 Then 
        Console.Write("this will be on a different line") 
       End If 
      Next 
     Next 
    Next 
End Sub 

Public Shared Function GetString(ByVal strGetLine As String) As String 
    'If strGetLine.Length <> 30 Then 
    ' Do Until strGetLine.Length >= 30 
    '  strGetLine += "_" 
    '  Dim count As String = strGetLine.Length 
    ' Loop 
    'End If 
    'New Function Logic: 

    'If the line is just a blank line, then just send back 30 underscores 
    If strGetLine.Trim.Equals("_") Then Return strGetLine.PadRight(30, "_") 

    Dim ret As String = Nothing 
    If strGetLine.Length > 30 Then 
     Dim lineBreak As Integer = 0 
     If strGetLine.Length >= 30 Then 
      Dim i As Integer = 0 
      Do While i <= 30 
       i = strGetLine.IndexOf(" ", i + 1) 
       If i <= 30 Then lineBreak = i 
      Loop 
     End If 
     ret = strGetLine.Substring(0, lineBreak).Trim.PadRight(30, "_") & vbCrLf 
     ret &= strGetLine.Substring(lineBreak, strGetLine.Length - lineBreak).Trim.PadRight(30, "_") 
    Else 
     ret = strGetLine.PadRight(30, "_") 
    End If 
    Return ret 
End Function 

出力する:

Line Test

を今、私はあなたが気づくと思うよ、右側の列に空白行があるように思われます(残りの空白行は10行のループからのものです)。これは、同じ行の他の列が2行あるためです。私はそれがあなたが望むかどうかわからないが、両方の列に同じ行数の外観が必要な場合は、列1の行を分割して余分な空白行を列2に...しかし、これはあなたが正しい方向に行くようにする必要があります

+0

ありがとうございました。私は、単語表の幅を設定する方法を理解しなければならないと仮定していましたが、それが問題でした。しかし、フォントの問題もあると思っていました。 – coder32