Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 179
1

Есть файл xml, его нужно перенести в Excel по установленному образцу.

14.02.2019, 15:19. Просмотров 1196. Ответов 27
Метки нет (Все метки)

Есть файл xml его нужно перенести в Excel по установленному образцу. Я так понимаю нужно сделать парсинг xml и после этого делать с данными то, что мне нужно. Заносить данные в массив конкретных элементов xml научился. То есть я могу перебрать в цикле каждый атрибут и элемент и вывести в Excel. Но подобный велосипед мне не нравится. Есть ли уже протоптанные шаги как сделать парсинг элементов xml, и потом данные из xml-файла представить как экземпляр класса. И потом занести все это в Excel. Класс я создам конечно. Как заносить данные в новый экземпляр класса? Показываю примерную конструкцию. C# изучаю 2-ой день
C#
1
2
3
4
5
6
class User
{
    public string Name { get; set; } // Объявили класс, и его элементы
    public int Age { get; set; }
    public string Company { get; set; }
}
И вот дальше доработать бы логическую нить
C#
1
2
3
4
User user[0] = new User {  Как сюда впихнуть, все элементы объекта };
User user[1] = new User { Как сюда впихнуть, все элементы объекта };
User user[2] = new User { Как сюда впихнуть, все элементы объекта };
User user[3] = new User { Как сюда впихнуть, все элементы объекта };
То есть такой некий массив объектов класса, который будет иметь свои элементы
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.02.2019, 15:19
Ответы с готовыми решениями:

Есть массив структур в автоматической памяти. Нужно перенести его в динамическую память
student* transfer (student* s) { student* s1; int i; for (i = 0; i < 15; i++) ...

Есть файл написанный в borland 3.1. Мне его нужно открыть и откомпилировать.
Есть файл написанный в borland 3.1. Мне его нужно открыть и откомпилировать. Но не получается с...

Операции с Файлами. Есть некий Файл А , нужно получить его копию в Файле В
Раздел "Операции с Файлами" Задание : Есть некий Файл "А" , нужно получить его копию в Файле...

Есть код на C++ нужно перенести на Maple как?
День добрый, уважаемые участники. На с++ реализован метод сортировки вставками, нужно также...

27
14 / 13 / 2
Регистрация: 16.10.2018
Сообщений: 47
14.02.2019, 15:31 2
Цитата Сообщение от lephin Посмотреть сообщение
То есть такой некий массив объектов класса, который будет иметь свои элементы
Коллекции использовать не? И доработать до вида , чтобы каждый раз ручками не записывать в коллекцию .
Пример простого добавления .
C#
1
2
List<User> users = new List<User>();
users.Add(new User() { Name = "Котопес", Age = 10, Company = "Кот и пес"})
0
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 179
14.02.2019, 15:35  [ТС] 3
Вот мне и нужно про добавления понять. Добавлять то все равно циклами придется? Делать парсинг каждого элемента и в цикле добавлять?
0
14 / 13 / 2
Регистрация: 16.10.2018
Сообщений: 47
14.02.2019, 15:42 4
Цитата Сообщение от lephin Посмотреть сообщение
Добавлять то все равно циклами придется? Делать парсинг каждого элемента и в цикле добавлять?
Да, циклом проходишься по каждому элементу User из xml и добавляешь каждый элемент в коллекцию .
А вообще для xml есть Xdoc со своей десериализацией . И много возможностей инициализировать по атрибутам объекты.
0
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 179
14.02.2019, 15:46  [ТС] 5
Вот это уже интересно, а где же про все это то почитать то? Вот это все мне и нужно, чтобы велосипеды не создавать. Я больше чем уверен, что давно все обкатано и сделано до меня.
0
14 / 13 / 2
Регистрация: 16.10.2018
Сообщений: 47
14.02.2019, 15:53 6
Цитата Сообщение от lephin Посмотреть сообщение
Вот это уже интересно, а где же про все это то почитать то?
В интернете .
1)Открывает поисковик
2)Пишешь "c# deserialize xml"
3)Открываешь любую ссылку и читаешь.
0
Модератор
7697 / 5415 / 1550
Регистрация: 21.04.2018
Сообщений: 15,975
Записей в блоге: 2
14.02.2019, 15:56 7
Цитата Сообщение от lephin Посмотреть сообщение
Вот это уже интересно, а где же про все это то почитать то? Вот это все мне и нужно, чтобы велосипеды не создавать. Я больше чем уверен, что давно все обкатано и сделано до меня.
Я бы посоветовал Вам рассмотреть возможность десериализации данных их XML файла - намного проще чем приписывать все эти циклы

Добавлено через 1 минуту
lephin, скиньте Ваш XML - покажу как его десериализовать.
0
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 179
14.02.2019, 16:14  [ТС] 8
Скинул вам в ЛС
0
Модератор
7697 / 5415 / 1550
Регистрация: 21.04.2018
Сообщений: 15,975
Записей в блоге: 2
14.02.2019, 17:26 9
Один из способов создания класса для сериализации.
Копируете свой XML файл в буфер обмена.
Открываете новый класс. Удаляете тело класса. Оставляете только пространство имён. Ставите курсор на пустой строке внутри пространства имён.
Заходите Meню -> Правка -> Специальная вставка -> Вставить XML как классы.
Вот полученный код класса по Вашему XML
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
    // Примечание. Для запуска созданного кода может потребоваться NET Framework версии 4.5 или более поздней версии и .NET Core или Standard версии 2.0 или более поздней.
    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
    public partial class art_list
    {
 
        private art_listArt_item[] art_itemField;
 
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("art_item")]
        public art_listArt_item[] art_item
        {
            get
            {
                return this.art_itemField;
            }
            set
            {
                this.art_itemField = value;
            }
        }
    }
 
    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class art_listArt_item
    {
 
        private art_listArt_itemAttr_item[] attr_itemField;
 
        private byte art_idField;
 
        private string designationField;
 
        private string nameField;
 
        private byte section_idField;
 
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("attr_item")]
        public art_listArt_itemAttr_item[] attr_item
        {
            get
            {
                return this.attr_itemField;
            }
            set
            {
                this.attr_itemField = value;
            }
        }
 
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public byte art_id
        {
            get
            {
                return this.art_idField;
            }
            set
            {
                this.art_idField = value;
            }
        }
 
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string designation
        {
            get
            {
                return this.designationField;
            }
            set
            {
                this.designationField = value;
            }
        }
 
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string name
        {
            get
            {
                return this.nameField;
            }
            set
            {
                this.nameField = value;
            }
        }
 
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public byte section_id
        {
            get
            {
                return this.section_idField;
            }
            set
            {
                this.section_idField = value;
            }
        }
    }
 
    /// <remarks/>
    [System.SerializableAttribute()]
    [System.ComponentModel.DesignerCategoryAttribute("code")]
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
    public partial class art_listArt_itemAttr_item
    {
 
        private string attr_nameField;
 
        private string valueField;
 
        /// <remarks/>
        [System.Xml.Serialization.XmlAttributeAttribute()]
        public string attr_name
        {
            get
            {
                return this.attr_nameField;
            }
            set
            {
                this.attr_nameField = value;
            }
        }
 
        /// <remarks/>
        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    }
Пример использования для десериализации
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            string fileName = "MyData.xml"; // Файл с Вашим XML
            art_list data;
            try
            {
                using (FileStream fs = new FileStream(fileName, FileMode.Open))
                {
                    XmlSerializer x = new XmlSerializer(typeof(art_list));
                    data = (art_list)x.Deserialize(fs);
                    fs.Close();
                }
            }
            catch (Exception)
            {
                throw new ArgumentException ("Ошибка десериализации класса art_list из файла "+fileName);
            }
