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

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

14.02.2019, 15:19. Показов 2529. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.02.2019, 15:19
Ответы с готовыми решениями:

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

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

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

27
 Аватар для lephin
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 188
15.02.2019, 09:58  [ТС]
Студворк — интернет-сервис помощи студентам
Не хочет он у меня в B VS Специальной вставкой вставлять XML, говорит, что вот только JSON можно. И гугл особенно не помогает. Если бы было можно указать как то путь вручную к файлу, потом его десриализировать как указано выше в первом коде. И потом конечно это нужно будет отдать Excel. Такая непростая тема и никакой нормальной последовательной информации по ней нет в сети.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.02.2019, 14:22
Цитата Сообщение от lephin Посмотреть сообщение
Не хочет он у меня в B VS Специальной вставкой вставлять XML, говорит, что вот только JSON можно.
Не знаю как с этим помочь...
У Вас версия VS какая? 2017?
Попробуйте обраться в раздел https://www.cyberforum.ru/visual-studio. Может там что подскажут.
Цитата Сообщение от lephin Посмотреть сообщение
Если бы было можно указать как то путь вручную к файлу
Я же дал Вам полный код класса для десериализации и пример десериализации из файла.
Что не выходит? Какие ошибки?
0
 Аватар для lephin
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 188
15.02.2019, 14:37  [ТС]
Я тему эту на С# плохо знаю. Я не понимаю ее до конца. Вот есть у нас XML, вот сделали мы парсинг путем десериализации, Как теперь все это запихнуть в Excel. К тому же как я понимаю. Именно надо файл подключить через спец. вставку. Тогда он все сам разобьет как нужно. Но он не подключается. Смысл всего происходящего я понял и безгранично благодарен Вам. Пойду писать в тему по VS
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
15.02.2019, 14:57
Цитата Сообщение от lephin Посмотреть сообщение
Именно надо файл подключить через спец. вставку.
НЕТ!
Через спец ставку - это простой способ создания класса для десериализации. Я его Вам уже создал. Если у Вас структура 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
            // Файл с Вашим XML, если надо можно указать полный путь
            // или использовать диалог OpenFileDialog
            string fileName = "MyData.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());
0
 Аватар для lephin
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 188
15.02.2019, 15:36  [ТС]
Я понял Вас, чуть позже попробую и напишу Вам, что и как
0
 Аватар для lephin
