コード例 #1
0
        private void DeletePartsWithNoData(ref List <Run> fieldCodes, ref RecursiveDatasHolder recDatas)
        {
            List <string> fieldCodeNames = CollectFieldCodeNames(ref fieldCodes);

            // List<Tuple<int, int>>-ben tároljuk azt, hogy milyen indexek között helyezkednek el a nem használt elemek
            List <Tuple <int, int> > locations = new List <Tuple <int, int> >();

            /*
             * Kiszedjük a Run listából azoknak az elemeknek a kezdő és záró indexét, amikhez nem tartozik elem az adatfile-ból
             * Majd miután ez meg van, ezeket kitöröljük a file-ból
             */
            for (int i = 0; i < fieldCodeNames.Count - 1; ++i)
            {
                if (!AnyRecContains(fieldCodeNames[i], ref recDatas) && fieldCodeNames[i].StartsWith("R_"))
                {
                    int startIndex = i;
                    int endIndex   = FindEndIndex(fieldCodes, fieldCodeNames[i], startIndex);
                    locations.Add(new Tuple <int, int>(startIndex, endIndex));
                }
            }

            //A végén csak végig megyünk az indexeken és a 2 közti elemeket töröljük
            foreach (var location in locations)
            {
                DeleteUnusedParts(ref fieldCodes, location.Item1, location.Item2);
            }
        }
コード例 #2
0
        private List <KeyValuePair <string, int> > RecWithMoreOccurences(RecursiveDatasHolder datas)
        {
            List <KeyValuePair <string, int> > temp = new List <KeyValuePair <string, int> >();

            foreach (var recData in datas.Datas)
            {
                foreach (var innerData in recData.Values)
                {
                    if (innerData is RecursiveData)
                    {
                        var castedData = innerData as RecursiveData;
                        if (castedData.Values.Count > 0)
                        {
                            string tagName = castedData.Values[0].Name;
                            int    sum     = 0;
                            foreach (var mostInnerData in castedData.Values)
                            {
                                if (mostInnerData.Name == tagName)
                                {
                                    sum++;
                                }
                            }
                            if (sum > 1)
                            {
                                temp.Add(new KeyValuePair <string, int>(castedData.Name, sum - 1));
                            }
                        }
                    }
                }
            }
            return(temp);
        }
コード例 #3
0
        /*
         * Megtaláljuk R_* kezdését, illetve a végét /R_*-ot.
         * Lemásoljuk annyiszor, ahány adat van a listába
         * Majd végig iterálunk a tag-eken és alkalmazzuk a SwapDataInSubList-et
         */
        public void MergeData(WordprocessingDocument doc, BaseData baseData)
        {
            RecursiveDatasHolder recDatas = baseData as RecursiveDatasHolder;
            List <Run>           runs     = GetRuns(doc);

            //Kitöröljük azokat a részeket, amikhez nem tartozik adat az adatfile-ból
            DeletePartsWithNoData(ref runs, ref recDatas);

            //Minden megmaradó Recursive részhez kigyüjtjük a kezdő és a záró indexeket
            Dictionary <string, Tuple <int, int> > recLocations = GetStartAndEndIndexes(runs);

            //A kezdő és záró indexekkel (recLocations) copyzzuk annyiszor, ahányszor előfordul az adat
            CloneAllRecursiveFields(runs, recLocations, recDatas);

            //Kigyüjtjük a FieldCode-okat és elkezdjük cserélgetni az adatokat
            List <FieldCode> fieldCodes = doc.MainDocumentPart.RootElement.Descendants <FieldCode>().ToList();
            List <FieldCode> newFc      = FilterFieldCodes(fieldCodes);
            Dictionary <string, List <string> > datasInDict = TransformRecDatasToDict(recDatas);
            WordDataSwapper swapper = new WordDataSwapper();

            foreach (var fc in newFc)
            {
                swapper.SwapFieldCode(fc, datasInDict);
            }


            runs = GetRuns(doc);
            foreach (var run in runs)
            {
                DeleteFlagTags(run);
            }
        }
コード例 #4
0
 public void MergeRecursiveFields(List <RecursiveData> values)
 {
     using (WordprocessingDocument doc = WordprocessingDocument.Open(path, true))
     {
         RecursiveDatasHolder holder = new RecursiveDatasHolder(values);
         new WordGeneratorRecursive().MergeData(doc, holder);
     }
 }
コード例 #5
0
        private Dictionary <string, List <string> > TransformRecDatasToDict(RecursiveDatasHolder datas)
        {
            Dictionary <string, List <string> > temp = new Dictionary <string, List <string> >();

            for (int i = 0; i < datas.Datas.Count; ++i)
            {
                foreach (var innerData in datas.Datas[i].Values)
                {
                    string name = innerData.Name;
                    if (name.Contains("G_"))
                    {
                        GroupData gData = innerData as GroupData;
                        foreach (var fData in gData.Values)
                        {
                            if (!temp.ContainsKey(fData.Name))
                            {
                                temp[fData.Name] = new List <string>
                                {
                                    fData.Value.Value
                                };
                            }
                            else
                            {
                                temp[fData.Name].Add(fData.Value.Value);
                            }
                        }
                    }
                    else
                    {
                        RecursiveData rData = innerData as RecursiveData;
                        foreach (var inRecData in rData.Values)
                        {
                            GroupData gData = inRecData as GroupData;
                            foreach (var fData in gData.Values)
                            {
                                if (!temp.ContainsKey(fData.Name))
                                {
                                    temp[fData.Name] = new List <string>
                                    {
                                        fData.Value.Value
                                    };
                                }
                                else
                                {
                                    temp[fData.Name].Add(fData.Value.Value);
                                }
                            }
                        }
                    }
                }
            }
            return(temp);
        }
コード例 #6
0
 private bool AnyRecContains(string fcName, ref RecursiveDatasHolder recDatas)
 {
     foreach (var rc in recDatas.Datas)
     {
         if (rc.Name == fcName)
         {
             return(true);
         }
         if (HasRecChild(rc))
         {
             foreach (var child in rc.Values)
             {
                 if (child.Name == fcName)
                 {
                     return(true);
                 }
             }
         }
     }
     return(false);
 }
コード例 #7
0
        private void CloneAllRecursiveFields(List <Run> runs, Dictionary <string, Tuple <int, int> > locations, RecursiveDatasHolder datas)
        {
            List <KeyValuePair <string, int> > recDataToCopy = RecWithMoreOccurences(datas);

            //Majd meg kéne nézni, hogy miért nem másolja le normálisan!!
            //recDataToCopy.Add(new KeyValuePair<string, int>("R_ILLETMENYEK_KERKIEG", 3));
            foreach (var data in recDataToCopy)
            {
                Tuple <int, int> temp = locations[data.Key];
                int num1 = temp.Item1 + 3;
                int num2 = temp.Item2 - 2;
                CloneSpecificRecursiveFields(runs, /*temp.Item1*/
                                             num1, num2, data.Value);
            }
        }