Добавлено через 6 минут
Полученный класс - это "рыба". При необходимости можете в него вносить коррективы: добавлять свойства, методы, поля и т.д.
Я обычно переименовываю все свойства, чтобы начинались с заглавных букв. Добавляю методы вывода на консоль (для теста), преобразования в нужные классы, методы парсинга и т.п по мере надобности.
В Вашем же случае надо добавить методы вставки данных в указанное место листа Excel. Лучше сделать это внутри этого класса, так как внешний код, по сути, не обладает достаточной для этого информацией. Из вне передаётся в класс указание на ячейку, а класс сам начиная мс этой ячейки сохраняет свои данные.
1
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 179
14.02.2019, 17:47  [ТС] 10
Чего то не хочет вставлять. Говорит, что можно только JSON вставлять, и ничего больше не видит. Конечно это круто. Я вообще не понимаю теперь. Я потерял нить логики. Вот как мне теперь вывести куда нибудь и что нибудь для сравнения? Чтобы видеть как это происходит

Добавлено через 11 минут
Вручную все вставил и нормально. Видит в проекте. Как мне например теперь в какой нибудь TextBox вывести какую нибудь элемент? Поняв как это делается можно будет перекидывать уже и в Excel благо по нему вроде информации больше.
0
Модератор
7697 / 5415 / 1550
Регистрация: 21.04.2018
Сообщений: 15,975
Записей в блоге: 2
14.02.2019, 17:51 11
Вот "причёсанный" класс с методами преобразования в строку для вывода на консоль
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
    // Примечание. Для запуска созданного кода может потребоваться NET Framework версии 4.5 или более поздней версии и .NET Core или Standard версии 2.0 или более поздней.
    /// <remarks/>
    [Serializable()]
    [System.ComponentModel.DesignerCategory("code")]
    [XmlType(AnonymousType = true)]
    [XmlRoot(Namespace = "", IsNullable = false, ElementName = "art_list")]
    public partial class Art_list
    {
 
        /// <remarks/>
        [XmlElement("art_item")]
        public Art_listArt_item[] Art_item { get; set; }
 
        public string Print()
            => string.Join("\r\n", Art_item.Select(item => item.Print()));
    }
 
    /// <remarks/>
    [Serializable()]
    [DesignerCategory("code")]
    [XmlType(AnonymousType = true)]
    public partial class Art_listArt_item
    {
 
        /// <remarks/>
        [XmlElement("attr_item")]
        public Art_listArt_itemAttr_item[] Attr_item { get; set; }
 
        /// <remarks/>
        [XmlAttribute("art_id")]
        public byte Art_id { get; set; }
 
        /// <remarks/>
        [XmlAttribute("designation")]
        public string Designation { get; set; }
 
        /// <remarks/>
        [XmlAttribute("name")]
        public string Name { get; set; }
 
        /// <remarks/>
        [XmlAttribute("section_id")]
        public byte Section_id { get; set; }
 
        public string Print()
            => $"Art_listArt_item: Art_id={Art_id}, Designation={Designation}, Name={Name}, Section_id={Section_id}\r\n\t" +
            string.Join("\r\n\t", Attr_item.Select(item =>item.Print()));
    }
 
    /// <remarks/>
    [Serializable()]
    [DesignerCategory("code")]
    [XmlType(AnonymousType = true)]
    public partial class Art_listArt_itemAttr_item
    {
 
        /// <remarks/>
        [XmlAttribute("attr_name")]
        public string Attr_name { get; set; }
 
        /// <remarks/>
        [XmlText()]
        public string Value { get; set; }
 
        public string Print()
            => $" Art_listArt_itemAttr_item: Attr_name={Attr_name}, Value={Value}";
    }
Его использование
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
            string fileName = "MyData.xml"; // Файл с Вашим XML
            Art_list data;
            try
            {
                using (FileStream fs = new FileStream(fileName, FileMode.Open))
                {
                    XmlSerializer x = new XmlSerializer(typeof(Art_list));
                    data = (Art_list)x.Deserialize(fs);
                    fs.Close();
                }
            }
            catch (Exception)
            {
                throw new ArgumentException ("Ошибка десериализации класса art_list из файла "+fileName);
            }
 
            Console.WriteLine(data.Print());
