0 / 0 / 1
Регистрация: 18.11.2016
Сообщений: 13

Большая работа с Excel (передача в него данных, построение графиков, дозапись, создание нового файла Excel)

24.11.2016, 13:20. Показов 4389. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем участниками большой привет. Снова нужна помощь.
Что имеем:
-Имеем форму во вложении. на ней есть 30 нужных нам текстбоксов, начиная с "брутто 1х весов" и далее.
-Имеем время обновления, т.е. то время когда отработал запрос к датчику по таймеру.
-Имеем файл Excel (пример во вложении).
Что нужно:
-Каждый новый день создавать новый файл Excel и называть его текущей датой, т.е. сегодня (24.11.2016)-так и назвать файл, завтра новый файл с именем 25.11.2016.
-В этот файл будут записываться показания с определенным интервалом (~30 минут) показания с текстбоксов (пример заполнения excel файла во вложении) т.е. каждые 30 мин новые данные должны записываться в файл ниже и ниже и ниже и т.д.. При изменении даты записываются в новый файл с текущей датой.
-На основании записанных данных в Excel'е построить график по столбцу "Вес на датчике (кг)" исключая сумму ячеек.
Всё должно работать в автомате...
На данный момент имею только запись в файл, и то он перезаписывается, не пойму что не так... Не особо работал со связью данных с Excel.
Help me pls!

То что есть:
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
application = new Application { DisplayAlerts = false };
            const string template = "template.xlsx";
            workBook = application.Workbooks.Open(Path.Combine(Environment.CurrentDirectory, template));
            worksheet = workBook.ActiveSheet as Worksheet;
 
 
            //------------------------------------------------------------------------------------------------------------------------
            worksheet.Range["A2:C2"].Merge(false);
            (worksheet.Cells as Excel.Range).HorizontalAlignment = Excell.XlHAlign.xlHAlignCenter;
            (worksheet.Cells as Excel.Range).VerticalAlignment = Excell.XlVAlign.xlVAlignCenter;
            //------------------------------------------------------------------------------------------------------------------------
            worksheet.Range["A2"].Value = toolStripStatusLabel1.Text;
            worksheet.Range["A3"].Value = "Номер датчика";
            int n = 3;
            for (int i = 1; i < 13; i++)
            {
                worksheet.Range["A" + (n + i)].Value = Convert.ToString(i);
                if (i == 12)
                {
                    worksheet.Range["A16"].Value = "Сумма ячеек:";
                    worksheet.Range["A18"].Value = "Брутто 1-х весов:";
                    worksheet.Range["A19"].Value = "Брутто 2-х весов:";
                    worksheet.Range["A20"].Value = "Сумма брутто:";
                    worksheet.Range["A21"].Value = "Коэффициент:";
                }
            }
            //------------------------------------------------------------------------------------------------------------------------
            worksheet.Range["B3"].Value = "Значения ячеек";
            int zn_ya = 4;
            System.Windows.Forms.TextBox[] tbs = { textBox8, textBox9, textBox10, textBox11, textBox12, textBox13, textBox14, textBox15, textBox16, textBox17, textBox18, textBox19 };
            for (int i = 0; i < 12; i++)
            {
                worksheet.Range["B" + (zn_ya + i)].Value = tbs[i].Text;
                if (i == 11)
                {
                    worksheet.Range["B16"].Value = textBox20.Text;
                    worksheet.Range["B18"].Value = textBox4.Text;
                    worksheet.Range["B19"].Value = textBox5.Text;
                    worksheet.Range["B20"].Value = textBox6.Text;
                    worksheet.Range["B21"].Value = textBox7.Text;
                }
            }
            //------------------------------------------------------------------------------------------------------------------------
            worksheet.Range["C3"].Value = "Вес на датчике (кг)";
            int ves = 4;
            System.Windows.Forms.TextBox[] tbs2 = { textBox21, textBox22, textBox23, textBox24, textBox25, textBox26, textBox27, textBox28, textBox29, textBox30, textBox31, textBox32 };
            for (int i = 0; i < 12; i++)
            {
                worksheet.Range["C" + (ves + i)].Value = tbs2[i].Text;
                if (i == 11) worksheet.Range["C16"].Value = textBox33.Text;
            }
            //------------------------------------------------------------------------------------------------------------------------
            worksheet.Range["A2:C2"].EntireColumn.AutoFit();
            string savedFileName = "template.xlsx";
            workBook.SaveAs(Path.Combine(Environment.CurrentDirectory, savedFileName));
            CloseExcel();
        }
 
        private void CloseExcel()
        {
            if (application != null)
            {
                int excelProcessId = -1;
                GetWindowThreadProcessId(application.Hwnd, ref excelProcessId);
                Marshal.ReleaseComObject(worksheet);
                workBook.Close();
                Marshal.ReleaseComObject(workBook);
                application.Quit();
                Marshal.ReleaseComObject(application);
                application = null;
                try
                {
                    Process process = Process.GetProcessById(excelProcessId);
                    process.Kill();
                }
                finally { }
            }
        }
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(int hWnd, ref int lpdwProcessId);
Миниатюры
Большая работа с Excel (передача в него данных, построение графиков, дозапись, создание нового файла Excel)   Большая работа с Excel (передача в него данных, построение графиков, дозапись, создание нового файла Excel)   Большая работа с Excel (передача в него данных, построение графиков, дозапись, создание нового файла Excel)  

0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.11.2016, 13:20
Ответы с готовыми решениями:

Создание бланка заявки в Excel на основании данных из другого файла Excel
Всем доброго времени суток! Есть у меня такая задумка в Excel, может быть кто-нибудь сталкивался с подобной необходимостью и добился...

Создание файла и построение графика в Excel
Необходимо с помощью Visual C++ по двум массивам построить в Excel график. Каким образом это можно сделать? Заранее спасибо.

Построение графиков в Excel
Подскажите пожалуйста, такая задача. Необходимо построить график в Excel. Даны значения, например, 51 57 56 48 39 46 48 57 47 49....

5
 Аватар для ViterAlex
8953 / 4865 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
24.11.2016, 14:02
При каждом обновлении данных они должны в файле перезаписываться или добавляться? Что при этом должно быть на графике?
Файл перезаписывается, потому что ты никак не работаешь с его именем
0
0 / 0 / 1
Регистрация: 18.11.2016
Сообщений: 13
24.11.2016, 18:08  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
При каждом обновлении данных они должны в файле перезаписываться или добавляться? Что при этом должно быть на графике?
Файл перезаписывается, потому что ты никак не работаешь с его именем
При каждом обновлении данные должны добавляться до смены текущего дня, после смены даты должен создаться новый файл и начать писаться уже в него.
На графике при каждом добавлении данных должна строиться линия по показаниям из столбца "Вес на датчике (кг)" С4:С15 на моих вложениях к примеру.
0
 Аватар для ViterAlex
8953 / 4865 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
24.11.2016, 18:43
FreedlN, как должен выглядеть файл и график после, скажем, трёх обновлений в течение дня
0
0 / 0 / 1
Регистрация: 18.11.2016
Сообщений: 13
24.11.2016, 19:50  [ТС]
Цитата Сообщение от ViterAlex Посмотреть сообщение
как должен выглядеть файл и график после, скажем, трёх обновлений в течение дня
Примерный файл во вложении. Там 3 примерных обновления программы. Следующие обновления будут идти ниже до наступления следующих суток.
Вложения
Тип файла: xlsx template.xlsx (15.9 Кб, 8 просмотров)
0
 Аватар для ViterAlex
8953 / 4865 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
25.11.2016, 22:08
Лучший ответ Сообщение было отмечено FreedlN как решение

Решение

FreedlN, тебе нужен не обычный файл xlsx, а шаблон xltx. Как во вложении. На его основе создавать новый файл, копировать шаблон данных, вставлять его ниже, заполнять новыми данными, копировать диаграмму, смещать её вниз, менять у неё источник данных.
Для приложенного шаблона я попробовал реализовать экспорт:
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
using System;
using System.Diagnostics;
using System.IO;
using System.Runtime.InteropServices;
 
namespace OutputToExcel
{
    public static class ExcelHelper
    {
        [DllImport("user32.dll", SetLastError = true)]
        private static extern uint GetWindowThreadProcessId(int hWnd, ref int lpdwProcessId);
        /// <summary> Имя файла шаблона</summary>
        public static string TemplateFile { get; set; }
        /// <summary> Дата последнего сохранения </summary>
        private static DateTime _lastDate;
        /// <summary> Последнее имя файла </summary>
        private static string _lastFileName;
        /// <summary> Индекс последней строки </summary>
        private static long _lastRowIndex;
 
        private static dynamic _xlApp;
        private static dynamic _xlWorkbook;
        private static dynamic _xlWorksheet;
 
        /// <summary>
        /// Экспорт данных в Excel
        /// </summary>
        /// <param name="cellValues">Значения ячеек</param>
        /// <param name="weightOnSensors">Вес на датчиках</param>
        /// <param name="brutto1">Брутто 1-х весов</param>
        /// <param name="brutto2">Брутто 2-х весов</param>
        /// <param name="koef">Коэффициент</param>
        public static void Export(double[] cellValues, double[] weightOnSensors, double brutto1, double brutto2, double koef)
        {
            _xlApp = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
            _xlApp.Visible = true;
            //Если даты не совпадают
            if (!DateTime.Now.Date.Equals(_lastDate.Date))
            {
                //Создаётся новый файл на основе шаблона
                _xlWorkbook = _xlApp.Workbooks.Add(TemplateFile);
                _lastDate = DateTime.Now;//меняется последняя дата
                _lastRowIndex = 21;//Сбрасывается указатель на последнюю строку
                //Формируется новое имя файла
                _lastFileName = string.Format("{0}.xlsx", _lastDate.ToString("dd.MM.yyyy"));
                //Файл сохраняется
                _xlWorkbook.SaveAs(Path.Combine(Environment.CurrentDirectory, _lastFileName));
                _xlWorksheet = _xlWorkbook.ActiveSheet;
            }
            else
            {
                //Открывается файл с соответствующим именем
                _xlWorkbook = _xlApp.Workbooks.Open(Path.Combine(Environment.CurrentDirectory, _lastFileName));
                _lastDate = DateTime.Now;
                _xlWorksheet = _xlWorkbook.ActiveSheet;
                CopyRange();
            }
            //Значения ячеек
            for (var i = 0; i < cellValues.Length; i++)
                _xlWorksheet.Range[string.Format("B{0}", i + _lastRowIndex - 17)].Value = cellValues[i];
            //Вес на датчике
            for (var i = 0; i < weightOnSensors.Length; i++)
                _xlWorksheet.Range[string.Format("C{0}", i + _lastRowIndex - 17)].Value = weightOnSensors[i];
            //Заголовок
            _xlWorksheet.Range[string.Format("A{0}", _lastRowIndex - 19)].Value = string.Format("Время обновления {0:dd.MM.yyyy HH:mm:ss}", _lastDate);
            //Брутто 1-х весов
            _xlWorksheet.Range[string.Format("B{0}", _lastRowIndex - 3)].Value = brutto1;
            //Брутто 2-х весов
            _xlWorksheet.Range[string.Format("B{0}", _lastRowIndex - 2)].Value = brutto2;
            //Коэффициент
            _xlWorksheet.Range[string.Format("B{0}", _lastRowIndex)].Value = koef;
 
            _xlWorkbook.Save();
 
            CloseExcel(_xlApp, _xlWorkbook, _xlWorksheet);
        }
 
        /// <summary>
        /// Копирование диапазона ячеек и диаграммы
        /// </summary>
        private static void CopyRange()
        {
            //Новый диапазон ячеек под заполнененными строками. На 2 строки дальше последней заполненной
            dynamic newRange = _xlWorksheet.Range[string.Format("A{0}", _lastRowIndex + 2)];
            //Копируем данные в новый диапазон ячеек
            _xlWorksheet.Range[string.Format("A{0}:C{1}", _lastRowIndex - 19, _lastRowIndex)].Copy(newRange);
            //Последняя диаграмма на листе. Создаём её дубликат
            dynamic chart = _xlWorksheet.ChartObjects[_xlWorksheet.ChartObjects.Count].Duplicate();
            //Меняем указатель на последнюю строку
            _lastRowIndex += 21;
            //Левая и верхняя координаты для позиционирования новой диаграммы
            double left = _xlWorksheet.Range[string.Format("E{0}", _lastRowIndex - 17)].Left;
            double top = _xlWorksheet.Range[string.Format("A{0}", _lastRowIndex - 17)].Top;
            //Перемещаем диаграмму
            chart.Left = left; chart.Top = top;
            //Меняем диапазон, отображаемый на диаграмме
            chart.Chart.SetSourceData(Source: _xlWorksheet.Range[string.Format("C{0}:C{1}", _lastRowIndex - 17, _lastRowIndex - 6)]);
        }
 
        /// <summary>
        /// Освобождение ресурсов
        /// </summary>
        /// <param name="xlApp">Ссылка на приложение</param>
        /// <param name="xlWorkbook">Ссылка на книгу</param>
        /// <param name="xlWorksheet">Ссылка на лист</param>
        private static void CloseExcel(dynamic xlApp, dynamic xlWorkbook, dynamic xlWorksheet)
        {
            if (xlApp == null) return;
            int excelProcessId = -1;
            GetWindowThreadProcessId(xlApp.Hwnd, ref excelProcessId);
            Marshal.ReleaseComObject(xlWorksheet);
            Marshal.ReleaseComObject(xlWorkbook);
            Marshal.ReleaseComObject(xlApp);
            xlApp = null;
            try
            {
                Process process = Process.GetProcessById(excelProcessId);
                process.Kill();
            }
            catch { }
        }
    }
}
Экспорт выполняется вызовом метода Export с соответствующими параметрами. Осталось только допилить сохранение даты, имени файла и индекса последней строки между запусками программы в течение одного дня. Способов для этого предостаточно
Вложения
Тип файла: zip template.zip (11.2 Кб, 25 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2016, 22:08
Помогаю со студенческими работами здесь

Построение графиков excel
Здравствуйте, помогите пожалуйста, VBA изучаю недавно и очень медленно,т.к. тяжело дается, но задание надо срочно сделать. В общем нужна...

Построение графиков в Excel
Помогите пожалуйста разобраться. Как построить график функций в одной системе координат y=2sin(Пих)-3cos(Пих), z=cos^2(2Пих)-2sin(Пих), при...

Построение графиков в Excel
Можете помочь с построением графиков в Excel в документе все написано.

Построение графиков в MS Excel
Добрый день. Прошу помощи в решении задания по построения графиков в MS Excel. Вариант задания для построения графиков. 1. Способы...

Построение графиков в Excel
Доброго времени суток! Совсем не знаю Excel, но графики строить надо:( Если кому не сложно, то постройте графики зависимостей:) Надо...


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

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

Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru