using System;
 using System.Drawing;
 using System.Globalization;
 using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Windows.Forms;
  
 using Excel = Microsoft.Office.Interop.Excel;
  
 namespace SaturnRep
 {
 public class RepExcel : IDisposable
 {
 public Excel.Application excelapp;
 Excel.Workbooks excelappworkbooks;
 Excel.Workbook excelappworkbook;
 private Excel.Sheets excelsheets; // лист в екселе
 private Excel.Worksheet excelworksheet; // ячейка
 private Excel.Range excelcells; // диапазон ячеек
  
 // Конструктор
 public RepExcel()
 {
 excelapp = new Excel.Application();
 excelapp.Visible = false;
 }
  
 // Деструктор
 public void Dispose()
 {
 // Release COM objects (very important!)
 if (excelapp != null)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(excelapp);
  
 if (excelappworkbooks != null)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(excelappworkbooks);
  
 if (excelappworkbook != null)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(excelappworkbook);
 if (excelsheets != null)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(excelsheets);
 if (excelworksheet != null)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(excelworksheet);
 if (excelcells != null)
 System.Runtime.InteropServices.Marshal.ReleaseComObject(excelcells);
  
 excelapp = null;
 excelappworkbooks = null;
 excelappworkbook = null;
 excelsheets = null;
 excelworksheet = null;
 excelcells = null;
 GC.Collect();
  
 ClassReportLog.error("RepExcel", "Dispose OK", 3, true );
 // GC.GetTotalMemory(true);
 }
  
  
 //************************************************************************************************************************************************
 // Coхранение книги с заданным именем
  
 public void CreateNewBook(string fullPathAndFilename)
 {
 try
 {
 excelapp.SheetsInNewWorkbook = 5;
 excelapp.Workbooks.Add(Type.Missing);
 excelapp.DisplayAlerts = false;
 //Получаем набор ссылок на объекты Workbook (на созданные книги)
 excelappworkbooks = excelapp.Workbooks;
 //Получаем ссылку на книгу 1 - нумерация от 1
 excelappworkbook = excelappworkbooks[1];
  
 excelsheets = excelappworkbook.Worksheets;
 //Получаем ссылку на лист 1
 excelworksheet = (Excel.Worksheet)excelsheets.get_Item(1);
 excelworksheet.Name = "Saturn Data";
  
 excelappworkbook.Saved = true;
 excelappworkbook.SaveAs(fullPathAndFilename, Excel.XlFileFormat.xlExcel7, //object FileFormat
 Type.Missing, //object Password
 Type.Missing, //object WriteResPassword
 Type.Missing, //object ReadOnlyRecommended
 Type.Missing, //object CreateBackup
 Excel.XlSaveAsAccessMode.xlNoChange,//XlSaveAsAccessMode AccessMode
 Type.Missing, //object ConflictResolution
 Type.Missing, //object AddToMru
 Type.Missing, //object TextCodepage
 Type.Missing, //object TextVisualLayout
 Type.Missing);
  
 excelapp.Workbooks.Close();
 excelapp.Quit();
 ClassReportLog.info("CreateNewBook " + fullPathAndFilename, "OK", 3, true);
 }
 catch (Exception ex)
 {
 ClassReportLog.error("CreateNewBook " + fullPathAndFilename, ex.Message, 3, true);
 excelapp.Quit();
 Dispose();
  
 }
  
 }
 public void OpenBook(string fullPathAndFilename)
 {
 try
 {
  
 excelapp.Workbooks.Open(fullPathAndFilename,
 Type.Missing, false, Type.Missing, Type.Missing,
 Type.Missing, Type.Missing, Type.Missing, Type.Missing,
 Type.Missing, Type.Missing, Type.Missing, Type.Missing,
 Type.Missing, Type.Missing);
 ClassReportLog.info( "OpenBook " + fullPathAndFilename, "OK",3,true);
  
 }
 catch(Exception ex) { ClassReportLog.error( "OpenBook", ex.Message,3, true);}
  
 }
 public void CloseBook()
 {
 try
 {
 excelapp.Workbooks.Close();
 excelapp.Quit();
 ClassReportLog.error( "CloseBook", "OK", 3, true);
 }
 catch (Exception ex)
 {
 ClassReportLog.error("CloseBook", ex.Message, 3, true);
 }
 }
 public void Save(string fullPathAndFilename)
 {
 try
 {
 excelappworkbooks = excelapp.Workbooks;
 //Получаем ссылку на книгу 1 - нумерация от 1
 excelappworkbook = excelappworkbooks[1];
  
 excelappworkbook.Saved = false;
 excelappworkbook.Save(); /*As(fullPathAndFilename, Excel.XlFileFormat.xlExcel8, //object FileFormat
 Type.Missing, //object Password
 Type.Missing, //object WriteResPassword
 false, //object ReadOnlyRecommended
 Type.Missing, //object CreateBackup
 Excel.XlSaveAsAccessMode.xlNoChange,//XlSaveAsAccessMode AccessMode
 Type.Missing, //object ConflictResolution
 Type.Missing, //object AddToMru
 Type.Missing, //object TextCodepage
 Type.Missing, //object TextVisualLayout
 Type.Missing);
 * */
 }
 catch(Exception ex) {
 ClassReportLog.error("Save", ex.Message, 3, true);
 // MessageBox.Show("Возникла проблема при сохранении файла. " + ex.Message);
 }
 }
  
  
 public void SaveAs(string fullPathAndFilename)
 {
 try
 {
 excelappworkbooks = excelapp.Workbooks;
 //Получаем ссылку на книгу 1 - нумерация от 1
 excelappworkbook = excelappworkbooks[1];
  
 excelappworkbook.Saved = true;
  
 excelappworkbook.SaveAs(fullPathAndFilename, Excel.XlFileFormat.xlExcel7, //object FileFormat
 Type.Missing, //object Password
 Type.Missing, //object WriteResPassword
 false, //object ReadOnlyRecommended
 Type.Missing, //object CreateBackup
 Excel.XlSaveAsAccessMode.xlNoChange,//XlSaveAsAccessMode AccessMode
 Type.Missing, //object ConflictResolution
 Type.Missing, //object AddToMru
 Type.Missing, //object TextCodepage
 Type.Missing, //object TextVisualLayout
 Type.Missing);
 ClassReportLog.info("SaveAs " + fullPathAndFilename, "OK", 3, true);
 }
 catch(Exception ex)
 {
 ClassReportLog.error("SaveAs " + fullPathAndFilename, ex.Message, 3, true);
 // MessageBox.Show("Возникла проблема при сохранении файла. " + ex.Message);
 }
  
 }
  
  
 public void SetValue(string pageName, string address, string StrValues, string typeValue, bool isBold = false) // "A10", "значение"
 {
  
 excelappworkbooks = excelapp.Workbooks;
 //Получаем ссылку на книгу 1 - нумерация от 1
 excelappworkbook = excelappworkbooks[1];
 excelsheets = excelappworkbook.Worksheets;
  
 try
 {
 excelworksheet = (Excel.Worksheet)excelsheets[pageName];
 //MessageBox.Show("Страница найдена");
 }
 catch(Exception ex) {
 ClassReportLog.error("SetValue page - " + pageName + " address - " + address + " Value - " + StrValues, ex.Message, 3, true);
 // MessageBox.Show("Страница не найдена");
 excelsheets.Add();
 excelworksheet = (Excel.Worksheet)excelsheets.get_Item(excelsheets.Count);
 excelworksheet.Name = pageName;
  
 }
 try
 {
 excelcells = excelworksheet.get_Range(address, address);
 if (typeValue == "double") excelcells.Value2 = Convert.ToDouble(StrValues, CultureInfo.GetCultureInfo("en-US").NumberFormat); //Convert.ToDouble(StrValues);
 if (typeValue == "string") excelcells.Value2 = StrValues;
 if (isBold) excelcells.EntireRow.Font.Bold = true;
 ClassReportLog.info("SetValue page - " + pageName + " address - " + address + " Value - " + StrValues, " OK",3, true);
 }
 catch (Exception ex)
 {
 ClassReportLog.error("SetValue page - " + pageName + " address - " + address + " Value - " + StrValues, ex.Message, 3, true);
 }
 }
  
 public string GetValue(string pageName, string address)
 {
 excelappworkbooks = excelapp.Workbooks;
 //Получаем ссылку на книгу 1 - нумерация от 1
 excelappworkbook = excelappworkbooks[1];
 excelsheets = excelappworkbook.Worksheets;
 excelworksheet = (Excel.Worksheet)excelsheets[pageName];
 excelcells = excelworksheet.get_Range(address, address);
 return Convert.ToString(excelcells.Value2);
 }
  
 public void HidenRow(string pageName, int indexRow)
 {
 excelappworkbooks = excelapp.Workbooks;
 //Получаем ссылку на книгу 1 - нумерация от 1
 excelappworkbook = excelappworkbooks[1];
 excelsheets = excelappworkbook.Worksheets;
 //Получаем ссылку на лист
 excelworksheet = (Excel.Worksheet)excelsheets[pageName];
  
 excelworksheet.Range["A"+Convert.ToString(indexRow),"A"+Convert.ToString(indexRow)].Rows.Hidden = true;
 }
  
 public void DisplayLine(string pageName, int indexRow)
 {
 excelappworkbooks = excelapp.Workbooks;
 //Получаем ссылку на книгу 1 - нумерация от 1
 excelappworkbook = excelappworkbooks[1];
 excelsheets = excelappworkbook.Worksheets;
 //Получаем ссылку на лист
 excelworksheet = (Excel.Worksheet)excelsheets[pageName];
 excelworksheet.Range["A" + Convert.ToString(indexRow), "A" + Convert.ToString(indexRow)].Rows.Hidden = false;
 }
 }
 }
  
  
					Питання для самоконтролю
					1. Опишіть принципи запуску Excel із проектів Delphi
 2. Опишіть принципи створення книги Excel на основі шаблону.
 3. Опишіть принципи збереження і відкриття книг Excel в проектах Delphi.
 4. Опишіть принципи закриття книг Excel та закриття програми Excel в проектах Delphi.
 5. Опишіть принцип роботи з аркушами Microsoft Excel. Приклад.
 6. Яка команда дозволяє замінити старий текст на аркуші Excel на новий текст? Приклад.
 7. Які властивості й методи гнізд ви знаєте для роботи з діапазоном гнізд Excel?
 8. Яка властивість дозволяє вводити у чарунку аркуша Excel текст формули? Приклад.
 9. Які особливості треба враховувати при введенні формули в чарунку Excel при створенні програм в Delphi?
 10. Які властивості використовуються для форматування гнізд на аркуші Excel при створенні програм в Delphi?
  
 
  
  
 Лекція №17
 Тема: Документування програмних продуктів. Розробка систем допомоги та підказок у програмах.
 Мета: Придбати знання у строренні довідникових систем при розробці програмного забезпечення.
 Перелік питань, що розглядаються на лекції:
 1. Види довідкових систем
 2. Формати довідників
 3. Створення довідки у форматі HTML Help
 4. Створення контекстної довідки
 5. Інтеграція довідкового файлу в додаток