Docx - Удаление раздела документа

Есть ли способ удалить разделы документа, где я могу указать начальный и конечный теги?

мне нужен способ, которым я могу удалить раздел документа, передав как начальный, так и конечный захваты, (@@DELETEBEGIN и @@DELETEEND)

например, у меня есть это в моем документе:

Здравствуйте, добро пожаловать в этот документ

@@DELETEBEGIN{Некоторые значения для проверки в коде}

Некоторый текст, который будет удален, если значение истинно

@@УДАЛИТЬEND

Конечная линия


person Balaal    schedule 20.08.2015    source источник
comment
Я не думаю, что есть простая причина для этого или способ вообще.   -  person Phillip    schedule 21.08.2015
comment
возможно, я нашел решение, проверьте мой ответ ниже   -  person Balaal    schedule 21.08.2015


Ответы (2)


Если вам нужно удалить текст из @@DELETEBEGIN в @@DELETEEND, где @@DELETEBEGIN не находится в начале Paragraph, а @@DELETEEND не в конце Paragraph, этот код должен работать.

DocX document = DocX.Load("C:\\Users\\phil\\Desktop\\text.docx");
bool flag = false;
List<List<string>> list1 = new List<List<string>>();
List<string> list2 = new List<string>();
foreach (Novacode.Paragraph item in document.Paragraphs)
{
    //use this if you need whole text of a paragraph
    string paraText = item.Text;
    var result = paraText.Split(' ');
    int count = 0;
    list2 = new List<string>();
    //use this if you need word by word
    foreach (var data in result)
    {
        string word = data.ToString();
        if (word.Contains("@@DELETEBEGIN")) flag = true;
        if (word.Contains("@@DELETEEND"))
        { 
            flag = false;
            list2.Add(word);
        }
        if (flag) list2.Add(word); 
        count++;
    }
    list1.Add(list2);
}
for (int i = 0; i < list1.Count(); i++)
{
    string temp = "";
    for (int y = 0; y < list1[i].Count(); y++)
    {
        if (y == 0) 
        {
            temp = list1[i][y];
            continue;
        }
        temp += " " + list1[i][y];                   
    }
    if (!temp.Equals("")) document.ReplaceText(temp, "");
}
document.Save();

Я должен отдать должное этому post для перебора каждого слова.

person Phillip    schedule 21.08.2015
comment
Довольно поздний ответ, но я должен сказать спасибо! У меня начались проблемы с кодом, который я использовал ранее в некоторых документах клиентов. этот метод намного надежнее и лучше работает в моей ситуации. большое спасибо! - person Balaal; 02.03.2016
comment
Нет проблем, прошлым летом я довольно много работал с Novacode и имел дело с множеством разных вещей, подобных этой. - person Phillip; 08.03.2016

Я думаю, что нашел решение этой проблемы, по крайней мере, это работает для меня, пожалуйста, дайте мне знать, если есть что-то, что я могу сделать лучше:

deleteCommand будет строкой @@DELETEBEGIN, а deleteEndCommand будет @@DELETEEND

    private void RemoveSection(DocX doc, string deleteCommand, string deleteEndCommand)
    {
        try
        {
            int deleteStart = 0;
            int deleteEnd = 0;

            //Get the array of the paragraphs containing the start and end catches
            for (int i = 0; i < doc.Paragraphs.Count; i++)
            {
                if (doc.Paragraphs[i].Text.Contains(deleteCommand))
                    deleteStart = i;
                if (doc.Paragraphs[i].Text.Contains(deleteEndCommand))
                    deleteEnd = i;
            }

            if (deleteStart > 0 && deleteEnd > 0)
            {
                //delete from the paraIndex as the arrays will shift when a paragraph is deleted
                int paraIndex = deleteStart;
                for (int i = deleteStart; i <= deleteEnd; i++)
                {
                    doc.RemoveParagraphAt(paraIndex);
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }
person Balaal    schedule 21.08.2015
comment
Да, это работает, если вы хотите удалить что-то с начала Paragraph[i] до конца Paragraph[i]. Если вы хотите, чтобы что-то было удалено в середине Paragraph[i] в другое место в другом Paragraph[i], это не сработает. Если ваше решение решает вашу проблему, это хорошо. - person Phillip; 21.08.2015
comment
Да, это правда, я думаю, что это невозможно из-за структуры документа, но этот код работает для меня, так как в моем случае строки удаления всегда будут отдельными абзацами. - person Balaal; 21.08.2015