Xceed.Words.NET DocX - добавление документа в Maindocument и сброс нумерованных списков на 1 - PullRequest
0 голосов
/ 01 ноября 2019

Добрый день,

Я пытаюсь, чтобы при соединении двух документов нумерованные списки сбрасывались. Как в примере ниже.

Я использую библиотеку Xceed.Words.NET DocX.

В этом примере шаблон имеет вид:

  1. Test Header
    Список:
    1) <-Это должно быть одно </li>

И результат:

  1. Тестовый заголовок
    Список:
    1) <-Это должен быть один </li>
  2. заголовок теста
    Список:
    2) <-Это должен быть один </p>

  3. заголовок теста
    Список:
    3) <-Это должно быть одно </p>


С помощью следующего кода я могу создать списки с аналогичным форматированием, но форматирование не соответствует 100%,У кого-нибудь есть идеи, какой способ попробовать иначе?


Запишите количество существующих абзацев и вызовите функцию для сброса списка после вставки документа.

        /// <summary>
        /// Insert complete WordFile
        /// </summary>
        /// <param name="wordFile"></param>
        public void InsertWordTemplate(IWordFile wordFile, bool InsertPageBreak)
        {
            if (wordFile != null && wordFile.IsFileOk)
            {
                int pargraphCount = Document.Paragraphs.Count - 1;

               // NotNeeded for this Problem wordFile.RemoveStyles();

              // NotNeeded for this Problem   RemoveHeaderAndFooter(wordFile);

                Document.InsertDocument(wordFile.Document);

              // NotNeeded for this Problem   ReplaceSectionBreak(InsertPageBreak, pargraphCount);

                ResetNumberedList(pargraphCount);

                logger.Info("Word file inserted: " + wordFile.File.FullName);

            }
            else
            {
                logger.Warn("Word file is not okay - will not be inserted: " + wordFile?.File?.FullName);
            }
        }

В документе Word в списке используются три разных имениТолько с 4-го уровня работает с уровнем. Для других шаблонов Word они называются по-разному.

  private void ResetNumberedList(int pargraphCount)
        {
            string styleName1 = "ListNumbers";
            string styleName2 = "PIgeordneteListe2Ebene";
            string styleName3 = "PIgeordneteListe3Ebene";

            NumberedListReset numberedListReset = new NumberedListReset(Document, styleName1, styleName2, styleName3);

            bool OnlyFirstFoundList = true;
            numberedListReset.Reset(pargraphCount, OnlyFirstFoundList);
        }

Ниже приведен вспомогательный класс, с помощью которого я пытаюсь сбросить нумерацию. Я делаю это самостоятельно. Я замечаю форматирование отдельных элементов списка, создаю новые списки, заполняю их старыми значениями, снова корректно устанавливаю стили и затем вставляю все на старое место.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using Xceed.Document.NET;
using Xceed.Words.NET;

namespace PIB.Report.DataWriter.WordExport
{
    public class NumberedListReset
    {

        private readonly DocX _Document;
        private readonly string _StyleName1;
        private readonly string _StyleName2;
        private readonly string _StyleName3;
        public NumberedListReset(DocX Document, string StyleName1, string StyleName2, string StyleName3)
        {
            _Document = Document;
            _StyleName1 = StyleName1;
            _StyleName2 = StyleName2;
            _StyleName3 = StyleName3;
        }

        public void Reset(int StartParagraphNumber, bool OnlyFirstFinding)
        {
            for (int i = StartParagraphNumber; i < _Document.Paragraphs.Count; i++)
            {
                var paragraph = _Document.Paragraphs[i];
                if (paragraph.IsListItem == true && paragraph.ListItemType == ListItemType.Numbered && paragraph.StyleName == _StyleName1)
                {
                    //int? numId = GetNumId(paragraph);
                    //if (numId != -1)
                    //{

                    //}
                    ResetFoundList(ref i);

                    if (OnlyFirstFinding == true)
                    {
                        break;
                    }
                }
            }
        }

