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 46030x zobrazen. Pokud se vám líbil můžete si jej zalinkovat: Linkuj.cz, Del.icio.us

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 ^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

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