powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Excel+C#
23 сообщений из 23, страница 1 из 1
Excel+C#
    #38650833
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!

Вот задание по которому необходимо написать программу:
На языке C# реализовать программу, которая будет проводить корреляционный анализ результатов масштабного социологического
исследования The European Values Study 2012 года и актуальную статистику по рождаемости детей в тех же странах,
а также будет выделять наиболее яркие зависимости между общественными ценностями и показателями рождаемости детей.

Я создала форму на которой расположены следующие компоненты:
button1(открывает статистику в dataGridView),
button2(считает корреляцию),
dataGridView1(показывает статистику),
textBox1(показывает путь файла).

Вот код программы, который смогла написать(для открытия статистики):
Код: 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.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
      
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            OpenFileDialog ofd = new OpenFileDialog(); //Задаем расширение имени файла по умолчанию. 
            ofd.DefaultExt = "*.xls;*.xlsx"; //Задаем строку фильтра имен файлов, которая определяет 
            //варианты, доступные в поле "Файлы типа" диалогового 
            //окна. 
            ofd.Filter = "Excel Sheet(*.xlsx)|*.xlsx"; //Задаем заголовок диалогового окна. 
            ofd.Title = "Выберите документ для загрузки данных";
            Excel.Application app = new Excel.Application();
            Excel.Workbook workbook;
            Excel.Worksheet NwSheet;
            Excel.Range ShtRange;
            DataTable dt = new DataTable();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = ofd.FileName; workbook = app.Workbooks.Open(ofd.FileName, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value); //Устанавливаем номер листа из котрого будут извлекаться данные 
                //Листы нумеруются от 1 
                NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);
                ShtRange = NwSheet.UsedRange;
                for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
                {
                    dt.Columns.Add(new DataColumn((ShtRange.Cells[1, Cnum] as Excel.Range).Value2.ToString()));
                }
                dt.AcceptChanges();
                string[] columnNames = new String[dt.Columns.Count];
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    columnNames[0] = dt.Columns[i].ColumnName;
                }
                for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++)
                {
                    DataRow dr = dt.NewRow();
                    for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
                    {
                        if ((ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null)
                        {
                            dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString();
                        }
                    }
                    dt.Rows.Add(dr);
                    dt.AcceptChanges();
                }
                dataGridView1.DataSource = dt;
                app.Quit();
            }
            else Application.Exit();
        }


        private void button2_Click(object sender, EventArgs e)
        {
            
        }
    }
}



Помогите написать код для button2(считает корреляцию, т.е. при нажатии на кнопку необходимо, чтобы в ячейку "B35"
записывалась формула "=КОРРЕЛ(B2:AS2;B33:AS33)" и все изменения в Excel должны быть отображены в dataGridView1).
...
Рейтинг: 0 / 0
Excel+C#
    #38650897
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kira_006,

Код: c#
1.
2.
3.
4.
NwSheet= NwSheet.get_Range("B35", "B35"); 
NwSheet.Formula="=КОРРЕЛ(B2:AS2;B33:AS33)";
//получаем результат
object a=NwSheet.Value2;


Потом добавляем в DataTable строку и присваиваем значение во 2-м столбце

Теперь про ужасный код
Код: c#
1.
2.
3.
if (ofd.ShowDialog() == DialogResult.OK)
{...}
else Application.Exit();


Закрывать приложение только потому, что пользователь не выбрал файл, слишком жестоко. Впрочем, возможно вы хотели только закрыть Excel. Тогда нужен
Код: c#
1.
app.Quit();

А еще сразу возникает вопрос,а зачем мы открывали Excel, если пользователь ничего не сделал. И тут уже становится понятно, что нам нужен метод, который будет принимать в качестве параметра имя файла и что-то там делать. И вообще уничтожение объектов Excel лучше помещать в finally блока try...catch.
Код: c#
1.
string[] columnNames = new String[dt.Columns.Count];

Массив объявляется, инициализируется и... нигде не используется. Так что он вам не нужен дважды: он не используется и у вас уже есть коллекция dt.Columns, содержащая те же данные.
Считывание данных из Excel по одной ячейке низкоэффективно. Чем больше ячеек, тем больше времени это действие займет. Для этого лучше использовать ADO.NET.
Обращение к конкретной ячейке "B35" превращает вашу программу в приложение, которое может работать только с одним листом Excel, что снижает ее практическую ценность. Злой преподаватель может добавить/удалить в таблицу Excel один столбец или одну стоку и прога уже будет работать некорректно. Лучше работать с номерами строк и столбцов.

Как бы делал задание я.
Считал бы данные с помощью ADO.NET в DataTable. Отобразил в гриде. После нажатия кнопки "Корреляция" произвел бы вычисления с ячейками DataTable. Формула корреляции есть здесь:. Показал бы результат вычисления в отдельном компоненте.
...
Рейтинг: 0 / 0
Excel+C#
    #38650898
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igr_ok Формула корреляции есть здесь http://exceltip.ru/как-рассчитать-коэффициент-корреляц/
...
Рейтинг: 0 / 0
Excel+C#
    #38651704
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igr_ok,
спасибо большое за помощь.

я вставила такой код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
private void button2_Click(object sender, EventArgs e)
        {

            NwSheet = NwSheet.get_Range("B35", "B35");
            NwSheet.Formula = "=КОРРЕЛ(B2:AS2;B33:AS33)";
            //получаем результат
            object a = NwSheet.Value2;
            dataGridView1.DataSource = dt;
            DataRow MyRow = dt.NewRow();
            MyRow["Австрия"] = a;
            dt.Rows.Add(MyRow);
            dt.AcceptChanges();
        
        }



Выдает ошибку: "Неявное преобразование типа Microsoft.Office.Interop.Excel.Range в Microsoft.Office.Interop.Excel.Worksheet".
Может я пропустила какую то директиву using или еще что-то не так написала?
...
Рейтинг: 0 / 0
Excel+C#
    #38651731
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kira_006
Код: c#
1.
NwSheet = NwSheet.get_Range("B35", "B35");

вы присваиваете переменной типа Лист значение типа Диапазон, о чем вам и говорит компилятор

используйте переменную нужного типа
...
Рейтинг: 0 / 0
Excel+C#
    #38651734
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kira_006igr_ok,
спасибо большое за помощь.

я вставила такой код:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
private void button2_Click(object sender, EventArgs e)
        {

            NwSheet = NwSheet.get_Range("B35", "B35");
            NwSheet.Formula = "=КОРРЕЛ(B2:AS2;B33:AS33)";
            //получаем результат
            object a = NwSheet.Value2;
            dataGridView1.DataSource = dt;
            DataRow MyRow = dt.NewRow();
            MyRow["Австрия"] = a;
            dt.Rows.Add(MyRow);
            dt.AcceptChanges();
        
        }



Выдает ошибку: "Неявное преобразование типа Microsoft.Office.Interop.Excel.Range в Microsoft.Office.Interop.Excel.Worksheet".
Может я пропустила какую то директиву using или еще что-то не так написала?Прошу прощения, немножко запутался в ваших переменных. Не NwSheet, а ShtRange
...
Рейтинг: 0 / 0
Excel+C#
    #38651759
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igr_ok,
после замены в коде на ShtRange, ошибок не выдает, но и программа ничего не делает.
После нажатия на "Корреляцию" выходит такое окошко.

В чем может быть проблема?
...
Рейтинг: 0 / 0
Excel+C#
    #38651769
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kira_006igr_ok,
после замены в коде на ShtRange, ошибок не выдает, но и программа ничего не делает.
После нажатия на "Корреляцию" выходит такое окошко.

В чем может быть проблема?

Может быть я не правильно прибавила строку в DataTable?
...
Рейтинг: 0 / 0
Excel+C#
    #38651809
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прикольно.
А Вы не замужем?
...
Рейтинг: 0 / 0
Excel+C#
    #38651814
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EDUARD SAPOTSKI,
По моему Вы ошиблись темой или форумом)
...
Рейтинг: 0 / 0
Excel+C#
    #38651819
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kira_006По моему Вы ошиблись темой или форумом)
Да не, это Вы ошиблись двумя строчками кода)
...
Рейтинг: 0 / 0
Excel+C#
    #38651825
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EDUARD SAPOTSKIkira_006По моему Вы ошиблись темой или форумом)
Да не, это Вы ошиблись двумя строчками кода)

А вот с этого места, если можно поподробнее)
...
Рейтинг: 0 / 0
Excel+C#
    #38651826
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kira_006А вот с этого места, если можно поподробнее)
Не, поподробнее надо с другого места)
...
Рейтинг: 0 / 0
Excel+C#
    #38651828
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EDUARD SAPOTSKIkira_006А вот с этого места, если можно поподробнее)
Не, поподробнее надо с другого места)