        private void ResetFoundList(ref int ParagraphCounter)
        {
            List<ParagraphMemorize> ParagraphMemorizes = CreateMemorizeListItems(ParagraphCounter);

            if (ParagraphMemorizes.Count != 0)
            {
                RemoveOldParagraphsFromDocument(ParagraphMemorizes);

                List numberedList = CreateNewDocumentList();

                FillDocumentList(ParagraphMemorizes, numberedList);

                List<Paragraph> actualListData = numberedList.Items;

                ResetSyleNames(ParagraphMemorizes, actualListData);

                InsertNewParagraphsToDocument(ParagraphCounter, actualListData);

                ParagraphCounter += ParagraphMemorizes.Count;


            }
        }
        private List<ParagraphMemorize> CreateMemorizeListItems(int ParagraphCounter)
        {
            List<ParagraphMemorize> ParagraphMemorizes = new List<ParagraphMemorize>();


            for (int ii = ParagraphCounter; ii < _Document.Paragraphs.Count; ii++)
            {
                var paragraph = _Document.Paragraphs[ii];

                if (!NameIsKnown(paragraph.StyleName))
                {
                    break;
                }

                ParagraphMemorize paragraphMemorize = new ParagraphMemorize(paragraph);

                paragraphMemorize.ListLevel = GetListLevel(paragraph);

                ParagraphMemorizes.Add(paragraphMemorize);

            }

            return ParagraphMemorizes;
        }

        private void RemoveOldParagraphsFromDocument(List<ParagraphMemorize> ParagraphMemorizes)
        {
            ParagraphMemorizes.ForEach(m => _Document.RemoveParagraph(m.Paragraph));
        }

        private List CreateNewDocumentList()
        {
            return _Document.AddList(startNumber: 1);
        }

        private void FillDocumentList(List<ParagraphMemorize> ParagraphMemorizes, List numberedList)
        {
            for (var ii = 0; ii < ParagraphMemorizes.Count; ii++)
            {
                //numberedList.AddItem(ParagraphMemorizes[ii].Paragraph); //Raised an Error

                ParagraphMemorize paragraphMemorize = ParagraphMemorizes[ii];

                int listLevel = GetListLevel(paragraphMemorize);
                _Document.AddListItem(numberedList, paragraphMemorize.Text, listLevel);

            }
        }

        private static void ResetSyleNames(List<ParagraphMemorize> ParagraphMemorizes, List<Paragraph> actualListData)
        {
            for (int ii = 0; ii < actualListData.Count; ii++)
            {
                actualListData[ii].StyleName = ParagraphMemorizes[ii].StyleName;
            }
        }

        private void InsertNewParagraphsToDocument(int i, List<Paragraph> actualListData)
        {
            Paragraph paragraph = _Document.Paragraphs[i];
            for (int ii = 0; ii < actualListData.Count; ii++)
            {
                paragraph.InsertParagraphBeforeSelf(actualListData[ii]);
            }
        }


        private bool NameIsKnown(string Name)
        {
            return Name == _StyleName1 | Name == _StyleName2 | Name == _StyleName3;
        }

        private int GetListLevel(ParagraphMemorize paragraphMemorize)
        {
            if (paragraphMemorize.StyleName == _StyleName1)
            {
                return 0;
            }
            else if (paragraphMemorize.StyleName == _StyleName2)
            {
                return 1;
            }
            else if (paragraphMemorize.StyleName == _StyleName3)
            {
                return  (int)paragraphMemorize.ListLevel;
            }
            else
            {
                return 0;
            }

        }

        private int? GetNumId(Paragraph paragraph)
        {

            var numIds = paragraph.ParagraphNumberProperties.Descendants().Where(e => e.Name.LocalName.Equals("numId"));

            foreach (var numId in numIds)
            {
                XNamespace nsW = Namespace.WordNamespace;

                var values = numId.Attributes(XName.Get("val", nsW.ToString()));
                foreach (var value in values)
                {
                    int resultId = 0;
                    int.TryParse(value.Value, out resultId);
                    return resultId;
                }

            }
            return null;
        }


        private int? GetListLevel(Paragraph paragraph)
        {

            var numIds = paragraph.ParagraphNumberProperties.Descendants().Where(e => e.Name.LocalName.Equals("ilvl"));

            foreach (var numId in numIds)
            {
                XNamespace nsW = Namespace.WordNamespace;

                var values = numId.Attributes(XName.Get("val", nsW.ToString()));
                foreach (var value in values)
                {
                    int resultId = 0;
                    int.TryParse(value.Value, out resultId);
                    return resultId;
                }

            }
            return null;
        }

        private class ParagraphMemorize
        {
            public Paragraph Paragraph { get; set; }
            public string Text { get; set; }
            public string StyleName { get; set; }
            public int? ListLevel { get; set; }

            public ParagraphMemorize(Paragraph Paragraph)
            {
                this.Paragraph = Paragraph;
                this.Text = Paragraph.Text;
                this.StyleName = Paragraph.StyleName;
            }

        }
    }
}
...