QuickScript .NET — различия между версиями
Admin (обсуждение | вклад) |
Admin (обсуждение | вклад) (→Примеры Application Server 3.5 + Microsoft Excel 2007) |
||
Строка 29: | Строка 29: | ||
=== Примеры Application Server 3.5 + Microsoft Excel 2007 === | === Примеры Application Server 3.5 + Microsoft Excel 2007 === | ||
+ | Перед этим импортировать библиотеку из excel.exe (см. выше) | ||
− | <pre> | + | <pre> |
+ | LogMessage("1"); | ||
− | |||
− | + | dim app as Microsoft.Office.Interop.Excel._Application; | |
+ | dim wb as Microsoft.Office.Interop.Excel._Workbook; | ||
+ | dim ws as Microsoft.Office.Interop.Excel._WorkSheet; | ||
− | |||
− | |||
− | + | dim a1 as Microsoft.Office.Interop.Excel.Range; | |
− | + | dim a2 as Microsoft.Office.Interop.Excel.Range; | |
− | + | dim a3 as Microsoft.Office.Interop.Excel.Range; | |
+ | |||
+ | |||
+ | |||
+ | app = new Microsoft.Office.Interop.Excel.Application; | ||
+ | |||
+ | |||
+ | |||
+ | wb = app.Workbooks.Add(); | ||
ws = wb.ActiveSheet; | ws = wb.ActiveSheet; | ||
− | |||
− | |||
− | ws.Range("A1") | + | a1 = ws.Range("A1"); |
− | + | a2 = ws.Range("A2"); | |
− | ws.Range(" | + | a3 = ws.Range("A3"); |
− | |||
− | |||
− | |||
− | |||
− | + | a1.Value2 = 1000; | |
− | + | ||
− | + | ||
+ | a2.Value2 = 2000; | ||
− | + | a3.Value2 = "=A1*A2"; | |
− | + | ||
− | |||
− | |||
− | + | LogMessage(a3.Value2); | |
+ | |||
+ | |||
+ | System.IO.File.Delete("C:\temp\temp.xlsx"); | ||
+ | LogMessage("del file"); | ||
+ | wb.SaveAs("C:\temp\temp.xlsx"); | ||
+ | LogMessage("save file"); | ||
+ | |||
+ | wb.Close(false); | ||
+ | LogMessage("close file"); | ||
+ | |||
+ | LogMessage("end main part"); | ||
+ | System.Runtime.InteropServices.Marshal.ReleaseComObject(ws ); | ||
+ | System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); | ||
+ | app.Quit(); | ||
+ | System.Runtime.InteropServices.Marshal.ReleaseComObject(app); | ||
System.GC.Collect(); | System.GC.Collect(); | ||
− | LogMessage(" | + | System.GC.WaitForPendingFinalizers(); |
+ | LogMessage("end"); | ||
</pre> | </pre> | ||
Версия 11:27, 9 сентября 2013
QuickScript .NET (для Application Server)
Содержание
Работа с файлами
Примеры
Удаление файла:
System.IO.File.Delete("C:\temp\temp.xlsx");
Работа с MS Excel
SR30711946: How to maximize an excel application? Use WWControl()
SR19817850: указано много особенностей работы с Excel (https://wdnresource.wonderware.com/automation/csparea/SRDetail.aspx?id=19817850)
Для импортирования функций Excel и возможности работы с типами Excel._Application; Excel._Workbook; Excel._WorkSheet необходимо:
- Galaxy -> import -> Script Function Library файл: C:\Program Files (x86)\Microsoft Office\Office12\Excel.exe
Описание объектной модели
Самым "верхним" объектом в Excel является объект Application. Это объект приложение. И этот объект содержит ряд коллекций. Коллекция - это что-то вроде массива, только элементы в нее можно добавлять и удалять во время выполнения программы. Рабочие книги Excel входят в коллекцию Workbooks. Чтобы узнать количество открытых книг, используется метод Workbooks.Count.
Добавить новую книгу можно вызвав метод Workbooks.Add(). В качестве параметра этому методу можно передать имя шаблона, на основе которого будет создаваться новая книга. Чтобы открыть существующий файл Excel, вызывается метод Workbooks.Open("file.xls") - в результате будет открыт файл file.xls.
Закрыть книгу можно так: Workbooks(1).Close, или так: Workbooks("Книга1").Close, или закрыть все книги сразу: Workbooks.Close. Метод Close имеет ряд необязательных параметров. Вот они. expression.Close(SaveChanges, FileName, RouteWorkbook) Первый параметр SaveChanges имеет тип BOOL, если он равен TRUE, сделанные изменения сохранятся, если FALSE - то нет. Если параметр не задан, то при закрытии появляется диалоговое окно с вопросом о необходимости сохранения. Save changes ?
Доступ к книге можно получить по индексу и по имени книги. Имя книги - это имя файла, в котором она хранится. Fullname содержит полное имя, название файла и путь, а Name - только имя.
Примеры Application Server 3.5 + Microsoft Excel 2007
Перед этим импортировать библиотеку из excel.exe (см. выше)
LogMessage("1"); dim app as Microsoft.Office.Interop.Excel._Application; dim wb as Microsoft.Office.Interop.Excel._Workbook; dim ws as Microsoft.Office.Interop.Excel._WorkSheet; dim a1 as Microsoft.Office.Interop.Excel.Range; dim a2 as Microsoft.Office.Interop.Excel.Range; dim a3 as Microsoft.Office.Interop.Excel.Range; app = new Microsoft.Office.Interop.Excel.Application; wb = app.Workbooks.Add(); ws = wb.ActiveSheet; a1 = ws.Range("A1"); a2 = ws.Range("A2"); a3 = ws.Range("A3"); a1.Value2 = 1000; a2.Value2 = 2000; a3.Value2 = "=A1*A2"; LogMessage(a3.Value2); System.IO.File.Delete("C:\temp\temp.xlsx"); LogMessage("del file"); wb.SaveAs("C:\temp\temp.xlsx"); LogMessage("save file"); wb.Close(false); LogMessage("close file"); LogMessage("end main part"); System.Runtime.InteropServices.Marshal.ReleaseComObject(ws ); System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); app.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); System.GC.Collect(); System.GC.WaitForPendingFinalizers(); LogMessage("end");
Примеры из руководства AS3.6 файл: Scripting.pdf
Доработанный пример из руководства "Accessing an Excel Spreadsheet Using CreateObject" (AS3.6, файл: Scripting.pdf, стр. 111)
dim app as object; dim wb as object; dim ws as object; app = CreateObject("Excel.Application"); wb = app.Workbooks.Add(); ws = wb.ActiveSheet; ws.Range("A1").value = 20; ws.Range("A2").value = 30; ws.Range("A3").value = "=A1*A2"; LogMessage(ws.Range("A3").Value); wb.Close(false); LogMessage("end main part"); System.Runtime.InteropServices.Marshal.ReleaseComObject(ws ); System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); app.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); System.GC.Collect(); System.GC.WaitForPendingFinalizers(); LogMessage("end");
Для чего очистка ресурсов после выгрузки данных в Excel
Источник: http://www.sql.ru/forum/906372/dlya-chego-nuzhen-marshal-releasecomobject
Пример кода очистки:
appl.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(appl); worksheet = null; workbook = null; appl = null; System.GC.Collect();
- Т.е. предложенный способ очистки ресурсов - корректный?
- Не вполне. В конце после вызова System.GC.Collect() не хватает еще GC.WaitForPendingFinalizers().
- К чему приведет неиспользование данного метода?
- Попробуйте сгениерить через интероп экселевский документ эдак на 50 тысяч строк раз 10-20-30. И понаблюдайте за памятью. Достаточно обычная * Следует ли применять данный метод к объектам Range?
- Мало того, что к Range - это такой же com-объект, как и все прочие при работе через интероп. Желательно делать свои обертки для всех используемых объектов, и обертки эти делать с реализацией IDisposable, в которых Dispose будет освобождать память по подобному сценарию. Нужно это потому, что при работе с интероп сплошь и рядом имеет место быть неявное создание ссылок на com-объекты - например, вы получаете ссылку на Selection, и работаете с Selection.Range; при этом создается неявная ссылка на Selection.Range, которую GC не подбирает. Обертка, разумеется, ведет контроль за созданием подобных ссылок.
При использовании из AS3.5 без кода очистки не завершает процесс excel *32