Файл: Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.01.2024

Просмотров: 951

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Pi ().

Для этого перейдем на вкладку программного кода Form1.cs и напишем программный код, приведенный в листинге 9.3.

Листинг 9.3. Обращение к одной из функций MS Excel

// Программа обращается к одной простой функции объектной библиотеки

// MS Excel для получения значения числа Пи = 3,14

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace ЕхсеlПи

{ // Чтобы добавить ссылку на объектную библиотеку Excel, в пункте меню

// Project выберем команду. Add Reference. Затем, если на вашем компьютере

// установлен MS Office 2007, то на вкладке СОМ дважды щелкнем по ссылке

// на библиотеку Microsoft Excel 12.0 Object Library,

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

// Создание экземпляра класса Excel.Application

var xl = new Microsoft.Office.Interop.Excel.Application();

double PI = xl.WorksheetFunction.Pi();

// Выводим значение ПИ в строку заголовка формы

this.Text = "PI = " + pi;

}

}

}

Как видно, сразу после вызова метода InitializeComponent при обработке бытия загрузки формы создается объект Excel.Application, с помощью которого( имеем доступ для одной из функций MS Excel, возвращающей число π = 3,14.

Результат работы программы показан на рис. 9.4.



Рис. 9.4. Вывод числа л в заголовок формы

Убедиться в работоспособности программы можно, открыв решение ЕхсеlПи.sln в папке ЕхсеlПи.

Пользоваться функциями MS Excel в Сопрограмме очень перспективно. Например, оцените возможность решать сложнейшие в математическом смысле оп­ерационные задачи (т. е. задачи нахождения максимума/минимума с набором ограничений), доступные в MS Excel через Сервис | Поиск решения.

Пример 57. Использование финансовой функции MS Excel

Рассмотрим еще один пример обращения к функциям MS Excel из программы на С# 2010. Допустим, вы взяли кредит на покупку квартиры 100 тыс. долларов под 15% годовых, срок погашения кредита— 10 лет. Требуется узнать сумму, которую вы вынуждены будете платить ежемесячно. В русскоязычном MS Excel для подоб­ных расчетов есть функция ПЛТ(), на вход которой следует подать месячную про­центную ставку (т. е. в нашем случае 0.15/12), срок погашения кредита в месяцах (120 месяцев) и размер кредита ($100 тыс.). Аналогом функции ПЛТ() является функция (метод) Pmt() класса WorksheetFunction, которая имеет такие же аргу­менты. Таким образом, мы можем написать
С# -программу с обращением к функ­ции Pmt() и проверить результат в русскоязычной версии MS Excel. Список всех методов (функций) объекта WorksheetFunction с описанием аргументов можно найти по адресу: http://msdn.microsoft.com/en-us/library/bb225774.aspx.

Для программирования обращений к этим функциям из программы, созданной в Visual Studio 2010, важно найти соответствие русскоязычных функций MS Excel и их аналогов в объекте WorksheetFunction для отладки на тестовых примерах.

Запустим Visual Studio 2010, далее закажем новый проект из шаблона Windows Forms Application С#. В проектируемую экранную форму из панели Toolbox пе­ренесем три метки, три текстовых поля (для ввода трех вышеперечисленных аргу­ментов функции Pmt() и кнопку. В текущий проект подключаем библиотеку объ­ектов MS Excel. Для этого в меню Project выберем команду Add Reference, затем на вкладке СОМ дважды щелкнем на ссылке Microsoft Excel 12.0 Object Library. Теперь можно перейти к программному коду, приведенному в листинге 9.4.

Листинг 9.4. Использование финансовой функции MS Excel

//Программа использует финансовую функцию Pmt() объектной библиотеки

//MS Excel для вычисления суммы периодического платежа на основе

// Постоянства сумм платежей и постоянства процентной ставки

using System;

using System.Windows.Forms;

// Другие директивы using удалены, поскольку они не используются в данной программе

namespace ЕхсеlПлт

{

// Для подключения библиотеки объектов MS Excel в пункте меню Project

// выберем команду Add Reference. Затем, если на вашем компьютере

// установлен MS Office 2007, то на вкладке СОМ дважды щелкнем по ссылке

//на библиотеку Microsoft Excel 12.0 Object Library

public partial class Form1:Form

{

public Form1()

{

InitializeComponent();

Label1.Text = "Год. ставка в %"; label2.Text = "Срок в месяцах"; label3.Text = "Размер кредита";

textBox1.Clear();textBox2.Clear();textBox3.Clear();

this.Text = "Расчет ежемесячных платежей";button1.Text = "Расчет"

}

private void button1_Click(object sender, EventArgs e)

{

try

{

var XL = new Microsoft.Office.Interop.Excel.Application() ;

double pay = XL.WorksheetFunction.Pmt(

(Convert.ToDouble(textBoxl.Text)) / 1200,

Convert.ToDouble(textBox2.Text),

Convert.ToDouble(textBox3.Text));
// ИЛИ, если использовать функцию Pmt() из Microsoft.VisualBasic
//double pay = Microsoft.VisualBasic.Financial.Pmt(
// (Convert.ToDouble(textBoxl.Text)) / 1200,

// Convert.ToDouble(textBox2.Text),

// Convert.ToDouble(textBox3.Text));

string ss = String.Format(

"Каждый месяц следует платить {0:$#.##} долларов",

Math.Abs(pay)); MessageBox.Show(ss);

}

catch(Exception Ситуация)

{

MessageBox.Show(Ситуация.Message, "Ошибка",



MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

}

}

}

}

Как видно из текста программы, сразу после вызова метода InitializeComponentочищаются (clear) текстовые поля, а также подписываются названия этих полей с помощью меток label1—iabel3 и присваивается название кнопки Button1.



Рис. 9.5. Расчет ежемесячных платежей

Убедиться в работоспособности программы можно, открыв решение ExcelПлт.sln в папке ExcelПлт.

В данном примере на простом примере мы рассмотрели, как легко подклю­читься к библиотеке объектов MS Excel и пользоваться ее функциями. Однако Функция Pmt() имеется также в среде Visual Studio 2010 в пространстве имен Microsoft .VisualBasic. Financial точно с такими же параметрами. (Более того, эта функция была еще в Visual Basic 6.) Для обращения к этой функции потребовалось бы подключение к Visual Basic, как мы это делали в примере 14 (см. глава2). То есть следовало бы в проект добавить ссылку на библиотеку Microsoft.VisualBasic.dll. Для этого в пункте меню Project надо выбрать команду Аdd Reference, а на вкладке .NET дважды щелкнуть на ссылке Microsoft.VisualBasic. В этом случае можно было бы обращаться к функции Pmt(), как это представлено в комментарии. Однако в данном примере показана принципиальная возможность работы с функциями MS Excel из С#-программы.

Пример 58. Решение системы уравнений р с помощью функций MS Excel

Используя функции MS Excel, в своей программе, созданной в Visual С#2011 можно решать и более серьезные задачи. Например, рассмотрим, как решить ] I тему линейных алгебраических уравнений:

X1 + X2 + X3 = 6

Х1 + Х2 = 3

Х2 + Х3 = 5

через обратную матрицу. Исходную систему уравнений запишем в матричном виде

А • X = L.

Здесь А — матрица коэффициентов при неизвестных; X — вектор неизвестных X1, Х23;

L— вектор свободных членов 6, 3, 5. Тогда решением системы будет выражение

X=A-1L,

где Х-1 —обратная матрица.

Для нахождения обратной матрицы в русскоязычной версии MS Excel есть функция МОБР(), а объект WorksheetFunction в библиотеке объектов Microsoft Excel
имеет функцию Minverse(). Для умножения обратной матрицы на вектор свободных членов есть соответственно функции мпроиз() и MMult(). Таких функций нет в Visual Studio 2010, и в данном случае мы получаем реальный положительный эффект от подключения к функциям MS Excel.

Для программной реализации решения поставленной задачи запустим Visual Studio 2010. Далее выберем новый проект из шаблона Windows Forms Application С# и щелнем на кнопке ОК. В проектируемую форму из панели Toolbox добавив метку и растянем ее побольше и симметрично относительно формы. На ней 6yдем формировать ответ задачи. Кроме того, добавим библиотеку объектов MS Ехel. Для этого в пункте меню Project выберем команду Add Reference и на вкладке СОМ отметим библиотеку Microsoft Excel 12.0 Object Library, а затем щелкнем на кнопке ОК.

Программу построим следующим образом (листинг 9.5): сразу после выполнения процедуры InitializeComponent прямо в тексте программы зададим (инициализируем) прямую матрицу в виде двумерного массива и вектор свободных членов в виде одномерного массива. Затем после решения системы выведем ответ на метку label1.

Листинг 9.5. Решение системы линейных алгебраических уравнений

// Программа решает систему уравнений с помощью функций объектной

// библиотеки MS Excel

using System;

using System.Windows.Forms;

using XL = Microsoft.Office.Interop.Excel.Application;
// Другие директивы using удалены, поскольку они не используются в данной программе

namespace ЕхсеlСЛАУ

{ // Для подключения библиотеки объектов MS Excel в пункте меню Project ,

//выберем команду Add Reference. Затем, если на вашем компьютере

//установлен MS Office 2007, то на вкладке СОМ дважды щелкнем по ссылке

//на библиотеку Microsoft Excel 12.0 Object Library

public partial class Form1:Form

{

public Form1()

{

InitializeComponent();
// Матричное уравнение AX = L решаем через
// обратную матрицу: X = A(-1)L.
// Здесь (-1) - "знак" обратной матрицы.
// Решаем систему
// XI + X2 + Х3 = 6
// XI + Х2 =3

// Х2 + ХЗ = 5

// Для этой системы прямая матрица будет иметь вид

// double[,] А = new double[n, n]; // - матрица коэффициентов

Double[,] А = {{1, 1, 1},

{1, 1, 0},

{0, 1, 1}};

// double[] L = new double[n]; // - вектор свободных членов

// Свободные члены

Double[] L = { 6, 3, 5 };

XL XL1 = new XL() ;

// Вычисление детерминанта матрицы A

double det_A = XL1.Application.WorksheetFunction.MDeterm(A);

// Если det_A != 0, то выход из процедуры:

if (Math.Abs(det_A) < 0.01)

{

Label1.Text = "Система не имеет решения, поскольку\n\n" + "определитель равен нулю";

return;


}

// Получение обратной матрицы оА:

Object oA = XL1.Application.WorksheetFunction.Minverse(A);

// Умножение обратной матрицы на вектор свободных членов

Object[,] X = XL1.Application.WorksheetFunction.MMult(

oA, XL1.Application.WorksheetFunction.Transpose(L));

// ТАК НАПИСАТЬ ПРАВОМОЧНО

// double X1 = (double)X[1, 1] ;

// Формирование ответа:

Label1.Text = String.Format("Неизвестные равны:\n\nX1 = {0}; X2 = {1}; X3 = {2}.", X[l, 1], X[2, 1], X[3, 1]);

}

}

}

Как видно из текста программы, задаем прямую матрицу, причем присваиваем значения коэффициентов сразу при объявлении двумерного массива. Аналогично поступаем с вектором свободных членов. Согласно требованию объекта WorksheetFunction возвращаемые обратная матрица и вектор неизвестных должны быть объявлены как объектные переменные. Вначале вычисляем детерминант ( определитель) прямой матрицы, используя функцию MS Excel Mdeterm(). Если прямая матрица плохо обусловлена, т. е. определитель по абсолютному значению меньше 0.01, то выходим из процедуры и сообщаем пользователю в метке label1 что система не имеет решения. Если определитель матрицы больше 0.01, то с помощью функции MS Excel Minverse() находим обратную матрицу. Далее обратную матрицу с помощью функции MS Excel MMuit() умножаем на вектор неизвестных, но прежде его следует сделать вертикальным массивом с помощью функции MS Excel Transpose, т. е. транспонировать массив l. Следующим оператором форматируем ответ в метке label1.

Результат работы программы приведен на рис. 9.6. Убедиться в работоспособности программы можно, открыв решение ExcelСЛАУ.sln в папке ЕхсеlСЛАУ.



Рис. 9.6. Решение системы линейных алгебраических уравнений

Как видим, довольно сложные задачи можно решать в коротенькой программе благодаря обращению к функциям MS Excel. Причем на компьютере, где будет работать данная программа, вовсе не обязательно должен быть инсталлирован MS Excel. Однако инсталляция вашей программы должна содержать соответсвующую dll-библиотеку.

Пример 59. Построение диаграммы средствами MS Excel

Очень часто необходимо изобразить на графике (диаграмме) какие-либо экономические показатели или технические измерения (геодезические, метрологические, астрономические), например, с целью принятия каких-либо решений, часто сделать это надо очень оперативно. Для этих целей в ячейки рабочего листа MSExcel можно ввести измеренные данные