středa 21. října 2009

.NET a C#: Vytvoření excel grafu programově

V jednom z předchozích příspěvků jsme programově vytvořili excel soubor, do kterého jsme uložili nějaká data. Dnes na základě těchto dat vytvoříme graf. Budeme předpokládat, že máme dva sloupce. V prvním sloupci je datum a čas naměřených hodnot z druhého sloupce. Naměřené hodnoty jsou například údaje o teplotě.
Microsoft.Office.Interop.Excel.Application excAplikace =
new Microsoft.Office.Interop.Excel.Application();

excAplikace.DisplayAlerts = false;
_Workbook excWorkBook = excAplikace.Workbooks.Open(
cestaKSouboru, // FileName
0, // UpdateLinks
false, // ReadOnly

Missing.Value, // Format
Missing.Value, // Password
Missing.Value, // WriteResPassword
true, // IgnoreReadOnlyRecommended
Missing.Value, // Origin
Missing.Value, // Delimiter
Missing.Value, // Editable
false, // Notify
Missing.Value, // Converter
false, // AddToMru
Missing.Value, // Local
Missing.Value);// CorruptLoad

_Worksheet excSesit = (_Worksheet)excWorkBook.ActiveSheet;
Máme tedy sešit s daty. Ještě se zastavím u popisu metody Workbook.Open:
  • FileName - úplná cesta k excel souboru
  • UpdateLinks - Volitelný parametr. Popravdě nevím, co to jsou links in file, takže jen přeložím, co píšou v msdn: Specifikuje způsob, jakým jsou spojení v souboru updatovány. Pokud je argument vynechán, bude uživatel dotázán na způsob updatování. Jinak argument nabývá jedné z následujících hodnot:
1 - Uživatel specifikuje způsob updatování
2 - Nikdy neprovádět update pro tento WorkBook při otevírání
3 - Vždy updatovat pro tento WorkBook při otevírání
  • ReadOnly -Volitelný parametr. True pro otevření WorkBooku v režimu jen pro čtení
  • Format - Volitelný parametr. Pokud Microsoft Excel otevírá textový sobor, tento argument specifikuje oddělovací znak. Může nabývat těchto hodnot:
1 - Taby
2 - Pomlčky
3 - Mezery
4 - Středníky
5 - Nic
6 - Volitelný znak
  • Password - Volitelný argument. Řetězec s heslem, které je vyžadováno k otevření chráněného WorkBooku. Pokud je argument vynechán a heslo je vyžadováno, bude uživatel vyzván k zadání hesla.
  • WriteResPassword - Volitelný argument. Řetězec s heslem, které je vyžadováno k otevření WorkBooku, který je chráněn proti zápisu (bez hesla jej lze ale číst).
  • IgnoreReadOnlyRecommended - Volitelný argument. True, pokud nechceme zobrazit zprávu, že je doporučován režim pouze pro čtení (pokud byl WorkBook uložen s možností Read-Only Recommended)
  • Origin - Volitelný argument. Pokud se jedná o textový soubor, indikuje, kde byl vytvořen. Může se jednat o jednu z následujících XlPlatform konstatnt: xlMacintosh, xlWindows nebo xlMSDOS. Pokud je argument vynechán, je použit operační systém, pod kterým se právě vykonává kód.
  • Delimiter - Volitelný argument. Pokud se jedná o textový soubor a argument Format má hodnotu 6 (viz. výše), tento argument specifikuje řetězec, který se použije jako dělící znak. je použit pouze první znak z řetězce.
  • Editable - Volitelný argument. Pokud je soubor Microsoft Excel 4.0 add-in, pak při hodnotě true, pak je add-in otevřen ve viditelném okně. Pokud je argument false nebo vynechán, je add-in otevřen jako skrytý a nelze jej dodatečně zobrazit. Tato volba se nevztahuje na add-in vytvořený v Microsoft Excelu 5.0 a vyšším. Pokud je soubor Excel šablona, použijte true, pro otevření šablony pro editování. False pro otevření nového WorkBooku založeného na šabloně. Defaultní hodnota je false.
  • Notify - Volitelný argument. Pokud nemůže být soubor otevřen v režimu pro zápis nebo čtení, tento argument je true, pokud chceme přidat soubor do seznamu upozornění. Excel otevře soubor pouze pro čtení a dá uživateli vědět ve chvíli, kdy je soubor dostupný.
  • Converter - Volitelný argument. Index na první převaděč souborů (file convertor), který se má použít při otevírání souboru. Zvolený převaděč se vyzkouší jako první.
  • AddToMru - Volitelný argument. True, pokud chceme přidat WorkBook do seznamu naposled otevřených souborů. Defaultní hodnota je false.
  • Local - Volitelný argument. True, pokud chceme uložit soubor s jazykem Microsoft Excelu. False (default) uloží soubor s jazykem Visual Basic for Application.
  • CorruptLoad - Volitelný argument. Může být jedna z následujících konstant: xlNormalLoad, xlRepairFile a xlExtractData. Klasické chování, pokud je argument vynechán, je následující: Excel se pokusí otevřít soubor klasickým způsobem. Při nezdaru se pokusí opravit soubor. Pokud i to neuspěje, dalším pokusem je získání dat ze souboru.
