Hallo Kollegen,
ich habe ein kleines Problem, welches ich auch nach durchforsten des Internets nicht zufriedenstellend lösen kann.
Wenn ich mir über den folgenden OLE-Befehl das Excel einlese, bekomme ich die Zelleninhalte mit maximal 255 Zeichen zurück.
[highlight=csharp]
public static DataSet ImportExcelXLS(string fileName, bool hasHeaders)
{
var output = new DataSet();
var fi = new FileInfo(fileName);
if (!fi.Exists) return output;
var hdr = hasHeaders ? "Yes" : "No";
string strConn;
if (fi.Extension.ToLower() == ".xlsx")
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName +
";Extended Properties=\"Excel 12.0 Macro;HDR=" + hdr + ";IMEX=1\"";
else
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=\"Excel 8.0;HDR=" + hdr +
";IMEX=1\"";
using (var conn = new OleDbConnection(strConn))
{
conn.Open();
var schemaTable = conn.GetOleDbSchemaTable(
OleDbSchemaGuid.Tables, new object[] {null, null, null, "TABLE"});
if (schemaTable != null)
foreach (DataRow schemaRow in schemaTable.Rows)
{
var sheet = schemaRow["TABLE_NAME"].ToString();
if ((sheet.LastIndexOf("'", StringComparison.Ordinal) < sheet.Length - 1 && sheet.Contains("'")) ||
sheet.Contains("#_FilterDatabase") || sheet.Contains("#FilterData"))
continue;
try
{
var cmd = new OleDbCommand("SELECT * FROM [" + sheet + "]", conn) {CommandType = CommandType.Text};
var outputTable = new DataTable(sheet);
output.Tables.Add(outputTable);
new OleDbDataAdapter(cmd).Fill(outputTable);
}
catch (Exception ex)
{
throw new Exception(ex.Message + "Sheet:" + sheet + ".File:" + fileName, ex);
}
}
conn.Close();
}
return output;
}
[/highlight]
Der Code war historisch korrekt, als eine andere Art von Sourcetabellen verwendet wurde wo eine Zellengröße von 255 Zeichen nie erreicht werden konnte, da sich alle Informationen auf mehrere Sheets verteilten.
Da nun die Quelle so überarbeitet wurde, dass alle Informationen auf der ersten Seite stehen, ist ein Zellinhalt mit mehr als 255 Zeichen die Regel.
Gefundene Lösungen wie: "Mach in die Zellen der ersten Spalte +255 Zeichen" sind für mich nicht relevant.
Kennt jemand von euch eine einfache Lösung für dieses Problem? (habe ich vllt einfach iwo einen Parameter übersehen, in dem ich das angeben kann?)
Ich bin auch schon am überelgen, statt dem Excel ein HTML doc zu erstellen (werden jeweil automatisch generiert von einem anderen Tool (nicht von mir)), für welches ich dann wieder einen eigenen Parser schreibe zum auslesen...
Vielen Dank im Voraus!
Nooa
ich habe ein kleines Problem, welches ich auch nach durchforsten des Internets nicht zufriedenstellend lösen kann.
Wenn ich mir über den folgenden OLE-Befehl das Excel einlese, bekomme ich die Zelleninhalte mit maximal 255 Zeichen zurück.
[highlight=csharp]
public static DataSet ImportExcelXLS(string fileName, bool hasHeaders)
{
var output = new DataSet();
var fi = new FileInfo(fileName);
if (!fi.Exists) return output;
var hdr = hasHeaders ? "Yes" : "No";
string strConn;
if (fi.Extension.ToLower() == ".xlsx")
strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName +
";Extended Properties=\"Excel 12.0 Macro;HDR=" + hdr + ";IMEX=1\"";
else
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fileName + ";Extended Properties=\"Excel 8.0;HDR=" + hdr +
";IMEX=1\"";
using (var conn = new OleDbConnection(strConn))
{
conn.Open();
var schemaTable = conn.GetOleDbSchemaTable(
OleDbSchemaGuid.Tables, new object[] {null, null, null, "TABLE"});
if (schemaTable != null)
foreach (DataRow schemaRow in schemaTable.Rows)
{
var sheet = schemaRow["TABLE_NAME"].ToString();
if ((sheet.LastIndexOf("'", StringComparison.Ordinal) < sheet.Length - 1 && sheet.Contains("'")) ||
sheet.Contains("#_FilterDatabase") || sheet.Contains("#FilterData"))
continue;
try
{
var cmd = new OleDbCommand("SELECT * FROM [" + sheet + "]", conn) {CommandType = CommandType.Text};
var outputTable = new DataTable(sheet);
output.Tables.Add(outputTable);
new OleDbDataAdapter(cmd).Fill(outputTable);
}
catch (Exception ex)
{
throw new Exception(ex.Message + "Sheet:" + sheet + ".File:" + fileName, ex);
}
}
conn.Close();
}
return output;
}
[/highlight]
Der Code war historisch korrekt, als eine andere Art von Sourcetabellen verwendet wurde wo eine Zellengröße von 255 Zeichen nie erreicht werden konnte, da sich alle Informationen auf mehrere Sheets verteilten.
Da nun die Quelle so überarbeitet wurde, dass alle Informationen auf der ersten Seite stehen, ist ein Zellinhalt mit mehr als 255 Zeichen die Regel.
Gefundene Lösungen wie: "Mach in die Zellen der ersten Spalte +255 Zeichen" sind für mich nicht relevant.
Kennt jemand von euch eine einfache Lösung für dieses Problem? (habe ich vllt einfach iwo einen Parameter übersehen, in dem ich das angeben kann?)
Ich bin auch schon am überelgen, statt dem Excel ein HTML doc zu erstellen (werden jeweil automatisch generiert von einem anderen Tool (nicht von mir)), für welches ich dann wieder einen eigenen Parser schreibe zum auslesen...
Vielen Dank im Voraus!
Nooa
Comment