Вывод консолиArt_listArt_item: Art_id=1, Designation=АБВГД 00.00.0001, Name=Деталь 1, Section_id=3
Art_listArt_itemAttr_item: Attr_name=Код исполнения, Value=1
Art_listArt_itemAttr_item: Attr_name=Покупной, Value=
Art_listArt_itemAttr_item: Attr_name=Масса, Value=2.056
Art_listArt_itemAttr_item: Attr_name=Дата создания, Value=01.03.2007
Art_listArt_itemAttr_item: Attr_name=Серийный номер, Value=
Art_listArt_item: Art_id=2, Designation=АБВГД 01.02.1003, Name=Деталь 10, Section_id=4
Art_listArt_itemAttr_item: Attr_name=Код исполнения, Value=3
Art_listArt_itemAttr_item: Attr_name=Покупной, Value=
Art_listArt_itemAttr_item: Attr_name=Масса, Value=12
Art_listArt_itemAttr_item: Attr_name=Дата создания, Value=01.03.2017
Art_listArt_itemAttr_item: Attr_name=Серийный номер, Value=3268ASY3343FD
Art_listArt_item: Art_id=3, Designation=SGHJE 00.01.1003, Name=Корпус, Section_id=1
Art_listArt_itemAttr_item: Attr_name=Код исполнения, Value=0
Art_listArt_itemAttr_item: Attr_name=Покупной, Value=+
Art_listArt_itemAttr_item: Attr_name=Масса, Value=100
Art_listArt_itemAttr_item: Attr_name=Дата создания, Value=13.12.2010
Art_listArt_itemAttr_item: Attr_name=Серийный номер, Value=3278AF138F329
Art_listArt_item: Art_id=4, Designation=DGFJDKD 53421, Name=Пластина, Section_id=2
Art_listArt_itemAttr_item: Attr_name=Код исполнения, Value=
Art_listArt_itemAttr_item: Attr_name=Покупной, Value=
Art_listArt_itemAttr_item: Attr_name=Масса, Value=20.13
Art_listArt_itemAttr_item: Attr_name=Дата создания, Value=31.07.2015
Art_listArt_itemAttr_item: Attr_name=Серийный номер, Value=
Art_listArt_item: Art_id=5, Designation=АБВГ 21.003, Name=Деталь 5, Section_id=4
Art_listArt_itemAttr_item: Attr_name=Код исполнения, Value=1
Art_listArt_itemAttr_item: Attr_name=Покупной, Value=+
Art_listArt_itemAttr_item: Attr_name=Масса, Value=3.500
Art_listArt_itemAttr_item: Attr_name=Дата создания, Value=07.08.2001
Art_listArt_itemAttr_item: Attr_name=Серийный номер, Value=434234AD323241


