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

Вот задание по которому необходимо написать программу:
На языке 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
24.05.2014, 13:31
    #38650897
igr_ok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel+C#
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
24.05.2014, 13:37
    #38650898
igr_ok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel+C#
igr_ok Формула корреляции есть здесь http://exceltip.ru/как-рассчитать-коэффициент-корреляц/
...
Рейтинг: 0 / 0
26.05.2014, 09:55
    #38651704
kira_006
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel+C#
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
26.05.2014, 10:27
    #38651731
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel+C#
kira_006
Код: c#
1.
NwSheet = NwSheet.get_Range("B35", "B35");

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

используйте переменную нужного типа
...
Рейтинг: 0 / 0
26.05.2014, 10:30
    #38651734
igr_ok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel+C#
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
26.05.2014, 10:57
    #38651759
kira_006
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel+C#
igr_ok,
после замены в коде на ShtRange, ошибок не выдает, но и программа ничего не делает.
После нажатия на "Корреляцию" выходит такое окошко.

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

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

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

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

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

В чем может быть проблема?Покажите код.
...
Рейтинг: 0 / 0
27.05.2014, 07:38
    #38652701
kira_006
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel+C#
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
27.05.2014, 11:24
    #38652925
igr_ok
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Excel+C#
kira_006,

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

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


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