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
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
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.
Mne prijde hlavne peknej hnus, ze tady mas vpodstate zkopirovany kod z:
http://www.codeproject.com/useritems/Excel_Application_in_C_.asp
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
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?
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
{
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;
}
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
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
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
"A jedeme dál ..." Človíčkův Weblog aneb Michal Horák bloguje. (c) Michal Horák (Človíček webdesign) 2006