文字互操作插入段落后和下一行样式
本文关键字:一行 样式 插入 互操作 段落 文字 | 更新日期: 2023-09-27 18:12:00
我正在迭代现有MS Word文档的段落,并在特定级别的标题之后插入文本段落,但是当我插入文本时,它们继承了下面段落的一些样式,并且/或下一个元素变得混乱。下面是我的代码:
foreach (Word.Paragraph paragraph in doc.Paragraphs)
{
if (paragraph.get_Style(); != null && paragraph.get_Style() =="Heading 2")
{
paragraph.Range.InsertParagraphAfter();
paragraph.Next().Reset();
paragraph.Next().Range.Text = "New Text"
paragraph.Next().set_Style("My Style");
}
}
这很好,除非我有以下
标题2
- 列表项列表项列表项
我的最终结果看起来像:
标题2新文本
- 列表项
- 列表项列表项
注意额外的空白项目符号。
这个方法在Word 2013中很有效
using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
Application app = new Application();
var doc = app.Documents.Open(@"C:'users'mhainc'desktop'test.docx");
foreach (Microsoft.Office.Interop.Word.Paragraph paragraph in doc.Paragraphs)
{
if (paragraph.get_Style() != null && paragraph.get_Style().NameLocal == "Heading 2")
{
paragraph.Range.InsertParagraphAfter();
paragraph.Next().Range.Text = "New Text'r'n";
paragraph.Next().Reset();
paragraph.Next().set_Style("Normal");
}
}
doc.Save();
doc.Close();
}
}
}
请注意,我已经改变了添加文本和重置调用的顺序,并在文本末尾添加了'r'n字符(换行)(没有换行,它也破坏了我的列表,但它从第一个列表项中删除了项目符号,我无法用你的代码复制你的行为:))
如果表格在文档中遵循Heading 2样式的标题,上述代码将无法正常工作。
为此,我已经构造了代码,将正确地创建您的表上面的段落。
using Microsoft.Office.Interop.Word;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
Application app = new Application();
var doc = app.Documents.Open(@"C:'users'mhainc'desktop'test.docx");
foreach (Microsoft.Office.Interop.Word.Paragraph paragraph in doc.Paragraphs)
{
if (paragraph.get_Style() != null && paragraph.get_Style().NameLocal == "Heading 2")
{
bool afterTableSplit = false;
if (paragraph.Next().Range.Tables.Count > 0)
{
//add dummy row to the table
object firstRow = paragraph.Next().Range.Tables[1].Rows[1];
firstRow = paragraph.Next().Range.Tables[1].Rows.Add(ref firstRow);
//split the table after the dummy row
paragraph.Next().Range.Tables[1].Split(2);
//delete the dummy row table
paragraph.Next().Range.Tables[1].Delete();
afterTableSplit = true;
}
paragraph.Range.InsertParagraphAfter();
paragraph.Next().Range.Text = "New Text";
if (!afterTableSplit) paragraph.Next().Range.Text += "'r'n";
paragraph.Next().Reset();
paragraph.Next().set_Style("Normal");
}
}
doc.Save();
doc.Close();
}
}
}