Announcement

Collapse
No announcement yet.

Excel-Import mit OleDB - Zellgröße maximal 255 Zeichen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Excel-Import mit OleDB - Zellgröße maximal 255 Zeichen

    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

  • #2
    MaxScanRows in den Extended Properties hochdrehen? Wenn > 255 die Regel ist sollte ja mit ausreichender Wahrscheinlichkeit welche beim zu scannen zu finden sein wenn man mal mehr als die standardmäßigen ersten 8(?) Rows scannt.

    statt dem Excel ein HTML doc zu erstellen
    Warum sowas abstruses? Es gibt doch so schöne standardisierte Austauschformate XML, JSON etc. Wenn du auf die Idee kommst das tatsächlich zu ändern dann doch gleich auf was dafür gedachtes.

    Comment


    • #3
      MaxScanRows kann den wert maximal auf 16 annehmen.
      Hier kommt es nun dazu, dass ich nicht sicherstellen kann, dass in den ersten 16 Zeilen ein großer Zellwert stehen wird.
      Das Excel kann im Endeffekt endlos groß werden.



      Originally posted by Ralf Jansen View Post
      Warum sowas abstruses? Es gibt doch so schöne standardisierte Austauschformate XML, JSON etc. Wenn du auf die Idee kommst das tatsächlich zu ändern dann doch gleich auf was dafür gedachtes.
      Nunja, weil ich leider die Quelle nicht anpassen kann.
      Hier gibt es nur sehr beschränkte Exportmöglichkeiten...

      Zudem kommt ein sehr nerviges Rechtesystem hinzu, wobei die Abteilung, welche den Export benötigt keinen Zugriff auf die Quellen hat. (nichteinmal Lesezugriff!)

      Comment


      • #4
        Ich würde den OLEDB-Zugriff über den Access-Treiber rauschmeißen und direkt mit Excel (oder einer Komponente die Excel native laden kann) arbeiten.
        Der JET-Treiber ist bekannt dafür das er hier sehr oft Probleme bereitet.

        Comment


        • #5
          COM Interop ist nur leider deutlich langsamer als Jet.


          Edit : Übrigens MaxScanRows=0 sollte eigentlich scanne alle Rows bedeuten. Ob das der Performance zuträglich ist wage ich aber zu bezweifeln.

          Comment


          • #6
            Originally posted by Ralf Jansen View Post
            COM Interop ist nur leider deutlich langsamer als Jet.
            Nicht wenn man es richtig macht und nicht jeden Zellenwert mit Cells einzeln abfragt.
            Arbeitet man mit Regions ist selbst ein Exceldatei mit 10.000+ Zeilen in 0,Nix eingelesen.

            Comment

            Working...
            X