MS Word表单元格文本溢出

时间:2017-06-15 10:43:29

标签: vba word-vba office-interop

我收到了许多从第三方数据库自动生成的Word文档。大多数(如果不是全部)内容都在表格中。问题是在许多单元格中,由于溢出,文本不完全可见。列宽和行高用绝对值设置。列宽不能更改。如果存在溢出,则应更改行高以允许文本在更多行上运行。

我的问题是:是否有可能找到这种情况下的单元格,只有这些行才能将高度设置为wdRowHeightAuto。

我尝试将所有行更改为自动高度,但这确实会让布局变得混乱。

我现在正在考虑以下方法,但我真的很想知道是否有更简单的方法。

  1. 对于每个Cell,将Cell.FitText设置为true
  2. 检查字体比例是否已更改
  3. 将FitText设置为false
  4. 如果FitText更改了字体比例,请将行高设置为自动
  5. 任何帮助VBA或c#都将不胜感激!

    这就是我所处的位置,但由于列宽不同,我因访问单个列无法访问而遇到运行时错误。由于存在合并的单元格,因此也无法访问单个行。

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

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,感谢Jean-Pierre Oosthuizen提出的使用wdRowHeightAtLeast的建议。即使使用Range.Cells无法访问个别行(由于垂直合并的单元格),您也可以访问单个单元格。

我将当前行高调为wdRowHeightAtLeast的最小值,以确保如果文本适合单元格,则不会更改布局。

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