A jedeme dál ...
Človíčkův Weblog aneb Michal Horák bloguje

Čtení dat z Excelu pomocí .NET C#

 | 22.11.2007

Jestliže potřebujete číst data uložená v tabulkách Excelu, pak mám pro vás jednoduchý prográmek v jazyku C#, který toto umí. Samozřejmě, že si jej můžete libovolně upravit podle svých potřeb.

using System;
using System.Collections.Generic;
using System.Text;

/* 
 * Michal Horák http://weblog.clovicek.net 2007
 * 
 * Pro načtení a změnu excelovsakého souboru je
 * potřeba přidat do referencí com Microsoft
 * Excel Object Library, nejlépe tu nejvyšší verzi
 */
namespace readExcel2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Cesta k souboru
            string Path = AppDomain.CurrentDomain.BaseDirectory
                + "List.xls";

            // Vytvoří Aplikační třídu pro práci se souborem
            Excel.ApplicationClass app = new Excel.ApplicationClass();

            /* Otevře soubor, co se týče těch atributů funkce
             * open, tak nemám ponětí co se tam má psát,
             * našel jsem to na netu
             */
 
            Excel.Workbook workBook
                = app.Workbooks.Open(Path, 0, true,
                                     5, "", "", true,
                                     Excel.XlPlatform.xlWindows,
                                     "\t", false, false, 0, true, 1, 0);
            
            // Pracujeme s prvním listem
            Excel.Worksheet workSheet = (Excel.Worksheet)workBook.Sheets[1];
            
            
            int index = 0; //index radku
            int index2 = 2; //index sloupce

            object rIndex = 1; // zacneme na radku 1
            object cIndex = 1; //sloupci 1
            object ColFirst = 1; //sloupci 1
            
            try
            {
                //dokud je neco na radku rIndex a prvnim sloupci
                while (((Excel.Range)workSheet.Cells[rIndex, cIndex]).Value2 != null)
                {
                    rIndex = 1 + index; //pricti radek
                    // dokud je neco na radku rIndex a sloupci ColFirst
                    while (((Excel.Range)workSheet.Cells[rIndex, ColFirst]).Value2 != null)
                    {
                        string retez = ((Excel.Range)workSheet.Cells[rIndex, ColFirst]).Value2.ToString();
                        Console.Write("{0},\t", retez); //vypis políčko [rIndex,ColFirst]
                        ColFirst = index2; //pricti sloupec
                        index2++;
                    }
                    Console.WriteLine();
                    if (index == 0)
                    {
                        Console.WriteLine("-----------------------------------------------");
                    }

                    ColFirst = 1; //nastav sloupec na zacatek
                    index2 = 2;    
                    index++;
                }
            }
            catch (Exception e)
            {
                app.Quit();
                Console.WriteLine(e.Message);
            }
            Console.ReadLine();
        }
    }
}

Příspěvek vyšel ve Čtvrtek 22.11.2007 18:40 v kategorii Programování a byl 11124x zobrazen. Pokud se vám líbil můžete si jej zalinkovat: Linkuj.cz, Del.icio.us

Reklama:

Komentáře


[1] Jarda Jirava | 23.11.2007 14:43

Gravatar pro Jarda Jirava Ahoj, měl bych jenom pár doporučení, když už se vrháš na to komunikovat s Excelem přes COM rozhraní.
Každý objekt, který je vytvořen by měl být i zrušen, takto to zní jako klišé, ale může se stát a stává se, že pak Excel nejde uzavřít, resp. se neuvolní z paměti. Nejedná se jen o samotnou třídu Excel.ApplicationClass ale i o jednotlivé objekty, které jsou v dané kolekci Excel.Workbook a Worksheet atd.
V neposlední řadě to je pak ukončení samotné aplikace Excelu, které je provedeno jen v části catch, tudíž pouze ve chvíli, kdy dojde k chybě, jinak se aplikace neukončí. Což opět může mít za následek ponechání aplikace v paměti a nepříjemnosti, které se nemusí projevit ihned. Tato část by měla patřit spíše do bloku finally.

Ještě doplním, že pokud je třeba jen číst data z Excelu, asi lepší přístup je pomocí OleDb, kde není nutné provádět volání přes interop knihovny.

Díky
-- J.

PS: pěkný blog, jsem rád, že jsem na něj natrefil

[2] Človíček | 23.11.2007 20:22

Gravatar pro Človíček Díky za připomínky, s tím ukončením aplikace je to samozřejmě pravda, když jsem přidával try catch, tak jsem si to neuvědomil.

