Seite 1 von 1

Excel-Spaltennamen in Spalten-Nummern konvertieren

Verfasst: 2. Mai 2007 11:57
von Eltharion
Für ein Excel-ähnliches Programm suchte ich einen Algorithmus, um Spaltennamen im Excel-A1-Modus in Spalten-Nummern zu konvertieren. Also z.B. Spalte 1 ist "A", Spalte 2 "B", ... "Z", "AA", "AB", usw.

Das Spreadsheet Beispiel von Qt4 ist leider nur sehr rudimentär und im Netz gibt es zwar eine Hand voll Algorithmen, aber fast alle haben Sie Einschränkungen. So sind bspw. die Spaltenzahlen limitiert, Spaltennamen auf 2 oder 3 Buchstaben limitiert o.ä. Meine Routine sollte unlimitiert sein und auch mit anderen Alphabeten (mehr oder weniger Buchstaben) zurecht kommen. Später soll z.B. auch die arabische Zeichenmenge benutzt werden können. Da es sicher hin und wieder jmd. geben wird, der via Google sowas sucht, poste ich es mal hier. Eventuelle Fehler bitte wie üblich an mich mailen. Lizenz ist GPL, aber auch kommerzielle Projekte können den Code auf Anfrage benutzen.

Code: Alles auswählen

QString CellTableView::encodeColumnName(int col)
{
  QString result;
  unsigned int chars = 26;
  unsigned int mod;

  if (col > 32000)
    qWarning() << "CellTableView::encodeColumnName(col): col > 32000 may cause problems.";

  while (col > 0) {
    mod = (col - 1) % chars;
    col = (col - mod) / chars;

    result = QString(mod + 'A') + result;
  }
  
  return result;
}

int CellTableView::decodeColumnName(const QString &name)
{
  int value = 0;
  int pos = name.size();
  unsigned int help  = 1;
  unsigned int chars = 26;
  QString str = name.toUpper();

  while (pos > 0) {
    value += ((str.at(--pos).toLatin1() - 'A') + 1) * help;
    help *= chars;
  }

  return value;
}
Der Code ist noch recht frisch, also entsprechend vorsichtig behandeln ;-) Wird demnächst in einem meiner Projekte veröffentlicht werden.

Viele Grüße,

E*

Re: Excel-Spaltennamen in Spalten-Nummern konvertieren

Verfasst: 3. Mai 2007 13:38
von patrik08
Eltharion hat geschrieben:Für ein Excel-ähnliches Programm suchte ich einen
Das Spreadsheet Beispiel von Qt4 ist leider nur sehr rudimentär

Viele Grüße,

E*
Kennst Du dass Spreadsheet beispiel vom Deutsches QT4 Buch?

http://ppk.ciz.ch/qt_c++/spreadsheet.zip

ich finde es ziemlich gut .... rechnen kann es auf jedem fall formeln auch..
Wenn man dort noch etwas drag & drop hineinschreibt ist es sehr gut...

Verfasst: 7. Mai 2007 12:44
von Eltharion
> Kennst Du dass Spreadsheet beispiel vom Deutsches QT4 Buch?

Nein, die Version kannte ich noch nicht, aber die aus dem "demos"-Verzeichnis von Qt. Sind sich beide ja recht ähnlich. Wobei die Spaltennummerierung hier auch stark vereinfacht wurde. Bei mir kam die Idee, sowas mal nachzuprogrammieren, auch vom Qt-Spreadsheet-Beispiel. Ich benutze gleiche Klassen, bin aber komplett neu gestartet.

Mittlerweile habe ich auch eine recht einfach zu bedienende GUI (via Property-Editoren im QDockWindow), eine komplette JavaScript-Engine (jaja, ich weiss, es gibt auch Qts-Script-Möglichkeit, aber meine Anwendungen kriegen das alle als Standard verpasst, da wollte ich hier keine Ausnahme machen) und verschiedene Kleinigkeiten wie XML-I/O, gettext-basierte Lokalisierung, SVG Icons usw. Zur Zeit ist der Parser für den eingebauten Rechner dran und da tu' ich mich noch etwas mit lex/yacc schwer, aber so langsam klappt das auch. Festverdrahtete Rechenroutinen wollte ich eigentlich nicht nehmen.

Was mir wirklich Probleme bereitet sind so Dinge wie geteilte Ansichten im QTableWidget (also diese QSplitter ähnlichen Handles, die man von Excel her kennt) und überlappende Textausgaben. Da weiss ich noch nicht mal, ob man es überhaupt brauchen wird. Aber ich programmiere das ja aus Spass, da kann ich sowas auch erstmal nach hinten verschieben!

> Wenn man dort noch etwas drag & drop hineinschreibt ist es sehr gut...

DnD habe ich noch nicht mal auf meiner Todo-Liste ;-)

E*
[/quote]