Hallo,
ich bin gerade dabei eine Excel-Datein mit C# zu öffnen und an bestimmten punkten auszulesen.
Mein problem ist nun das mein einlesen bis zu 12 Sec dauert Oo was für mich sehr lang ist.
Dazu muss ich sagen, das Dok. besteht aus mehreren seiten (12) und jede hat ein ungefähren gleichen aufbau, dabei variieren die Zeile nur sehr gering.
Nun zu meiner Frage, kennt jm. eine schneller Methode oder sogar was viel besseres was ich jetzt durchs googeln nicht gefunden habe?
- Zum Managen meiner Excel-Datei
Spoiler anzeigen
-- Mein eigentliches Programm
Spoiler anzeigen
ich bin gerade dabei eine Excel-Datein mit C# zu öffnen und an bestimmten punkten auszulesen.
Mein problem ist nun das mein einlesen bis zu 12 Sec dauert Oo was für mich sehr lang ist.
Dazu muss ich sagen, das Dok. besteht aus mehreren seiten (12) und jede hat ein ungefähren gleichen aufbau, dabei variieren die Zeile nur sehr gering.
Nun zu meiner Frage, kennt jm. eine schneller Methode oder sogar was viel besseres was ich jetzt durchs googeln nicht gefunden habe?
- Zum Managen meiner Excel-Datei
C#-Quellcode
- using Microsoft.Office.Interop.Excel;
- using System;
- namespace ArbeitssnachweisManager
- {
- public class Excel
- {
- private _Application _excel;
- private Workbook _workbook;
- public int PageCount { get => _workbook.Worksheets.Count; }
- public Worksheet this[int sheetIndex] => _workbook.Worksheets[sheetIndex + 1];
- public Worksheet this[string sheetName] => _workbook.Worksheets[sheetName];
- public Excel this[Worksheet sheet, int row, int col, string content] { set => WriteCell(sheet, row, col, content); }
- public string this[Worksheet sheet, int row, int col] { get => ReadCell(sheet, row, col); }
- public Excel(string path)
- {
- _excel = new Application();
- _workbook = _excel.Workbooks.Open(path);
- }
- public Worksheet GetPage(int sheetIndex) => _workbook.Worksheets[sheetIndex];
- public Worksheet GetPage(string sheetName) => _workbook.Worksheets[sheetName];
- public string ReadCell(int sheetIndex, int row, int col) => ReadCell(this[sheetIndex], row, col);
- public string ReadCell(Worksheet sheet, int row, int col)
- {
- Range r = sheet.Cells[row + 1, col + 1];
- return (r.Value2 ?? string.Empty).ToString();
- }
- public void WriteCell(int sheetIndex, int row, int col, string content) => WriteCell(this[sheetIndex], row, col, content);
- public void WriteCell(Worksheet sheet, int row, int col, string content) => sheet.Cells[row + 1, col + 1] = content;
- public int GetColumnsCount(int sheetIndex) => GetColumnsCount(this[sheetIndex + 1]);
- public int GetColumnsCount(string sheetName) => GetColumnsCount(this[sheetName]);
- public int GetColumnsCount(Worksheet sheet) => sheet.UsedRange.Columns.Count;
- public int GetRowsCount(int sheetIndex) => GetRowsCount(this[sheetIndex + 1]);
- public int GetRowsCount(string sheetName) => GetRowsCount(this[sheetName]);
- public int GetRowsCount(Worksheet sheet) => sheet.UsedRange.Rows.Count;
- public void Save(bool save = true)
- {
- _workbook.Close(save, Type.Missing, Type.Missing);
- }
- public void Close(bool save = true)
- {
- Save();
- _excel.Quit();
- }
- }
- }
-- Mein eigentliches Programm
C#-Quellcode
- private unsafe void MainForm_Shown(object sender, EventArgs e)
- {
- DateTime date = DateTime.Now; //Später relevant
- DirectoryInfo assetsFolder = new DirectoryInfo("assets"); //ordner in der die Datei liegen soll
- FileInfo[] assetsFiles = assetsFolder.GetFiles(); //Lesen aller datei
- for (int i = 0, n = assetsFiles.Length; i < n; i++) // Druchlaufen aller datein und nach meiner Datei suchen für Dynamischen Name
- {
- FileInfo selectFile = assetsFiles[i];
- if (selectFile.Extension == ".xls") //endung nach der ich suche identisch
- {
- Excel selectExcel = new Excel(selectFile.FullName);
- if (selectExcel.ReadCell(0, 0, 0) == "Arbeitszeitnachweis") //Prüfen ob in der Fixen Cell mein erkennugsmerkmal ist
- {
- _excel = selectExcel; //datei als ausgewählte setzen
- break; //überschreibuns gefahr
- }
- }
- }
- if (_excel == null) //falls meine Datein nicht vorhanden ist
- {
- MessageBox.Show("Es wurde keine .xls für den Arbeitsnachweis gefunden");
- Close();
- return;
- }
- TabControl tabControl = new TabControl() { Dock = DockStyle.Fill };
- for (int i = 0, n = _excel.PageCount; i < n; i += 1)
- {
- ExcelWorkbanche.Worksheet sheet = _excel[i]; //Seite heran holen
- string name = sheet.Name; //Seiten name speichern für die TapPage
- TabPage page = new TabPage(name); // erstellen der TabPage
- DataGridView dataGrid = new DataGridView { Dock = DockStyle.Fill }; //DataGridView zu darstellen der Daten
- DataTable table = new DataTable(); //Daten-Tabelle als source zum DataGridview
- int colCount = _excel.GetColumnsCount(sheet); //benutze Anzahl der Spalten vom der Seite
- int startRange = 6; //Position des ersten Datum *Fix
- int endRange = _excel.GetRowsCount(sheet); //benutzte zeilen von der Seite
- for (int rowMax = endRange - 1; i > startRange; rowMax -= 1)//Finden des Letzen Datum ... Durchlauf von unten
- {
- string value = _excel.ReadCell(sheet, rowMax, 0); //Wert von einer Cell holen
- if (!string.IsNullOrWhiteSpace(value)) //prüfen ob sie nicht leer ist
- {
- if (Regex.IsMatch(value, @"[\d\.]+")) //entspricht das format einem Datum (e.g. 01.02.)
- {
- endRange = rowMax + 1; //Position des Letzen datums Merken
- break; //Rausspringen wegen überschreibung
- }
- }
- }
- for (int col = 0; col < colCount; col += 1) //Durchlaufen der Spalten für den DataGridView kopf
- {
- string cell = _excel.ReadCell(sheet, 4, col); //Lesen der Cell
- try //Error bei doppelter namensnennung
- {
- table.Columns.Add(new DataColumn(cell)); //Spalte erstellen
- }
- catch
- {
- int c = table.Columns.Cast<DataColumn>().Count(x => x.ColumnName.Contains(cell)); //Durchzählen wie oft eine spalte mit dem selben namen vorkommt
- table.Columns.Add(new DataColumn($"{cell}-{i}")); //die Anzahl angängen an den Name (e.g. ABC => ABC-1)
- }
- }
- dataGrid.DataSource = table; //Die Source zuweisen
- page.Controls.Add(dataGrid); //Der Page das DataGridView übergeben
- tabControl.TabPages.Add(page); //Page den Tabcon ....
- }
- panel1.Controls.Add(tabControl);
- }
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Facebamm“ ()