【问题标题】:Remove paragraph above a Word table in a document column with C#使用 C# 删除文档列中 Word 表格上方的段落
【发布时间】:2019-07-13 16:00:14
【问题描述】:

我在一个三栏 Word 文档中工作。我想在顶部的文档列 flush 中插入一个新表格。不幸的是,我不可能在没有段落的情况下插入它。我在 break 列之后插入此表(参见代码)。如果我用许多段落替换分栏符,我可以将表格放在顶部。不幸的是,这种方法不实用并且不太容易以编程方式实现。

Word.Paragraph oPara4;
var oRng = document.Bookmarks.get_Item(@"\EndOfDoc").Range;
oPara4 = document.Content.Paragraphs.Add(oRng);
Word.Range rngPara = oPara4.Range;
rngPara.InsertParagraphBefore();
rngPara.Text = "Some Text Before the break";
oPara4.Format.SpaceAfter = 24;
rngPara.InsertParagraphAfter();
rngPara.Collapse(Word.WdCollapseDirection.wdCollapseEnd);

// Column Break
rngPara.InsertBreak(Word.WdBreakType.wdColumnBreak);
rngPara.Collapse(Word.WdCollapseDirection.wdCollapseEnd);


// Create new table in new column (after column break)    
oRng = document.Bookmarks.get_Item(@"\EndOfDoc").Range;
Word.Table tableCopy = document.Tables.Add(oRng, 1,1, ref oMissing, ref oMissing);

【问题讨论】:

  • 在前面添加一个段落(= 在第一列上方)是解决表格在页面上的高度相等的问题的简单方法。
  • 好方法!问题是我有跨列的表格。所以开始比新列中的中断更远。
  • 我在 Word 和 LibreOffice 的屏幕截图中添加了一些信息,但我认为您在 Word 中发现了一个 BUG。 (如果我正确理解了您的问题!)

标签: c# ms-word office-interop word-automation word-interop


【解决方案1】:

您看到的原因是 Word 需要表格之间的段落。该段落存储有关表格在页面上的位置的重要信息(这可以在 Word Open XML 中看到)。两个直接相邻的表(它们之间没有段落)会自动合并。这不是错误,正如本讨论中其他地方所建议的那样。

因此,您需要在所有列顶部的所有 个表之前有一个段落。该段落可以使用非常小的字体大小进行格式化,并且没有“之前的空格”或“之后的空格”——我会为它创建一个特殊的样式。

按此顺序工作很重要:

  1. 插入开头的段落标记,格式为 Normal。
  2. 在其下方插入表格(表格格式从 Normal 样式创建时最可靠)
  3. 应用上一段的样式使其更小

这是我在回答上一个问题时建议在页面上使用多列表而不是使用报纸栏的原因之一...

【讨论】:

  • 非常感谢您的回复。一如既往地很有帮助! :) 如何在休息前放置下一个表格的段落?
  • 是否有可能在文档列中找到最后一段?也许我可以在没有分栏符的情况下做到这一点,但通过计算段落总和将表格移动到下一列。
  • @br0ken.pipe 抱歉,我周末没在机器旁。查找最后一段:使用Find 搜索分栏符,查找文本为:^n,然后向后移动。关于表格后面的段落的建议,在列的末尾,是无效的(不起作用) - 你已经有了。
【解决方案2】:

找到解决方案:我移动新表,直到它完全到达新列。 不是很漂亮,但它可以工作(原型):

 // Add paragraph before table
var rangeBeforeTable = document.Bookmarks.get_Item(@"\EndOfDoc").Range;
rangeBeforeTable.InsertParagraphAfter();

// Add table
var newTableRange = document.Bookmarks.get_Item(@"\EndOfDoc").Range;
document.Content.Paragraphs.Add(newTableRange);
var newTable = document.Tables.Add(newTableRange, 1, 1, ref oMissing, ref oMissing);
newTable.Range.Paste();

// Save coordinates
int leftOriginal, topOriginal, widthOriginal, heightOriginal;
int left, top, width, height;

// Get coordinates from newly created table
word.ActiveWindow.GetPoint(out leftOriginal, out topOriginal, out widthOriginal, out heightOriginal, newTableRange);

while (true)
{
    // Get coordinates from moving table
    word.ActiveWindow.GetPoint(out left, out top, out width, out height, newTableRange);

    if (top < topOriginal)
    break;

    // Add paragraph before new table and move table down
    document.Content.Paragraphs.Add(newTableRange.Previous());
}

【讨论】:

    【解决方案3】:

    在上述问题中,Word 中似乎存在 错误(已使用 2013 版测试)

    LibreOffice(版本 6.2.4.2)中的相同文档

    第 1 列和第 2 列是 1 个表格,分布在页面上的这 2 列中。在第三列中开始了一个新表。在 word 中,似乎不可能对齐所有表格的顶部位置。

    【讨论】:

    • 这不是错误 - 它是 Word 设计的。查看我的答案
    猜你喜欢
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多