-24 / 1 / 0
Регистрация: 06.09.2017
Сообщений: 188
16.02.2019, 09:01  [ТС]
Все получилось. Все отлично работает. В консоль выводит. Буду изучать Ваш код, потому что я признаюсь плохо понимаю C#. Смысл того, что Вы сделали понимаю. Теперь как это все вставить в Excel? Я скажу Вам. Я задачу эту решил из XML в Excel перенести по установленному образцу, но как посчитал, по своему. То есть я в цикле просто прочитал каждый атрибут и вложенный список и занес каждый в свой массив, для последующего вывода в Excel, но мне кажется это не совсем верный подход, хоть и безусловно рабочий.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
16.02.2019, 12:06
Цитата Сообщение от lephin Посмотреть сообщение
То есть я в цикле просто прочитал каждый атрибут и вложенный список и занес каждый в свой массив, для последующего вывода в Excel, но мне кажется это не совсем верный подход, хоть и безусловно рабочий.
Посмотрите пример реализации сохранения/получения данных из Excel здесь Экспорт DataGridComboBoxColumn в Excel
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,175
Записей в блоге: 2
17.02.2019, 11:57
Ваш
XML
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
<art_list>
    <art_item art_id="1" designation="АБВГД 00.00.0001" name="Деталь 1" section_id="3">
        <attr_item attr_name="Код исполнения">1</attr_item>
        <attr_item attr_name="Покупной"></attr_item>
        <attr_item attr_name="Масса">2.056</attr_item>
        <attr_item attr_name="Дата создания">01.03.2007</attr_item>
        <attr_item attr_name="Серийный номер"></attr_item>
      </art_item>
      <art_item art_id="2" designation="АБВГД 01.02.1003" name="Деталь 10" section_id="4">
        <attr_item attr_name="Код исполнения">3</attr_item>
        <attr_item attr_name="Покупной"></attr_item>
        <attr_item attr_name="Масса">12</attr_item>
        <attr_item attr_name="Дата создания">01.03.2017</attr_item>
        <attr_item attr_name="Серийный номер">3268ASY3343FD</attr_item>
      </art_item>
      <art_item art_id="3" designation="SGHJE 00.01.1003" name="Корпус" section_id="1">
        <attr_item attr_name="Код исполнения">0</attr_item>
        <attr_item attr_name="Покупной">+</attr_item>
        <attr_item attr_name="Масса">100</attr_item>
        <attr_item attr_name="Дата создания">13.12.2010</attr_item>
        <attr_item attr_name="Серийный номер">3278AF138F329</attr_item>
      </art_item>
      <art_item art_id="4" designation="DGFJDKD 53421" name="Пластина" section_id="2">
        <attr_item attr_name="Код исполнения"></attr_item>
        <attr_item attr_name="Покупной"></attr_item>
        <attr_item attr_name="Масса">20.13</attr_item>
        <attr_item attr_name="Дата создания">31.07.2015</attr_item>
        <attr_item attr_name="Серийный номер"></attr_item>
      </art_item>
      <art_item art_id="5" designation="АБВГ 21.003" name="Деталь 5" section_id="4">
        <attr_item attr_name="Код исполнения">1</attr_item>
        <attr_item attr_name="Покупной">+</attr_item>
        <attr_item attr_name="Масса">3.500</attr_item>
        <attr_item attr_name="Дата создания">07.08.2001</attr_item>
        <attr_item attr_name="Серийный номер">434234AD323241</attr_item>
      </art_item>
</art_list>
Коды классов для десериализации из XML и сохранения в новой Excel книге
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
    /// <summary>Клас для списка</summary>
    [Serializable()]
    [DesignerCategory("code")]
    [XmlType(AnonymousType = true)]
    [XmlRoot(Namespace = "", IsNullable = false, ElementName = "art_list")]
    public partial class Art_list
    {
 
        /// <summary>Список элементов</summary>
        [XmlElement("art_item")]
        public Art_listArt_item[] Art_item { get; set; }
 
        /// <summary>Метод создающий новую книгу и сохраняющий в ней данные списка</summary>
        public void SaveNewBook()
        {
            Application excelApp = new Application();
            excelApp.Visible = true;
            Workbook workbook = excelApp.Workbooks.Add(System.Reflection.Missing.Value);
            Worksheet woorksheet = workbook.Sheets[1];
 
            int currRow = 1;
 
            woorksheet.Cells[currRow, 1].Value2 = "ID";
            woorksheet.Cells[currRow, 2].Value2 = "Обозначение";
            woorksheet.Cells[currRow, 3].Value2 = "Наименование";
            woorksheet.Cells[currRow, 4].Value2 = "Раздел";
            woorksheet.Cells[currRow, 5].Value2 = "Код исполнения";
            woorksheet.Cells[currRow, 6].Value2 = "Покупной";
            woorksheet.Cells[currRow, 7].Value2 = "Масса";
            woorksheet.Cells[currRow, 8].Value2 = "Дата создания";
            woorksheet.Cells[currRow, 9].Value2 = "Серийный номер";
 
            currRow++;
 
            foreach (Art_listArt_item item in Art_item)
                item.ToXLS(woorksheet.Cells[currRow++, 1]);
 
            woorksheet.Cells[currRow, 6].Value2 = "ИТОГО:";
            woorksheet.Cells[currRow, 7].FormulaR1C1 = "=SUM(R1C:R[-1]C)";
 
        }
 
        public string Print()
            => string.Join("\r\n", Art_item.Select(item => item.Print()));
    }
 
    /// <summary>Класс для элементов списка</summary>
    [Serializable()]
    [DesignerCategory("code")]
    [XmlType(AnonymousType = true)]
    public partial class Art_listArt_item
    {
        #region Секция сереализуемых свойств
        [XmlElement("attr_item")]
        public Art_listArt_itemAttr_item[] Attr_item { get; set; }
        [XmlAttribute("art_id")]
        public byte Art_id { get; set; }
        [XmlAttribute("designation")]
        public string Designation { get; set; }
        [XmlAttribute("name")]
        public string Name { get; set; }
        [XmlAttribute("section_id")]
        public byte Section_id { get; set; }
        #endregion
 
        #region Секция свойств сериализуемых в список Attr_item
        public object GetValue(string NameValue)
        {
            Type typeValue = Types[NameValue];
            object ret;
            try
            {
                 if (typeValue == typeof(DateTime))
                    ret = Convert.ChangeType
                    (
                        Attr_item.FirstOrDefault(val => val.Attr_name == NameValue).Value,
                        typeValue,
                        new CultureInfo("Ru-ru")
                    );
                else
                    ret = Convert.ChangeType
                    (
                        Attr_item.FirstOrDefault(val => val.Attr_name == NameValue).Value,
                        typeValue,
                        CultureInfo.InvariantCulture
                    );
            }
            catch (Exception)
            {
                ret = null;
            }
            return ret;
        }
 
        public static Dictionary<string, Type> Types = new Dictionary<string, Type>()
        {
            {"Код исполнения",typeof(int) },
            {"Покупной",typeof(string) },
            {"Масса",typeof(decimal) },
            {"Дата создания",typeof(DateTime) },
            {"Серийный номер",typeof(string) },
        };
        /// <summary>Код исполнения</summary>
        public int? ExecutionCode => (int?)GetValue("Код исполнения");
        /// <summary>Покупной</summary>
        public bool? Purchased
        {
            get
            {
                string val = (string)GetValue("Покупной");
                return string.IsNullOrWhiteSpace(val)? null: val.StartsWith("+") ? true : val.StartsWith("-") ? (bool?)false : null;
            }
        }
        /// <summary>Масса</summary>
        public decimal? Weight => (decimal?)GetValue("Масса");
        /// <summary>Дата создани</summary>
        public DateTime? DateOfCreation => (DateTime?)GetValue("Дата создания");
        /// <summary>Серийный номер</summary>
        public string SerialNumber => (string)GetValue("Серийный номер");
        #endregion
 
        /// <summary>Метод сохранения данных класса на лист Excel в одну строку с указанной ячейки</summary>
        /// <param name="cell">Указанная ячейка</param>
        public void ToXLS(Range cell)
        {
 
            Range _cell = cell[1, 1];
            Worksheet _sheet = _cell.Worksheet;
            int row = _cell.Row;
            int col = _cell.Column;
 
            _sheet.Cells[row, col].Value2 = Art_id;
            _sheet.Cells[row, col + 1].Value2 = Designation;
            _sheet.Cells[row, col + 2].Value2 = Name;
            _sheet.Cells[row, col + 3].Value2 = Section_id;
            if (ExecutionCode != null)
                _sheet.Cells[row, col + 4].Value2 = ExecutionCode;
            if (Purchased != null)
                _sheet.Cells[row, col + 5].Value2 = Purchased.Value ? "+" : "-";
            if (Weight != null)
                _sheet.Cells[row, col + 6].Value2 = Weight;
            if (DateOfCreation != null)
                _sheet.Cells[row, col + 7].Value2 = DateOfCreation?.ToString();
            if (SerialNumber != null)
                _sheet.Cells[row, col + 8].Value2 = SerialNumber;
 
            return;
        }
 
 
        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()));
    }
 
    /// <summary>Вспомогательный класс для XML сериализации</summary>
    [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
18
19
            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());
 
            data.SaveNewBook();
Полученная книга - приложена
Вложения
Тип файла: xlsx Книга1.xlsx (8.9 Кб, 1 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.02.2019, 11:57

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru