| 

.NET C# Java Javascript Exception

2
Hallo,

ich habe hier einen Report, der täglich automatisiert aus einer anderen Abteilung erstellt wird. Leider haben die nur die Möglichkeit diesen Report als XLS zu speichern, was alles nur komplizierter macht, noch...

Ich möchte diesen Report nachts in eine SQL DB einlesen, das ist jetzt auch nicht das Problem, ich habe alles schon soweit vorbereitet, scheitere jetzt aber an folgendem:

Die XLS hat zu Beginn 9 Zeilen, die ich nicht gebrauchen kann und die ich vor dem einlesen in die DB entfernen muss. Jetzt habe ich mir zwei Möglichkeiten überlegt, von denen ich bei beiden nicht weiß wie es geht.

Möglichkeit 1:
Die Excel Datei nehmen und die ersten 9 Zeilen löschen, speichern und dann einlesen.

Möglichkeit 2:
Die XLS als CSV speichern und einfach die ersten neun Zeilen beim einlesen überspringen. Hier ist die Frage, kann man eine XLS als CSV ohne Excel speichern und wenn ja wie?

Für Hilfe bin ich dankbar.
14.02.2011
Hornbrille 193 1 6
3 Antworten
2
Du könntest z.B. die Bibliothek ExcelLibrary nehmen und damit deine XLS-Datei einlesen. Zur Laufzeit kannst du dann deine Daten auslesen ohne die Dateien manipulieren zu müssen.

Update:
Für diese Bibliothek brauchst du kein Excel! :-)
14.02.2011
Konstantin 3,7k 1 8
cooles teil
Thomas Krojer 14.02.2011
2
Der folgende Code wandelt dir eine beliebige Excel-Datei in eine DataTable um. Mit der kannst du dann machen was du willst. Das Beispiel arbeitet mit einem Stream als Ausgangsbasis, den Code kannst du aber problemlos adaptieren.
Es werden alle Excel-Mappen umgewandelt weswegen die Rückgabe von Typ List<DataTable> ist.
Der Code kommt mit XLS und XLSX-Dateien klar.
Der Code ist in C# geschrieben. Eine Umwandlung in VB.Net sollte keine Hürde darstellen.

using System.Data;
using System.IO;
using System.Data.OleDb;
using System.Collections.Generic;
using System.Collections;
public static List<DataTable> GetDataTabeleFromExcel(Stream stream, string extension) {
List<DataTable> dtList = new List<DataTable>();

//-----------------------------------------------------------------------
// Stream als Datei ins Tempverzeichnis schreiben
//-----------------------------------------------------------------------
FileInfo tempFile = new FileInfo(Path.GetTempFileName() + extension.ForceStartsWith("."));

int length = 256;
int bytesRead = 0;
Byte[] buffer = new Byte[length];
using (FileStream fs = new FileStream(tempFile.FullName, FileMode.Create, FileAccess.Write)) {
do {
bytesRead = stream.Read(buffer, 0, length);
fs.Write(buffer, 0, bytesRead);
} while (bytesRead == length);
}
stream.Dispose();

//-----------------------------------------------------------------------
// Excel öffnen und verarbeiten
//-----------------------------------------------------------------------
string strConn = "Provider=Microsoft.{0}.OLEDB.{1};Data Source=" + tempFile.FullName + ";Extended Properties=\"Excel {2};HDR=Yes;\""; ;
if (extension.ForceStartsWith(".").ToLower() == ".xls")
strConn = string.Format(strConn, "Jet", "4.0", "8.0");
else if (extension.ForceStartsWith(".").ToLower() == ".xlsx")
strConn = string.Format(strConn, "Ace", "12.0", "12.0");

OleDbConnection excelConn = new OleDbConnection(strConn);
excelConn.Open();

//-----------------------------------------------------------------------
// Workbook-Namen auslesen
//-----------------------------------------------------------------------
DataTable schemaTable = excelConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
foreach (DataRow schemaRow in schemaTable.Rows) {
String WorkbookName = schemaRow["TABLE_NAME"].ToString().Replace("'", "");

//-----------------------------------------------------------------------
// Daten aus dem Workbook abrufen
//-----------------------------------------------------------------------
OleDbCommand excelCmd = new OleDbCommand("SELECT * FROM [" + WorkbookName.ForceEndsWith("$") + "]", excelConn);
excelCmd.CommandType = CommandType.Text;
OleDbDataAdapter excelDA = new OleDbDataAdapter(excelCmd);
DataTable dt = new DataTable();
excelDA.Fill(dt);

//-----------------------------------------------------------------------
// Spaltenbeschreibungsliste überprüfen und ggf. verändern
//-----------------------------------------------------------------------
int ColumnC = 0;
StringBuilder ColumnNameList = new StringBuilder();
foreach (DataColumn nC in dt.Columns) {
ColumnC++;
nC.Caption = nC.ColumnName;
if (nC.ColumnName == "") {
nC.ColumnName = ColumnC.ToString();
nC.Caption = ColumnC.ToString();
}
nC.ColumnName += '_' + System.Guid.NewGuid().ToString();
ColumnNameList.Append(nC.Caption + ";");
}
dt.ExtendedProperties.Add("HeadLine_CheckSum", ColumnNameList.ToString().GetMD5Hash());
dt.ExtendedProperties.Add("WorkbookName", WorkbookName);
dtList.Add(dt);
dt = null; excelDA = null; excelCmd = null; WorkbookName = null;
}
excelConn.Close();
if (tempFile.Exists) tempFile.Delete();
return dtList;
}
}
14.02.2011
Floyd 14,6k 3 9
Floyd 14,6k 3 9
1
Hi,

Du lässt leider offen wie du auf Excel zugreifst (Jet.OleDb, Interop, oder vielleicht mittels XML?).

Eigene Lösungsmöglichkeiten: Mittels Jet.OleDb kannst du die ersten 9 Zeilen der ausgelesenen Tabelle in einer Schleife ignorieren. Über Excel Automation / Interop einfach auf die 10. Zeile springen und dann die Bearbeitung starten.

Zur Frage nach Tools: Wenn du nach "convert xls to csv" googlest gibt es einige Tools, da ich jedoch keines näher kenne, müsstest du selbst evaluieren, ob eines deinen Anforderungen entspricht. Die meisten sind jedoch kostenpflichtig bzw. für ältere Excel Versionen. Ein neueres wäre z. B. http://www.downloadatoz.com/business_directory/convert-xls-to-any/, das u. a. auch Batchverarbeitung anbietet, sodass nicht manuell eingegriffen werden muss (nicht von mir getestet wie gesagt.)
14.02.2011
Maria Simlinger 1,1k 1 9
Ich hatte bis jetzt noch gar nicht auf die Datei zugegriffen, deswegen habe ich das offen gelassen. Aber an Jet hätte ich auch mal denken können, ich glaub so mach ich das auch, vielen Dank
Hornbrille 14.02.2011
Referenz auf Floyd's Betrag: Ist versionsunabhängig. (Stichwort xlsx und Ace.OleDb).
Maria Simlinger 14.02.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH