Example #1
0
        public void FillValues()
        {
            logger.Info("Заполняем поля документа...");
            XmlDocument         content = GetXMLDocument("content.xml");
            XmlNamespaceManager nsMgr   = new XmlNamespaceManager(content.NameTable);

            nsMgr.AddNamespace("office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0");
            nsMgr.AddNamespace("text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0");
            nsMgr.AddNamespace("table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0");

            foreach (XmlNode node in content.SelectNodes("/office:document-content/office:body/office:text/text:user-field-decls/text:user-field-decl", nsMgr))
            {
                string fieldName = node.Attributes ["text:name"].Value;
                var    field     = DocParser.FieldsList.Find(f => fieldName.StartsWith(f.Name));
                if (field == null)
                {
                    logger.Warn("Поле {0} не найдено, поэтому пропущено.", fieldName);
                    continue;
                }
                SetFieldValue(node, field.Type, field.Value);
            }

            //Строка и поле
            var tableFields = new List <odtFieldSet>();

            foreach (XmlNode node in content.SelectNodes("//table:table-row//text:variable-set", nsMgr))
            {
                string fieldName = node.Attributes["text:name"].Value;
                //Ищем в таблицах
                var field = DocParser.TablesFields.FirstOrDefault(f => fieldName.StartsWith(f.Name));
                if (field != null)
                {
                    var fieldSet = new odtFieldSet();
                    fieldSet.Field     = field;
                    fieldSet.FieldNode = node;
                    fieldSet.RowNode   = FineParent(node, "table:table-row");
                    fieldSet.TableNode = FineParent(node, "table:table");
                    tableFields.Add(fieldSet);
                }
            }

            if (tableFields.Count > 0)
            {
                //Удаляем уже заполненые строки.
                var toDelete = new List <odtFieldSet>();
                foreach (var table in tableFields.GroupBy(x => x.TableNode))
                {
                    XmlNode firstRow = null;
                    foreach (var byTable in table)
                    {
                        if (firstRow == null)
                        {
                            firstRow = byTable.RowNode;
                        }
                        else if (firstRow != byTable.RowNode)
                        {
                            toDelete.Add(byTable);
                        }
                    }
                }
                foreach (var delete in toDelete)
                {
                    tableFields.Remove(delete);
                }

                foreach (var row in toDelete.GroupBy(x => x.RowNode))
                {
                    row.First().TableNode.RemoveChild(row.Key);
                }
                //Заполняем поля добавляя строки
                foreach (var table in tableFields.GroupBy(x => x.TableNode))
                {
                    XmlNode curentRow = table.First().RowNode;
                    var     rowCounts = table.First().Field.DataTable.DataRowsCount;

                    for (int i = 0; i < rowCounts; i++)
                    {
                        foreach (XmlNode fieldNode in curentRow.SelectNodes(".//text:variable-set", nsMgr))
                        {
                            string fieldName = fieldNode.Attributes["text:name"].Value;
                            var    info      = table.FirstOrDefault(x => fieldName.StartsWith(x.Field.Name));
                            if (info != null)
                            {
                                SetFieldVariableValue(fieldNode, info.Field.Type, info.Field.GetValue(i));
                            }
                        }
                        if (i + 1 < rowCounts)
                        {                        //Создаем новую строку
                            var newRow    = curentRow.CloneNode(true);
                            var tableNode = table.First().TableNode;
                            tableNode.InsertAfter(newRow, curentRow);
                            curentRow = newRow;
                        }
                    }
                }
            }

            UpdateXmlDocument(content, contentFileName);
        }
Example #2
0
        public void FillValues()
        {
            logger.Info ("Заполняем поля документа...");
            XmlDocument content = GetXMLDocument("content.xml");
            XmlNamespaceManager nsMgr = new XmlNamespaceManager(content.NameTable);
            nsMgr.AddNamespace("office", "urn:oasis:names:tc:opendocument:xmlns:office:1.0");
            nsMgr.AddNamespace("text", "urn:oasis:names:tc:opendocument:xmlns:text:1.0");
            nsMgr.AddNamespace("table", "urn:oasis:names:tc:opendocument:xmlns:table:1.0");

            foreach (XmlNode node in content.SelectNodes ("/office:document-content/office:body/office:text/text:user-field-decls/text:user-field-decl", nsMgr)) {
                string fieldName = node.Attributes ["text:name"].Value;
                var field = DocParser.FieldsList.Find (f => fieldName.StartsWith (f.Name));
                if (field == null) {
                    logger.Warn ("Поле {0} не найдено, поэтому пропущено.", fieldName);
                    continue;
                }
                SetFieldValue(node, field.Type, field.Value);
            }

            //Строка и поле
            var tableFields = new List<odtFieldSet>();

            foreach (XmlNode node in content.SelectNodes ("//table:table-row//text:variable-set", nsMgr))
            {
                string fieldName = node.Attributes["text:name"].Value;
                //Ищем в таблицах
                var field = DocParser.TablesFields.FirstOrDefault(f => fieldName.StartsWith(f.Name));
                if (field != null)
                {
                    var fieldSet = new odtFieldSet();
                    fieldSet.Field = field;
                    fieldSet.FieldNode = node;
                    fieldSet.RowNode = FineParent(node, "table:table-row");
                    fieldSet.TableNode = FineParent(node, "table:table");
                    tableFields.Add(fieldSet);
                }
            }

            if(tableFields.Count > 0)
            {
                //Удаляем уже заполненые строки.
                var toDelete = new List<odtFieldSet>();
                foreach(var table in tableFields.GroupBy(x => x.TableNode))
                {
                    XmlNode firstRow = null;
                    foreach(var byTable in table)
                    {
                        if (firstRow == null)
                            firstRow = byTable.RowNode;
                        else if(firstRow != byTable.RowNode)
                        {
                            toDelete.Add(byTable);
                        }
                    }
                }
                foreach(var delete in toDelete)
                {
                    tableFields.Remove(delete);
                }

                foreach(var row in toDelete.GroupBy(x => x.RowNode))
                {
                    row.First().TableNode.RemoveChild(row.Key);
                }
                //Заполняем поля добавляя строки
                foreach(var table in tableFields.GroupBy(x => x.TableNode))
                {
                    XmlNode curentRow = table.First().RowNode;
                    var rowCounts = table.First().Field.DataTable.DataRowsCount;

                    for(int i = 0; i < rowCounts; i++)
                    {
                        foreach(XmlNode fieldNode in curentRow.SelectNodes(".//text:variable-set", nsMgr))
                        {
                            string fieldName = fieldNode.Attributes["text:name"].Value;
                            var info = table.FirstOrDefault(x => fieldName.StartsWith(x.Field.Name));
                            if(info != null)
                            {
                                SetFieldVariableValue(fieldNode, info.Field.Type, info.Field.GetValue(i));
                            }
                        }
                        if(i + 1 < rowCounts)
                        {//Создаем новую строку
                            var newRow = curentRow.CloneNode(true);
                            var tableNode = table.First().TableNode;
                            tableNode.InsertAfter(newRow, curentRow);
                            curentRow = newRow;
                        }
                    }
                }

            }

            UpdateXmlDocument (content, contentFileName);
        }