Добавлено через 1 минуту
Цитата Сообщение от lephin Посмотреть сообщение
Вручную все вставил и нормально. Видит в проекте. Как мне например теперь в какой нибудь TextBox вывести какую нибудь элемент? Поняв как это делается можно будет перекидывать уже и в Excel благо по нему вроде информации больше.
В дебагере после сериализации раскройте переменную data и посмотрите доступные свойства.
0
Модератор
7697 / 5415 / 1550
Регистрация: 21.04.2018
Сообщений: 15,975
Записей в блоге: 2
14.02.2019, 17:55 12
Цитата Сообщение от lephin Посмотреть сообщение
Чего то не хочет вставлять. Говорит, что можно только JSON вставлять, и ничего больше не видит.
Я не знаю с чем это связано. Наверное, какие-то настройки или расширения VS. Надо погуглить...
0
Миниатюры
Есть файл xml, его нужно перенести в Excel по установленному образцу.  
Модератор
7697 / 5415 / 1550
Регистрация: 21.04.2018
Сообщений: 15,975
Записей в блоге: 2
14.02.2019, 18:00 13
Вот раскрыл часть свойств полученного объекта
0
Миниатюры
Есть файл xml, его нужно перенести в Excel по установленному образцу.  
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 179
14.02.2019, 18:09  [ТС] 14
Вот такая проблема. Остальное уже вроде подключил
0
Миниатюры
Есть файл xml, его нужно перенести в Excel по установленному образцу.  
Модератор
7697 / 5415 / 1550
Регистрация: 21.04.2018
Сообщений: 15,975
Записей в блоге: 2
14.02.2019, 19:25 15
Цитата Сообщение от lephin Посмотреть сообщение
Вот такая проблема. Остальное уже вроде подключил
LINQ подключите
C#
1
using System.Linq;
1
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 179
14.02.2019, 19:32  [ТС] 16
Подключил уже. Догадался. Ошибок перед запуском нет. Отладчик молчит. Но вот во время исполнения
0
Миниатюры
Есть файл xml, его нужно перенести в Excel по установленному образцу.  
Модератор
7697 / 5415 / 1550
Регистрация: 21.04.2018
Сообщений: 15,975
Записей в блоге: 2
14.02.2019, 19:36 17
Метод GetArt_Item возвращает пустое значение. Что за метод? Проверьте в дебагере как он работает.
0
14 / 13 / 2
Регистрация: 16.10.2018
Сообщений: 47
14.02.2019, 21:32 18
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Вот "причёсанный" класс с методами преобразования в строку для вывода на консоль
Какой то слишком муторный путь для дecериализации. У пространства xml.serelization есть root и element атрибуты

C#
1
2
3
4
5
6
7
8
9
10
11
12
[XmlRoot("ConfigRoot")]
class Users
{
  [XmlElement("User")]
  public List<User> Data {get;set;}
}
 
[XmlRoot("User")]
class User
{
//тут проперти либо елементы либо атрибуты
}
Что то типо такого , и при десериализации класса users придут сразу все пользователи в коллекции .
Намного проще , хоть и модель жестко привязана к конфигу
0
Модератор
7697 / 5415 / 1550
Регистрация: 21.04.2018
Сообщений: 15,975
Записей в блоге: 2
14.02.2019, 21:56 19
Цитата Сообщение от NotGoodProgram Посмотреть сообщение
Что то типо такого , и при десериализации класса users придут сразу все пользователи в коллекции .
Намного проще , хоть и модель жестко привязана к конфигу
Там и так такая конструкция. По одному свойству на один элемент или атрибут. Большая из-за структуры XML файла: Два вложенных списка, используются и атрибуты, и элементы.
Проще ни как.

Добавлено через 1 минуту
Проще можно десериализовать в словарь, но оттуда потом надо ещё умеючи данные вытягивать. Класс получится проще и менее жёсткий, но работать с ним будет труднее.
0
14 / 13 / 2
Регистрация: 16.10.2018
Сообщений: 47
14.02.2019, 21:59 20
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Там и так такая конструкция
Да я уже заметил . Просто лишнии атрибуты глаза замылили )
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2019, 21:59

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Есть файл xml, который сохранен в ClientBin. Как добавлять запись в этот в файл
Доброго времени суток. Есть файл xml, который сохранен в ClientBin. Вопрос как добавлять запись в...

в массиве нужно перенести второй нулевой элемент в его начало(массива)
народ кто шарит в паскале помоги пожалуйста.задача следующая:в массиве нужно перенести второй...

Dictionary serialization: нужно провести сереализацию в бинарный файл и xml файл
Помогите сереализоровать словарь вида: public class BankManager : Dictionary&lt;String, Bank&gt; {}...

Перенести в новый файл те строки, где есть заданное слово
Создать текстовый файл. Перенести в новый файл те строки, где есть заданное слово.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.