Интересно, с какого же?
...
Рейтинг: 0 / 0
Excel+C#
    #38651830
Фотография EDUARD SAPOTSKI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kira_006Интересно, с какого же?
С девятого)
...
Рейтинг: 0 / 0
Excel+C#
    #38651832
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
EDUARD SAPOTSKIkira_006Интересно, с какого же?
С девятого)
Вы очень «помогли», большое спасибо.
...
Рейтинг: 0 / 0
Excel+C#
    #38652341
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kira_006igr_ok,
после замены в коде на ShtRange, ошибок не выдает, но и программа ничего не делает.
После нажатия на "Корреляцию" выходит такое окошко.

В чем может быть проблема?Покажите код.
...
Рейтинг: 0 / 0
Excel+C#
    #38652701
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igr_ok,

Код: 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.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        
        Excel.Worksheet NwSheet;
        Excel.Range ShtRange;
        DataTable dt = new DataTable();
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog(); //Задаем расширение имени файла по умолчанию. 
            ofd.DefaultExt = "*.xls;*.xlsx"; //Задаем строку фильтра имен файлов, которая определяет 
            //варианты, доступные в поле "Файлы типа" диалогового 
            //окна. 
            ofd.Filter = "Excel Sheet(*.xlsx)|*.xlsx"; //Задаем заголовок диалогового окна. 
            ofd.Title = "Выберите документ для загрузки данных";
            Excel.Application app = new Excel.Application();
            Excel.Workbook workbook;

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = ofd.FileName; workbook = app.Workbooks.Open(ofd.FileName, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, Missing.Value); //Устанавливаем номер листа из котрого будут извлекаться данные 
                //Листы нумеруются от 1 
                NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);
                ShtRange = NwSheet.UsedRange;
                for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
                {
                    dt.Columns.Add(new DataColumn((ShtRange.Cells[1, Cnum] as Excel.Range).Value2.ToString()));
                }
                dt.AcceptChanges();
                string[] columnNames = new String[dt.Columns.Count];
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    columnNames[0] = dt.Columns[i].ColumnName;
                }
                for (int Rnum = 2; Rnum <= ShtRange.Rows.Count; Rnum++)
                {
                    DataRow dr = dt.NewRow();
                    for (int Cnum = 1; Cnum <= ShtRange.Columns.Count; Cnum++)
                    {
                        if ((ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2 != null)
                        {
                            dr[Cnum - 1] = (ShtRange.Cells[Rnum, Cnum] as Excel.Range).Value2.ToString();
                        }
                    }
                    dt.Rows.Add(dr);
                    dt.AcceptChanges();
                }
                dataGridView1.DataSource = dt;
                app.Quit();
            }
            else Application.Exit();      
        }

        private void button2_Click(object sender, EventArgs e)
        {
            ShtRange = ShtRange.get_Range("B35", "B35");
            ShtRange.Formula = "=КОРРЕЛ(B2:AS2;B33:AS33)";
            //получаем результат
            object a = ShtRange.Value2;            
            dataGridView1.DataSource = dt;
            DataRow MyRow = dt.NewRow();
            MyRow["Австрия"] = a;            
            dt.Rows.Add(MyRow);
            dt.AcceptChanges();
        }
    }
}
...
Рейтинг: 0 / 0
Excel+C#
    #38652925
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kira_006,

ShtRange = NwSheet .get_Range("B35", "B35");
...
Рейтинг: 0 / 0
Excel+C#
    #38652930
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igr_ok,
Изменила, но все равно выдает эту ошибку.(
...
Рейтинг: 0 / 0
Excel+C#
    #38653068
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kira_006igr_ok,
Изменила, но все равно выдает эту ошибку.(Проверяйте в отладчике,на что ругается. Если всё сделано правильно, то будет работать.
...
Рейтинг: 0 / 0
Excel+C#
    #38653273
kira_006
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igr_ok,
Прикрепляю скрин.
Что это может быть?
...
Рейтинг: 0 / 0
Excel+C#
    #38653469
igr_ok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kira_006,

В button1_Click вы закрываете Excel, поэтому возникает ошибка. Ваше желание не вычислять формулу самой, а воспользоваться готовой формулой Excel, дорого вам обходится.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Excel+C#
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]