лекция. Зиборов. Справочник для опытных и как пособие для начинающих программистов. Компактдиск содержит исходные коды примеров из книги
Скачать 7.39 Mb.
|
ГЛАВА 9 Использование функций MS Word, MS Excel, AutoCAD и MATLAB Пример 54. Проверка правописания в текстовом поле с помощью обращения к MS Word Пакет приложений Microsoft Office может являться сервером OLE-объектов, и его функции могут использоваться другими приложениями. Продемонстрируем такое использование. Для этого создадим программу, которая позволяет пользователю ввести какие-либо слова, предложения в текстовое поле и после нажатия соответствующей кнопки проверить орфографию введенного текста. Для непосредственной проверки орфографии воспользуемся функцией СheckSpelling объектной библиотеки MS Word. Запустим Visual Studio 2010, выберем новый проект Windows Forms Application С#. Перетащим из панели элементов Toolbox в форму текстовое поле. Чтобы растянуть его на всю форму в свойстве Multiline текстового поля укажем True (разрешим введение множества строк). Также с панели элементов перетащим кнопку Button. Мы должны получить примерно такой дизайн, который представлен на рис. 9.1. Рис. 9.1. Фрагмент работы программы проверки орфографии Далее к текущему проекту добавим объектную библиотеку MS Word (библиотеку компонентов). Для этого в пункте меню Project выберем команду Add Refer. Затем, если на вашем компьютере установлен MS Office 2003, то на вкладке СОМ дважды щелкнем по ссылке на библиотеку Microsoft Word 11.0 Object Librrary. Если же установлен MS Office 2007, то дважды щелкнем на ссылке Microsoft Word 12.0 Object Library. Эта объектная библиотека соответствует файлу, расположенному по адресу: C:\Program Files\Microsoft Office\OFFICE11\MSWORD.OLB( или ...\OFFICE12\MSWORD.OLB для MS Office 2007). Теперь убедимся в том, что данная ссылка благополучно установлена. Для этого в обозревателе решений раскроем узел References, здесь среди прочих ссылок идим строку Microsoft.Office.Intеrop.Word. Кроме того, в папке проекта obj\x86\Debug появился файл Interop.Office.dll. Tаким образом, мы подключили библиотеку объектов MS Word. Далее введем программный код, представленный в листинге 9.1. Листинг 9.1. Проверка орфографии //Добавляем эту директиву для более коротких выражений using Ворд = Microsoft.Office.Interop; System; using System; using System.Windows.Forms; //Программа позволяет пользователю ввести какие-либо слова, предложения в текстовое поле и после нажатия //соответствующей кнопки проверить орфографию введенного текста. Для непосредственной проверки орфографии //воспользуемся функцией CheckSpelling объектной библиотеки MS Word, // Другие директивы using удалены, поскольку они не используются в данной программе namespace Орфография { //В пункте меню Project выберем команду Add Reference. //Затем, если на вашем компьютере установлен MS Office 2007, //то на вкладке СОМ дважды щелкнем по ссылке //на библиотеку Microsoft Word 12.0 Object Libary. public partial class Form1 : Form { public Form1() { InitializeComponent(); textBox1.Clear(); button1.Text = "Проверка орфографии"; } Private void button1_Click(object sender, EventArgs e) { var Ворд1 = new Ворд.Word.Application(); Ворд1.Visible = false; Ворд1.Documents.Add(); // Открываем новый документ // Копируем содержимое текстового окна в документ Ворд1.Selection.Text = textBox1.Text; // Проверка орфографии: Ворд1.ActiveDocument.CheckSpelling(); // Копируем результат назад в текстовое поле textBox1.Text = Ворд1.Selection.Text; Ворд1.Documents.Close(Ворд.Word.WdSaveOptions.wdDoNotSaveChanges); // или Ворд.ActiveDocument.Close // (Ворд.Word.WdSaveOptions.wdDoNotSaveChanges); // Это важно: Bopд1.Quit(); Ворд1 = null; } } } Как видно из текста программы, сразу после InitializeComponent очищается текстовое поле и инициализируется название кнопки Проверка орфографии. При обработке события "щелчок по кнопке" Button1.click создается новый объект класса Word.Application и командой Documents.Add открывается новый документ. Далее весь введенный пользователем текст копируется в этот документ. Затем происходит непосредственная проверка орфографии командой CheckSpelling. Далее документ закрываем без сохранения изменений wdDoNotSaveChanges. После нажатия кнопки Проверка орфографии получим диалоговое окно, подобное представленному на рис. 9.2. Рис. 9.2. Проверка правописания в текстовом поле Выберем правильный вариант написания слова и щелкнем на кнопке 3aменить, при этом диалоговое окно закроется, а в нашем текстовом поле на форме окажется исправленное слово. Убедиться в работоспособности программы можно, открыв решение Орфография.sln в папке Орфография. Пример 55. Вывод таблицы средствами MS Word В данной книге мы уже рассматривали способы формирования таблицы. Здесь мы обсудим способ создания таблицы, используя функции MS Word. Вообще говоря программировать взаимодействие программы на Visual С#2010 с различными офисными приложениями (Word, Excel, Access, PowerPoint и т. д.), а также с AutoCAD, CorelDRAW удобно, поскольку во все эти приложения встроен язык VBA (Visual Basic for Applications), в арсенале которого используются программные объекты, названия и назначения которых в многом схожи с объектами, используемыми в VisualС#. Причем есть возможность записи макроса с последующим просмотром соотвествующей VBA-программы. Например, мы хотим посмотреть, как организована вставка таблицы в редакторе MS Word. Для этого запускаем MS Word, затем в меню Сервис выбираем команду Макрос | Начать запись, далее в диалоговом окне Запись макроса указываем имя макроса и щелкаем на кнопке ОК. Теперь в текст MS Word вставляем таблицу, используя пункты меню Таблица | Вставить | Таблица и т. д. После заполнения таблицы нажимаем кнопку Остановить запись. Далее помощью комбинации клавиш <Alt>+<F11> откроем окно Microsoft Visual Basil здесь мы увидим текст макроса на языке VBA. Из этого текста мы можем понять основной принцип, имена используемых объектов, функций, свойств и проч. А теперь рассмотрим уже конечный результат— программу на Visual С#2010, которая, используя функции MS Word, строит таблицу. Итак, запускаем Visual Studio 2010, выбираем новый проект, указываем шаблон Windows Form Application С#. Далее к текущему проекту добавим объектную библиотеку MS Word. Для этого в меню Project укажем команду Add Reference и на появившейся вкладке СОМ дважды щелкнем по ссылке на библиотеку Microsoft Word 11.0 Object Library (или другая версия MS Word). На экранную форму перенесем командную кнопку Button, чтобы работа программы выглядела более выразительно. То есть именно после щелчка на кнопке будет формироваться таблица и вызываться MS Word для ее отображения. Далее введем программный код, представленный в листинге 9.2. Листинг 9.2. Вывод таблицы средствами MS Word // Программа вывода таблицы средствами MS Word: запускается программа, // пользователь наблюдает, как запускается редактор MS Word //и автоматически происходит построение таблицы using System; using System.Windows.Forms; // Добавляем эту директиву для более коротких выражений usingВорд = Microsoft.Office.Interop; // Дpyгие директивы using удалены, поскольку они не используются в данной программе namespace TaблицaWord ( public partial class Form1:Form { public Form1() { // В меню Project укажем команду Add Reference и на появившейся // вкладке СОМ дважды щелкнем по ссылке на библиотеку // Microsoft Word 12.0 Object Library InitializeComponent(); Button1.Text = "Пуск"; base.Text = "Построение таблицы"; } private void buttonl_Click(object sender, EventArgs e); { string[] Imena = {"Андрей - раб", "Света-X", "ЖЭК", "Справка по тел", "Александр Степанович", "Мама - дом", "Карапузова Таня", "Погода сегодня", "Театр Браво"}; string[] Tel = {"274-88-17", "+38(067)7030356", "22-345-72", "009", "223-67-67 доп 32-67", "570-38-76", "201-72-23-прямой моб", "001", "216-40-22"}; var Ворд1 = new Ворд.Word.Application(); Ворд1.Visible = true; Ворд1.Documents.Add(); // Открываем новый документ Ворд1.Selection.TypeText("ТАБЛИЦА ТЕЛЕФОНОВ"); // Создаем таблицу из 9 строк и 2 столбцов; // автоподбор ширины столбцов - // по содержимому ячеек (wdAutoFitContent) Ворд1.ActiveDocument.Tables.Add(Ворд1.Selection.Range, 9, 2, Ворд.Word.WdDefaultTableBehavior.wdWord9TableBehavior, Ворд.Word.WdAutoFitBehavior.wdAutoFitContent); // Заполнять ячейки таблицы можно так: for (int i = 1; i <= 9; i++) { Ворд1.ActiveDocument.Tables[1].Cell(i, 1). Range.InsertAfter(Imena[i - 1]); Ворд1.ActiveDocument.Tables[1].Cell(i, 2). Range.InsertAfter(Tel[i - 1]); } // Перевести курсор (Selection) за пределы таблицы Ворд1.Selection.MoveDown(Ворд.Word.WdUnits.wdLine, 9); Ворд1.Selection.TypeText("Какой-либо текст после таблицы"); // Сохранять нет смысла, но это решит пользователь // W.ActiveDocument.SaveAs("С:\a.doc") } } } Заметим, что содержимое текстовой таблицы такое же,- как и в примере 44 (см. главу 7).То есть наш сюжет меняется, а действующие персонажи остаются npeжними. Данные находятся в двух массивах: Imena() и Tel(). Далее создаем экземпляр объекта Word.Application и открываем новый документ Document.Add. Затем демонстрируем, как можно добавлять какие-либо тексты в новый документ из С#-программы, например, мы вводим в активный докумет текст "ТАБЛИЦА ТЕЛЕФОНОВ". Далее создаем таблицу, состоящую из девяти строк (рядов) и двух столбцов, причем ширина столбцов будет регулироваться в зависимости от содержимого ячеек (wdAutoFitContent). Затем в цикле заполняем ячейки таблицы и выводим курсор (Selection) за пределы таблицы, чтобы написать какой-либо текст. Рис. 9.3. Программно сформированная таблица в редакторе MS Word После запуска этой программы очень красиво, прямо на наших глазах в редакторе MS Word сформируется таблица (рис. 9.3), которую при желании можно редактировать. сохранять и распечатывать на принтере. Убедиться в работоспособности программы можно, открыв решение ТаблицаWord.sln в папке TaблицaWord. Пример 56. Обращение к функциям MS Excel из Visual С# 2010 Очень заманчиво обратиться из какой-нибудь вашей С#-программы к функциям Microsoft Excel. Табличный редактор MS Excel содержит очень мощные средства для сложных вычислений и анализа данных, которые могут значительно расширить возможности ваших программ. В данной программе мы продемонстрируем буквально в трех строчках программного кода обращение к одной простой функции MS Excel, а именно получение значения числа π = 3,14. Число πпредставлено в классе Math языка С#. Но цель данной программы — показать легкость доступа к функциям MS Excel. Как обычно, запустим Visual Studio 2010, далее в окне New Project выберем шаблон Windows Forms Application С# и щелкнем на кнопке ОК. Проектируемую экранную форму сделаем совсем маленькой, поскольку число π будем выводить в строку заголовка формы. Чтобы добавить в текущий проект возможности MS Excel, следует подключить библиотеку объектов MS Excel. Для этого в пункте меню Project выберем команду Add Reference. Затем, если на вашем компьютере установлен пакет MS Office 2003, то на вкладке СОМ дважды щелкнем по ссылке на библиотеку Microsoft Excel 11.0 Object Library. Если же установлен MS Office 2007, то дважды щелкнем на ссылке Microsoft Excel 12.0 Object Library. To есть процедура добавления новой библиотеки объектов такая же, как и в примерах об использовании возможностей MS Word, а названия пунктов меню сохранились почти такими же, как в предыдущих версиях Visual Studio. Подключить новую библиотеку объектов в текущий проект можно также через контекстное меню окна Solution Explorer (Обозреватель решений), щелкнув на пункте Add Reference. Таким образом, мы подключили библиотеку объектов MS Excel. В окне Soluton Explorer (чтобы его добавить, следует щелкнуть на значке Solution Explorer) Щелкните на значке Show All Files, а затем раскройте дерево References. Одной из ветвей дерева будет ветвь Excel. Щелкнув правой кнопкой мыши на значке этой ветви и выбрав пункт View in Object Browser, мы увидим объекты данной ветви в окне Object Browser (Обозреватель объектов). Найдем объект WorksheetFunction, при этом в окне Members of 'WorksheetFunction увидим доступные нам функции MS Excel для объекта WorksheetFunction. Теперь в программном коде обратимся к одной из этих функций, а именно функции 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, Х2,Х3; L— вектор свободных членов 6, 3, 5. Тогда решением системы будет выражение X=A-1•L, где Х-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 можно ввести измеренные данные, а далее чтобы получить график, построенный по этим данным, воспользоваться пунктами меню Вставка | Диаграмма. В данном разделе я покажу, как можно очень быстро получить график (диаграмму) из программы Visual С#2010, используя средства (объекты компонентной библиотеки) MS Excel. Запустим Visual Studio 2010, далее, поскольку экранная форма нам не нужна, выбираем новый проект из шаблона Console Application. Теперь к текущему проекту добавим библиотеку объектов MS Excel. Для этого в пункте меню Project выберем команду Add Reference, далее на вкладке СОМ отметим библиотеку Microsoft Excel 12.0 Object Library и щелкнем на кнопке ОК. Затем на вкладке программного кода введем текст, приведенный в листинге 9.6. Листинг 9.6. Построение диаграммы средствами MS Excel // Программа строит график (диаграмму) средствами объектов // компонентной библиотеки MS Excel using XL = Microsoft.Office.Interop.Excel; // Другие директивы using удалены, поскольку они не используются в данной программе namespace ЕхсеlГрафик { // Для подключения библиотеки объектов MS Excel в пункте меню Project // выберем команду Add Reference. Затем на вкладке СОМ дважды щелкнем // по ссылке на библиотеку Microsoft Excel 12.0 Object Library class Program { static void Main(string[] args) { XL.Application XL1 = new XL.Application(); XL1.Workbooks.Add(); //XL1.ActiveSheet.Range["A1"].Value = "Месяц"; XL1.ActiveSheet.Range["A2"].Value = "Март"; XL1.ActiveSheet.Range("A3").Value = "Anp"; XL1.ActiveSheet.Range("A4").Value = "Май"; XL1.ActiveSheet.Range("A5").Value = "Июнь"; XL1.ActiveSheet.Range("A6").Value = "Июль"; //XL1.ActiveSheet.Range("B1").Value = "Продажи:"; XL1.ActiveSheet.Range("B2").Value = 138; XL1. ActiveSheet.Range ("B3 ") . Value = 85; XL1.ActiveSheet.Range("B4").Value = 107; XL1.ActiveSheet.Range("B5").Value = 56; XL1.ActiveSheet.Range("B6").Value = 34; XL1.Charts.Add(); // Задаем тип графика "столбчатая диаграмма" (гистограмма): XL1.ActiveChart.ChartType = XL.X1ChartType.xlColumnClustered; // Отключаем легенду графика: XL1.ActiveChart.HasLegend = false; XL1.ActiveChart.HasTitle = true; XL1. ActiveChart. ChartTitle. Characters. Text = "ПРОДАЖИ ЗА ПЯТЬ МЕСЯЦЕВ"; // Подпись оси х XL1.ActiveChart.Axes(XL.XIAxisType.xlValue).HasTitle = true; XL1.ActiveChart.Axes(XL.XIAxisType.xlValue).AxisTitle. Characters.Text = "Уровни продаж"; // Подпись оси у XL1.ActiveChart.Axes(XL.XIAxisType.xlCategory).HasTitle = true; XL1.ActiveChart.Axes(XL.XIAxisType.xlCategory).AxisTitle. Characters.Text = "Месяцы"; // Сохранение графика в растровом файле: XL1.ActiveChart.Export("С:\\ЕхсеlГрафик.jpg"); XL1. Visible = true; } } } Вначале программного кода создаем объект Excel.Application и рабочую книгу. Далее заполняем ячейки первого листа: вначале в ячейки Ai пишем подпи ординат гистограммы, а в ячейки Bi — значения ординат. Затем задаем тип диаграммы— xlСolumnСlustered, что соответствует гистограмме (столбиковой диаграмме). Далее указываем название гистограммы и подписываем горизонтальную и вертикальную оси. Затем с помощью функции Export() сохраняем полученную диаграмму на диске в виде jpg-файла. Графическое отображение этого файла можно но посмотреть на рис 9.7. Далее делаем видимой (visible = true) построенную диаграмму на рабочем листе MS Excel. Убедиться в работоспособности программы можно, открыв решение ЕхсеlГрафик.sln в папке ЕхсеlГрафик. Рис. 9.7. Графическое отображение полученного jpg-файла Пример 60. Управление функциями AutoCAD из программы на Visual С# 2010 Если результатом работы вашей программы должен быть какой-либо векторный чертеж (техническая документация, строительный чертеж, географическая карта и проч.), то самый быстрый путь, создания такого приложения — это обращение к Функциям AutoCAD из вашей С#-программы. AutoCAD (Computer-Aided Design) — Это 2- и 3-мерная система автоматизированного проектирования и черчения. Эта система, также как и пакет приложений Microsoft Office, может являться сервером OLE-oбьектов, и его функции могут использоваться другими приложениями. Графическими примитивами векторной графики являются отрезки, дуги, окружности, тексты, которые можно выводить под различными углами к горизонту, и, может быть, еще некоторые простейшие геометрические фигуры. Чертеж, подлежащий построению, состоит из совокупности таких элементов. Программа на С#2010 путем обращения к соответствующим функциям AutoCAD формирует такой чертеж и записывает его в dwg-файл. Пользователь может просмотреть этот файл в среде AutoCAD, отредактировать его и вывести на печать. Приступаем к программированию поставленной задачи. Как обычно после запуска Visual Studio 2010, выбираем шаблон Windows Forms Application С#. Далее следует подключить библиотеку объектов AutoCAD, для этого в пункте меню Project выбираем команду Add Reference, затем на вкладке СОМ дважды щелкаем на ссылке AutoCAD 2000 Object Library. Эта ссылка соответствует файлу ACAD.TLD в соответствующей папке Program Files, где расположен результат инсталляции AutoCAD. Теперь после компиляции проекта в папке obj\x86\Debug явится файл Interop.AutoCAD.dll. Таким образом, мы подключили библиотеку объектов AutoCAD версии 2000 Если на вашем компьютере инсталлирована другая версия AutoCAD, то действуют аналогично. Программа, выводящая в dwg-файл два отрезка, а также две горизонтально и вертикально ориентированных строки текста, представлена в листинге 9.7. Листинг 9.7. Построение отрезков и двух строк текста в AutoCAD // Программа строит средствами объектов библиотеки AutoCAD элементарный // чертеж из отрезков и некоторого текста. Этот чертеж сохраняется в файле // формата DWG. Конкретнее: эта программа запускает AutoCAD 2000i, рисует // два отрезка, два текстовых объекта, сохраняет чертеж в файле С:\Чертеж.dwg //и завершает работу AutoCAD using System; using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются в данной программе namespace АСАDЧертеж { // Следует подключить библиотеку объектов AutoCAD. Для этого надо выбрать // Project | Add Reference - вкладка COM - AutoCAD 2000 Object Library – OK public partial class Form1:Form { public Form1() { InitializeComponent(); AutoCAD.AcadApplication ACAD1 = new AutoCAD.AcadApplication(); AutoCAD.AcadDocuments Docs1 = ACAD1.Documents; AutoCAD.AcadDocument Docl = Docs1.Add(); // Видимость: ACAD1.Visible = true; // Точки: double[] T1 = { 10, 10, 0 }; double[] T2 = { 200, 200, 0 }; double[] T3 = { 200, 10, 0 }; double[] T4 = { 15, 200, 0 }; // Нарисовать отрезок от точки T1 до точки Т2: Doc1.ModelSpace.AddLine(Tl, T2); // Нарисовать отрезок красным цветом: Doc1.ModelSpace.AddLine(T2, Т3).Color = AutoCAD.ACAD_COLOR.acRed; // Горизонтальный текст (с разворотом 0 градусов) Doc1.ModelSpace.AddText("Горизонтальный", Т4, 22); // Вертикальный текст с разворотом на 90 град = ПИ/2 Doc1.ModelSpace.AddText("Вертикальный", T1, 22).Rotation = Math.PI / 2; // Сохраняем чертеж на диске: Doc1. SaveAs ("С: \\Чертеж.dwg") ; ACAD1.Quit(); } } } Как видно из программного кода, весь процесс работы программы происходит cразу после выполнения процедуры InitializeComponent. Вначале создается объект клаcca AutoCAD.Application. Далее создаем коллекцию документов AcadDocuments и ,открываем (делаем активным) один документ предложением Docs .Add. Затем задаем видимость работы AutoCAD visible = True, при этом AutoCAD только мелькнет на экране. (Заметьте, что для конечной цели, т. е. для получения dwg-файла, видимость не обязательна.) Далее задаем четыре точки, которые будут участвовать в построении чертежа. Обратите внимание, что каждая точка имеет три ординаты, хотя мы собираемся строить плоский чертеж. Третью координату мы будем воспринимать, как напоминание того, что AutoCAD способен строить трехмерные чертежи. Затем рисуем два отрезка AddLine через точки T1, Т2 и Т2, Т3. Причем мы показали, как второй отрезок задать красным цветом. Далее подаем команду выводить текст горизонтально, затем другой текст — вертикально с разворотом на 90°, т. е. π/2. Затем, используя метод SaveAs, записываем построенный в документе чертеж в dwg-файл на логический диск С:. В результате работы этой программы получаем чертеж в системе AutoCAD, подобный представленному на рис. 9.8. Убедиться в работоспособности программы можно, открыв решение ACADЧертеж-sln в папке АСАDЧертеж. Рис. 9.8. Отображение полученного dwg-файла в системе AutoCAD Пример 61. Вызов MATLAB из вашей программы на Visual С# 2010 Можно вызывать MATLAB из вашей С#-программы. Среда MATLAB является стандартным мощным инструментом для работы в различных отраслях математики. При подготовке этого примера автор пользовался наиболее распространенной версией MATLAB 6.5. В данном примере продемонстрируем подготовку вводных данныхдля MATLAB, создание экземпляра объекта типа MATLAB и непосредственный вызов на выполнение. В результате мы увидим построение графика функции у = sin(x)•e-x.Для программирования этой задачи запустим Visual Studio 2010 и закажем новый проект шаблона Windows Forms Application С#. Из панели элеменов Toolbox перенесем командную кнопку Button, чтобы обращение к среде MATLАВ происходило при щелчке на этой кнопке и выглядело бы наиболее выразительно. Далее на вкладке программного кода введем текст из листинга 9.8. Листинг 9.8. Использование возможностей среды MATLAB // Программа, подготовив соответствующие команды для MATLAB, вызывает // его на выполнение этих команд. В результате строится затухающая // синусоида у = sin(x)*ехр(-х) using System; using System.Windows.Forms; // Добавляем директиву System.Reflection: using System.Reflection; // Другие директивы using удалены, поскольку они не используются в данной программе namespace MatlabBызов { // Для успешной работы программы нет необходимости добавлять ссылку на // объектную библиотеку через Project | Reference. Однако на компьютере // MATLAB должен быть установлен public partial class Form1 : Form { public Form1() { InitializeComponent(); Button1.Text = "Вызвать MATLAB"; } private void button1_Click(object sender, EventArgs e) { // Получить тип приложения MATLAB: Type ТипМатЛаб = Type.GetTypeFromProgID("Matlab.Application"); // Создать экземпляр объекта типа MATLAB: object МатЛаб = Activator.Createlnstance(ТипМатЛаб); // Подготавливаем команды для MATLAB: object[] Команды = new Object[] // { "surf(peaks)" }; { "x = 0:0.1:6.28; у = sin(x)*exp(-x); plot(x,y)" }; // { "s = sin(0.5); с = cos(0.5); у = s*s+c*c; y" }; // Вызываем MATLAB, подавая ему на вход подготовленные команды: object Результат = ТипМатЛаб.invokeMember("Execute", BindingFlags.InvokeMethod, null, МатЛаб, Команды); // MessageBox.Show(Результат.ToString()); } } } Как видно из текста программы, при обработке события "щелчок на кнопке" переменную ТипМатЛаб получаем тип приложения MATLAB. Далее создаем экземпляр объекта этого типа. Затем подготавливаем три команды для MATLAB, разделенные точкой с запятой. Первая команда "х = 0:0.1:6.28;" задает вектор х (набор чисел) от нуля до 2π (6,28) с шагом 0,1. Вторая команда "у = sin(x) *eхр(-х);" вычисляет второй вектор по значениям первого вектора. Третья команда plot создает график зависимости у от х. Метод Execute выполняет в среде MATLAB подготовленные команды. В результате обращения к MATLAB получим построенный график заданной функции (рис. 9.9). В комментариях приведены и другие команды, которые можно выполнить, подключаясь к среде MATLAB. Убедиться в работоспособности программы можно, открыв решение MatlabBызов.sln в папке MatlabBызов. Рис. 9.9. График функции, построенный в среде MATLAB Пример 62. Решение системы уравнений путем обращения к MATLAB Основной особенностью языка MATLAB являются его широкие возможности работе с матрицами, которые создатели языка выразили в лозунге "Думай векторно " (от англ. Thinkvectorized). Изначально среда MATLAB эволюционизировалась с задач матричной алгебры, отсюда и слово MATLAB означает матричная лаборатория (matrix laboratory). Решить систему уравнений, глядя на предыдущий пример, очень просто, нужно всего лишь знать, как строятся команды в MATLAB. Продемонстрируем процесс решения системы линейных уравнений на следующем примере. X1 + Х2+ Х3 =6 X1 + Х2 =3 Х2 + Х3 =5 Данную систему решим через обратную матрицу. Для программирования этой задачи запустим Visual Studio 2010 и закажем новый проект шаблона Windows Forms Application С#. Из панели элементов Toolbox перенесем командную кнопку Button. Далее на вкладке программного кода введем текст из листинга 9.9. Листинг 9.9. Решение системы линейных уравнений с помощью MATLAB // Программа, подготовив команды для решения системы уравнений в среде // MATLAB, вызывает его на выполнение этих команд. В результате получаем // решение, которое выводим на экран с помощью MessageBox using System; using System.Reflection; using System.Windows.Forms; // Другие директивы using удалены, поскольку они не используются в данной программе namespace MatlabСЛАУ { public partial class Form1:Form { ^ public Form1() { InitializeComponent(); Button1.Text = "Решить СЛАУ"; } private void button1_Click(object sender, EventArgs e) { //Матричное уравнение АХ = L решаем через // обратную матрицу: X = A(-1)L. // Здесь (-1) - "знак" обратной матрицы. // Решаем систему // XI + Х2 + Х3 = 6 // XI + Х2 =3 // Х2 + ХЗ = 5 // Для решения этой системы в MATLAB следует подать такие команды: // А = [1 1 1; 1 1 0; 0 1 1]; L = [6; 3; 5]; // % здесь задание прямой матрицы А и вектора свободных членов L // X = inv(A)*L % умножение обратной матрицы на L" }; //%- это признак комментария в MATLAB // Получить тип приложения MATLAB: Туре ТипМатЛаб = Type.GetTypeFromProgID("Matlab.Application"); // Создать экземпляр объекта типа MATLAB: object МатЛаб = Activator.Createlnstance(ТипМатЛаб); // Подготавливаем команды для MATLAB: object[] Команды = new Object[] { "А = [1 1 1; 1 1 0; 0 1 1]; L = [6; 3; 5]; " + "X = inv(A)*L % обратная матрица inv" }; // Вызываем MATLAB, подавая ему на вход подготовленные команды: object Результат = ТипМатЛаб.InvokeMember("Execute", BindingFlags.InvokeMethod, null, МатЛаб, Команды); // Таким образом мы могли бы вывести решение на экран: // MessageBox.Show(Результат.ToStringf)); // Однако этот результат будет внутри строки, а хотелось бы // получить ответ в массив double для дальнейшей обработки. // Этот массив можно получить методом GetFullMatrix из среды // MATLAB, как показано ниже var p = new ParameterModifier(4); p[0] = false; p[1] = false; p[2] = true; p[3] = true; ParameterModifier[] mods = { p }; double[,] X = new double[3, 1]; object[] Аргументы = new object[] { "X", "base", X, new double[0] }; // Здесь "X" - это название матрицы, которую мы хотим получить. // "base" является названием рабочей среды MATLAB, где следует // искать матрицу "X". Результат = ТипМатЛаб.InvokeMember("GetFullMatrix", BindingFlags. InvokeMethod, null, МатЛаб, Аргументы, mods, null, null); // Решение системы получаем в матрицу X: X = (double[,](Аргументы[2]; string Строка = string.Format("X1 = {0}; Х2 = {1}; Х3 = {2};", Х[0, 0] , Х[1, 0], Х[2, 0]); MessageBox.Show(Cтрока); } } } Как видно из программного кода, подход к решению задачи аналогичен предущему примеру. Мы реализовали обращение к MATLAB, используя метод Execute, решение системы получили в переменную Результат. И, как показано в комментарии, можем вывести результат вычислений на экран с помощ MessageBox. Однако для дальнейшей работы с полученным вектором неизвестных желательно иметь его в виде массива Double, а не в виде строки. Конечно, можно выделить из строки решения каждое значение неизвестного с помощью операций со строками, используя функцию Split, которая возвращает строковый массив, содержащий подстроки данного экземпляра. Однако существует более красивое решение. Оно заключается в иcпoльзoвaнии метода GetFullMatrix. Технологию этого использования мы привели в данной программе. Здесь наиболее важным параметром является объектная переменная Аргументы. Ее первым компонентом является компонент "X", содержащий название матрицы, которую мы хотим получить из среды MATLAB, второй компонент "base" является названием рабочей среды (workspace) MATLAB, где следует искать матрицу "X". Согласно документации, в среде MATLAB мы имеем две основные рабочие среды: "base" и "global". Третьим компонентом является массив х, куда получаем результат решения из среды MATLAB, а четвертым компонентом массив мнимой части решения, которой в нашей задаче нет, но для общности технологии требуется ее формальное присутствие. О других способах подключения к MATLAB можно узнать на сайте компании The Math Works, производителя MATLAB, www.mathworks.com. Убедиться в ботоспособности обсуждаемой программы можно, открыв решение MatlabCлay.sln в папке MatlabCлay. |