Excel-Spaltennamen in Spalten-Nummern konvertieren

Code-Schnippsel, oder Tipps und Tricks, die einem beim Programmieren mit Qt helfen können.
Antworten
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Excel-Spaltennamen in Spalten-Nummern konvertieren

Beitrag 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*
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Re: Excel-Spaltennamen in Spalten-Nummern konvertieren

Beitrag 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...
.........................
speack português italiano deutsch english castellà qt
Eltharion
Beiträge: 74
Registriert: 4. Mai 2006 14:42
Wohnort: Magdeburg
Kontaktdaten:

Beitrag 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]
Antworten