Zde je odkaz do msdn, kde je originální znění dokumentace.

Vytvoříme si objekt grafu:

_Chart excGraf = (Chart)excWorkBook.Charts.Add(
Missing.Value,
Missing.Value,
Missing.Value,
Missing.Value);

excGraf.ChartType = XlChartType.xlLineMarkers; // spojnicový graf se značkami
Vytvoříme sadu dat:
Series excSadaDat = ((SeriesCollection)excGraf.SeriesCollection(Missing.Value)).NewSeries();
// hodnoty na ose X - objekt typu Range
series.XValues = excOblastDatX;
// hodnoty na ose Y
series.Values = excOblastDatY;
Kde oblastDatX a oblastDatY získáme pomocí metody excSesit.get_range(object, object).
Jako první argument zadáme horní buňku rozsahu a jako druhý argument zadáme poslední spodní buňku rozsahu (např. excSesit.Cells[1, 1]).

Nastavíme vlastnosti grafu. POZOR, tyto vlastnosti nastavovat až po specifikování rozsahu dat, jinak skončí chybou.
excGraf.HasLegend = false;                // nechceme legendu
excGraf.HasTitle = true; // chceme popisek grafu
excGraf.ChartTitle.Text = "Popis grafu"; // text popisku
excGraf.Location(XlChartLocation.xlLocationAsObject, excSesit.Name); // umístění grafu k datům
Nastavíme vlastnosti osy X a osy Y:
Axis excOsaX = (Axis)excGraf.Axes(XlAxisType.xlCategory, XlAxisGroup.xlPrimary);
excOsaX.CategoryType = XlCategoryType.xlCategoryScale; // důležité, pokud máme DateTime data
excOsaX.HasTitle = true;
excOsaX.AxisTitle.Text = "Datum a cas mereni";
excOsaX.HasMajorGridlines = true;
excOsaX.HasMinorGridlines = false;

Axis excOsaY = (Axis)excGraf.Axes(XlAxisType.xlValue, XlAxisGroup.xlPrimary);
excOsaY.HasTitle = true;
excOsaY.AxisTitle.Text = "Teplota";
excOsaY.HasMajorGridlines = true;
excOsaY.HasMinorGridlines = false;
Uložíme změny:
excSesit.SaveAs(cestaKSouboru, Missing.Value, Missing.Value, Missing.Value,
Missing.Value, false, false, Missing.Value, Missing.Value, Missing.Value);

Výsledný graf pak bude vypadat zhruba takto:




Žádné komentáře:

Okomentovat