Kromě čtení přibude bude i zápis, tohle jsou moje první pokusy s čtením dat z Excelu ve výsledku toho bude umět program více.

[3] mr.shaolin | 29.11.2007 14:26

Mne prijde hlavne peknej hnus, ze tady mas vpodstate zkopirovany kod z:
http://www.codeproject.com/useritems/Excel_Application_in_C_.asp

[4] Človíček | 29.11.2007 15:56

Gravatar pro Človíček mr.shaolin: Musím přiznat, že jsem se jedním kódem inspiroval, ale ten byl na nějakém fóru, no a je vidět, kde jej tam vzali

[5] Tomáš Gurányi | 4.2.2008 06:52

Gravatar pro Tomáš Gurányi Ahoj, příspěvěk je pěkný. Chtěl jsem se zeptat, jestli ještě přibude nějaký vzor zápis do excelu?

[6] Martin Finda | 5.5.2008 12:39

Gravatar pro Martin Finda byl to fajn priklad, jen jsem narzil na problem, ze mam anglicky office, tak to na me pokrikovalo:
COMException (0x80028018): Old format or invalid type library
reseni jsem nasel tady:
http://www.add-in-express.com/forum/read.php?FID=5&TID=2911
upravene to vypada takhle (programatorum C# se omlouvam, je to v C++):
#include "stdafx.h"

using namespace System;

public ref class ExcelUILanguageHelper : public System::IDisposable
{
public:
/*static*/ System::Globalization::CultureInfo^ m_CurrentCulture;

public:
ExcelUILanguageHelper()
{
// save current culture and set culture to en-US
m_CurrentCulture = System::Threading::Thread::CurrentThread->CurrentCulture;
System::Threading::Thread::CurrentThread->CurrentCulture = gcnew System::Globalization::CultureInfo("en-US");
}

#pragma region IDisposable Members

public:
~ExcelUILanguageHelper()
{
// return to normal culture
System::Threading::Thread::CurrentThread->CurrentCulture = m_CurrentCulture;
};

#pragma endregion
};

int main(array<System::String ^> ^args)
{
ExcelUILanguageHelper cnv_rg;
Excel::ApplicationClass^ xls_doc = gcnew Excel::ApplicationClass;
Excel::Workbooks^ xls_books = xls_doc ->Workbooks;
Excel::Workbook^ xls_book = xls_books ->Open( ( System::String^ ) L"C:\ThisExcelWorkbook.xls", 0, true, 5, "", "", true, Excel::XlPlatform::xlWindows, "t", false, false, 0, true );
Excel::Worksheet^ work_sheet = ( Excel::Worksheet^ )( xls_book ->Sheets[1] );
Excel::Range^ cels_range = ( Excel::Range^ ) ( work_sheet ->Cells[ 1 , 1 ] );
System::String^ pos_value = ( cels_range ->Value2 ) ->ToString();
Console::WriteLine(pos_value);
Console::WriteLine(L"Hello World");
Console::ReadLine();
return 0;
}

[7] Martin Finda | 6.5.2008 11:09

Gravatar pro Martin Finda mimochodem docela husty sample k cteni z excelu je i primo v dokumentci:
ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.en/dv_fxsamples/local/sampleexecutables/Technologies/Interop/Applications/Office/Excel.zip
je to nejen v C++ ale i pro C# a VB

[8] Martin Finda | 6.5.2008 12:38

Gravatar pro Martin Finda tenhle sample je i na webu:
http://download.microsoft.com/download/4/7/B/47B2164C-E780-4B10-8DE4-2CB5B886E0A6/Technologies/Interop/Applications/Office/Excel.zip.exe

[9] Jirka | 29.9.2008 14:54

Gravatar pro Jirka Ahoj, chci se zeptat, jak to je s distribucí knihoven potřebných pro práci s excelem. Kdybych udělal program, který je využívá, musím tyto knihovny šířit zároveň s ním, nebo musí být dostupné na uživatelském počítači? Případně, jak poznám, zda jsou dostupné? Děkuji

Přidejte svůj komentář

Přidej komentář

Tipy na přečtení

Kategorie

Vyhledávání

Odkazy

Fotoblog

Poslední fotgrafie z fotoblogu

Nejčtenější příspěvky za poslední týden

Poslední příspěvky

"A jedeme dál ..." Človíčkův Weblog aneb Michal Horák bloguje. (c) Michal Horák (Človíček webdesign) 2006