Pokud potřebujeme spolupracovat s Office (Microsoft Office balík) aplikacemi v prostředí .NET, stačí nám nareferencovat příslušnou knihovnu, čímž si zpřístupníme metody z daného rozhraní. Já se v tomto článku soustředím pouze na aplikaci Excel, ale věřím, že s ostatními aplikacemi z balíku se bude pracovat naprosto stejným způsobem. Podle verze Office zvolíme COM referenci na danou knihovnu.
Co je COM objekt?
Component Object Model je způsob, kterým mohou komunikovat softwarové komponenty.
Jedná se o binární a síťový standard umožňující kterýmkoliv dvěma komponentám
komunikovat bez starostí, na kterém stroji právě běží (pokud jsou stroje propojeny),
pod jakým OS stroje pracují (pokud podporují COM) a v jakém jazyce jsou komponenty
napsány.
Jediný způsob, jak komunikovat s COM objekty je skrze rozhraní. Rozhraní pak
zpřístupňují sadu metod použitelnou pro práci s objektem. Rozhraní tvoří dohodu mezi
komponentou a klientem. Jinými slovy, rozhraní pouze nedefinuje, které funkce a
metody jsou použitelné, ale definuje také, co objekt dělá, když jsou dané metody
volány. Tato dohoda ale nevymezuje způsob implementace - COM objekt není nijak
omezen ve způsobu implementace metod rozhraní. Jediné, co musí dodržet, je, že už je
dnou dohodnuté rozhraní nelze změnit.
(zdroj: http://www.cs.vsb.cz/behalek/vyuka/pcsharp/text/ch10s01.html)
Pokud víme, pro jakou verzi Office aplikaci vyvíjíme, je jednoduché určit, jakou knihovnu nareferencovat. Značné množství problémů nastane, pokud chceme aplikaci nezávislou na verzi Office (což ve většině případů chtít určitě budeme). Tomuto tématu se budu věnovat v některém z dalších příspěvků.
Zatím jen odkaz na codeproject, kde řeší získání verze programově: http://www.codeproject.com/KB/office/getting_office_version.aspx
Zde je přehled knihoven pro specifické verze:
- Office 97: Microsoft Excel 8.0 Object Library
- Office 2000: Microsoft Excel 9.0 Object Library
- Office XP: Microsoft Excel 10.0 Object Library
- Office 2003: Microsoft Excel 11.0 Object Library
- Office 2007: Microsoft Excel 12.0 Object Library
using Microsoft.Office.Interop.Excel;
Teď už tedy máme vše připraveno.Nejdříve si vytvoříme objekt Excel aplikace, WorkBooku a WorkSheetu.
Microsoft.Office.Interop.Excel.Application excAplikace =
new Microsoft.Office.Interop.Excel.Application();
excAplikace.DisplayAlerts = false;
// vytvoříme nový WorkBook
_WorkBook excWorkBook = (_Workbook)(excAplikace.Workbooks.Add(Missing.Value));
// Vybereme aktivní WorkSheet
_Worksheet excSesit = (_Worksheet)excWorkBook.ActiveSheet;
Vlastnost aplikace DisplayAlerts si vypneme. Tím zamezíme tomu, aby aplikace požadovala odezvu od uživatele a bude tedy provádět vše automaticky s tím, že ve chvíli potřebné odezvy od uživatele vybere defaultní volbu. To poznáme v případě, že budeme ukládat změny pomocí SaveAs. Pokud bychom přepisovali soubor, automaticky vybere volbu Yes - Rewrite File.
Data můžeme zadávat buď buňku po buňce, což stačí v případě malého množství dat různě rozházených. Pokud máme například data v DataTable, jednoduše je uložíme do pole a uložíme v celku. Tento způsob je efektivnější.
excSesit.Cells[4, 1] = "Datum:";
excSesit.Cells[4, 2] = dtmDatumACas.Day.ToString() +
"." + dtmDatumACas.Month.ToString() + "." + dtmDatumACas.Year.ToString();
excSesit.Cells[5, 1] = "Čas:";
excSesit.Cells[5, 2] = dtmDatumACas.Hour.ToString() +
":" + dtmDatumACas.Minute.ToString();
excSesit.Cells[6, 1] = "Typ operace:";
excSesit.Cells[6, 2] = typOperace;
excSesit.Cells[7, 1] = "Čidlo:";
excSesit.Cells[7, 2] = typCidla.ToString();
excSesit.Cells[9, 1] = "Data:";
excSesit.Cells[11, 1] = "Datum a čas";
excSesit.Cells[11, 2] = "Teplota";
Takto jsme přistupovali ke konkrétní buňce. Teď si ukážeme, jak uložit celou tabulku (Předpokládáme, že máme tabulku dtData se dvěma sloupci)
cesta - cesta, kam uložit soubor na disk.
jediny argument s hodnotou false - CreateBackup - nechceme pri ukladani vytvaret zalohovy soubor, jinak zvolit true.
// Buňka v levém horním rohu regionu
Range c1 = (Range)excSesit.Cells[12, 1];
// Buňka v pravém dolním rohu regionu
Range c2 = (Range)excSesit.Cells[12 + dtData.Rows.Count - 1, 2];
// vymezení regionu tak, aby se do něj vlezla celá tabulka
Range excRegion = excSesit.get_Range(c1, c2);
// tabulku si převedeme do 2-rozměrného pole
object[,] poleDat = new object[dtData.Rows.Count, 2];
for (int i = 0; i <>
{
poleDat[i, 0] = dtData.Rows[i][1].ToString();
poleDat[i, 1] = dtData.Rows[i][2].ToString();
}
Pokud potřebujeme například formátovat více buňek současně, vybereme si celý region.// nastavení region A1-E1 na tučné písmo
excSesit.get_Range("A1", "E1").Font.Bold = true;
// výběr regionu A4-B7
Microsoft.Office.Interop.Excel.Range rg =
excSesit.get_Range("A4:B7", Missing.Value);
// sloupce A a B přizpůsobí šířku obsahu
rg.EntireColumn.AutoFit();
// orámování regionu
rg.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThick,
XlColorIndex.xlColorIndexAutomatic,Missing.Value);
Změny v sešitu musíme uložit:cesta - cesta, kam uložit soubor na disk.
jediny argument s hodnotou false - CreateBackup - nechceme pri ukladani vytvaret zalohovy soubor, jinak zvolit true.
excSesit.SaveAs(cesta, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
false, Missing.Value, Missing.Value,
Missing.Value, Missing.Value);
Nesmíme zapomenout zavřit workBook i aplikaci a všechny vytvořené objekty uvolnit.
Velice často totiž zůstane v Task Manageru "viset" spousta excel.exe procesů.
Velice často totiž zůstane v Task Manageru "viset" spousta excel.exe procesů.
excWorkBook.Close(false, Missing.Value, Missing.Value);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excWorkBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excSesit);
if (excAplikace != null)
{
excAplikace.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excAplikace);
}
GC.Collect(2);
GC.WaitForPendingFinalizers();
GC.Collect(2);
Žádné komentáře:
Okomentovat