Uitlezen excel (xls) c#

Status
Niet open voor verdere reacties.

heymmenneke

Nieuwe gebruiker
Lid geworden
30 mei 2011
Berichten
3
Hallo,
Ik ben bezig met het uitlezen van een excel sheet met behulp van c#. Nou heb ik dit allemaal mooi werkend, maar nog niet precies op de manier zoals ik het zou willen.

Ik krijg excel sheets aangeleverd met allemaal administratieve gegevens van producten. Deze sheets zijn automatische gegenereerd en de wijze daarvan kan ik niets aan doen.

Het probleem:
De excel bestanden bevatten altijd 1 sheet die volgens de zelfde wijze is opgebouwd, echter is er nooit een sheet naam ingegeven (dus links onder deze naam) en deze kan ik dus ook niet specifiek benaderen. Daardoor kan ik dus niks bij de from invullen.
Code:
string ExcelQuery = "Select datum from [sheetNaam$]";
Wanneer ik de excel handmatig open en de sheet een naam geef werkt mijn code gewoon, maar ik wil dat deze handeling niet nodig is. Heeft iemand hier een oplossing voor?
Voor de volledigheid hier een groter stuk van de code:
Code:
public int LeesDatum()
        {
            int datum = 0;
            try
            {
                string ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + DataFile + "; Extended Properties=\"Excel 8.0;HDR=YES;\"";
                OleDbConnection ExcelConnection = new OleDbConnection(ConnectionString);
                string ExcelQuery = "Select datum from [sheetNaam$]"; // from Sheet1
                OleDbCommand ExcelCommand = new OleDbCommand(ExcelQuery, ExcelConnection);
                ExcelConnection.Open();
                OleDbDataReader ExcelReader;
                ExcelReader = ExcelCommand.ExecuteReader();
                while (ExcelReader.Read())
                {
                    datum = Convert.ToInt32(ExcelReader.GetValue(0).ToString());
                }
                ExcelConnection.Close();
            }
            catch
            {
                System.Windows.Forms.MessageBox.Show("Het uitlezen van het bestand is mislukt.", "Uitlezen mislukt.");
            }
            return datum;
        }

Mijn dank alvast,
Tom
 
Zou je een klein voorbeeldje kunnen maken in Excel hoe de data eruit ziet die je moet ophalen? Dankje :)
 
Natuurlijk! Zie hier een voorbeeldje van wat ik aangeleverd krijg: Bekijk bijlage voorbeeld.xls

edit:
Ik heb ondertussen code toegevoegd die alle 'tabbellen' (sheets) ophaald, maar ook dit werkt niet wanneer de sheetnaam niet is ingegeven (dus gewoon zo heet als het document ook heet).
Code:
 dt = ExcelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string tab = dt.Rows[0]["TABLE_NAME"].ToString();
                string ExcelQuery = "Select datum from ["+tab+"]";

Totale code:
Code:
public int LeesDatum()
        {
            int datum= 0;
            try
            {
                DataTable dt = null;
                string ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + DataFile + "; Extended Properties=\"Excel 8.0;HDR=YES;\"";
                OleDbConnection ExcelConnection = new OleDbConnection(ConnectionString);
                ExcelConnection.Open();
                dt = ExcelConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                string tab = dt.Rows[0]["TABLE_NAME"].ToString();
                string ExcelQuery = "Select datum from ["+tab+"]"; 
                OleDbCommand ExcelCommand = new OleDbCommand(ExcelQuery, ExcelConnection);
                
                OleDbDataReader ExcelReader;
                ExcelReader = ExcelCommand.ExecuteReader();
                while (ExcelReader.Read())
                {
                    datum = Convert.ToInt32(ExcelReader.GetValue(0).ToString());
                }
                ExcelConnection.Close();
            }
            catch
            {
                System.Windows.Forms.MessageBox.Show("Het uitlezen van het bestand is mislukt.", "Uitlezen mislukt.");
            }
            return datum;
        }
 
Laatst bewerkt:
Probeer deze code eens :) Deze code haalt de datums op.

PHP:
            //Aanmaken
            Excel.Application xlApp;
            Excel.Workbook xlWorkBook;
            Excel.Worksheet xlWorkSheet;
            Excel.Range range;

            xlApp = new Excel.ApplicationClass();
            xlWorkBook = xlApp.Workbooks.Open(Application.StartupPath + "\\voorbeeld.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

            range = xlWorkSheet.UsedRange;
            string str;

            //Ophalen
            for (int a = 1; a <= range.Columns.Count; a++)
            {
                str = Convert.ToString((range.Cells[a, 1] as Excel.Range).Value2);
                if (str == string.Empty) break;
                MessageBox.Show(str);
            }

            //Sluiten en opschonen
            xlWorkBook.Close(false, null, null);
            xlApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
            xlApp = null;
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
            xlWorkBook = null;
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet);
            xlWorkSheet = null;
            System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
            range = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();

Het ReleaseComObject gedoe is om Excel weer af te laten sluiten, anders blijft deze draaien als proces.
En waarschijnlijk zul je een probleempje tegenkomen dat er heel veel objecten niet gevonden kunnen worden (in de code), dus voeg daarom bovenaan je code bij de 'usings' dit toe:

PHP:
using Excel = Microsoft.Office.Interop.Excel;

Daarna ga je naar je 'References' en klik je op 'Add Reference':

ejyOn.png


En selecteer dan in het '.NET' tabje 'Microsoft.Office.Interop.Excel' en druk op OK.

nmKSf.png


Succes :)
 
Laatst bewerkt:
Bedankt CaptainBri!

Met die code en een beetje google is het gelukt! Moest nog iets doen met de cultureinfo zie hier http://support.microsoft.com/kb/320369

Uiteindelijk werkende code:
PHP:
public int LeesDatum()
        {
            System.Threading.Thread thisThread = System.Threading.Thread.CurrentThread;
            System.Globalization.CultureInfo originalCulture = thisThread.CurrentCulture;
            int datum = 0;
            try
            {
                thisThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

                //Aanmaken
                Microsoft.Office.Interop.Excel.Application xlApp;
                Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
                Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
                Microsoft.Office.Interop.Excel.Range range;

                xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
                xlWorkBook = xlApp.Workbooks.Open(DataFile, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

                range = xlWorkSheet.UsedRange;
                string str;

                //Ophalen
                //for (int a = 1; a <= range.Columns.Count; a++)
                //{
                str = Convert.ToString((range.Cells[2, 1] as Microsoft.Office.Interop.Excel.Range).Value2);
                // if (str == string.Empty) break;
                MessageBox.Show(str);
                datum = Convert.ToInt32(str);
                // }

                //Sluiten en opschonen
                xlWorkBook.Close(false, null, null);
                xlApp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
                xlApp = null;
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkBook);
                xlWorkBook = null;
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkSheet);
                xlWorkSheet = null;
                System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
                range = null;
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
            finally
            {
                // Restore the culture information for the thread after the
                // Excel calls have completed.
                thisThread.CurrentCulture = originalCulture;
            }
            return datum;
        }

Nogmaals bedankt!

edit: heel klein foutje, bij je for loop moet columns.count natuurlijk rows.count zijn ;)
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan