[GastForen Programme Print/Bildbearbeitung Adobe InDesign Skriptwerkstatt Tabellenzeilen in Tabellenkopfzeilen umwandeln

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Print/Bildbearbeitung - Photos, Layout, Design
Themen
Beiträge
Moderatoren
Letzter Beitrag

Tabellenzeilen in Tabellenkopfzeilen umwandeln

Martin Fischer
  
Beiträge gesamt: 12668

22. Okt 2011, 16:28
Beitrag # 1 von 2
Bewertung:
(892 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

ich möchte in einer Tabelle per Skript eine variable Zahl an Zeilen am Anfang derselben zu Kopfzeilen umwandeln.

Dabei sollen ggf. Zellverbindungen erhalten bleiben.

Ein Ansatz mit Copy & Paste scheint spontan zu funktionieren.
(vor Ausführung des Skripts ist der Cursor in der Tabelle platziert)

Code
// tableHeader_CopyPaste.jsx 

main();

function main()
{
if (app.selection.length != 1)
error_exit('Bitte Tabelle auswählen.');
else
var _table = get_table( app.selection[0] );

var header_rows = prompt('Anzahl der Kopfzeilen', '1');
if (isNaN(header_rows))
error_exit('Zahl der Kopfzeilen nicht zu ermitteln.');
else
header_rows = Number(header_rows);

make_header(_table, header_rows);
}

function make_header(_table, header_rows)
{
if ( _table.headerRowCount == 0 && _table.rows.length > header_rows)
{
// Auswahl für CUT
app.select(_table.rows.item(0), SelectionOptions.REPLACE_WITH)
for (var i = 1; i < header_rows; i++)
app.select(_table.rows.item(i), SelectionOptions.ADD_TO);
app.cut();
_table.headerRowCount = header_rows;

// Auswahl für PASTE
app.select(_table.rows.item(0), SelectionOptions.REPLACE_WITH)
for (var i = 1; i < header_rows; i++)
app.select(_table.rows.item(i), SelectionOptions.ADD_TO);
app.paste();
}
}


function get_table(_obj)
{
var t = _obj;
while (t.constructor.name != 'Table' && t.constructor.name != 'Application')
{
t = t.parent;
}
if (t.constructor.name == 'Table')
return t;
else
return null;
}

function error_exit( m )
{
alert( m );
exit();
}


Es fehlt noch eine Prüfung, ob vertikal verbundene Zellen den Bereich des Kopfs überschreiten.

Weil ich keine Möglichkeit gefunden habe, die Reihen über itemByRange() auszuwählen, habe ich mir mit dem folgenden Konstrukt beholfen:
Code
app.select(_table.rows.item(0), SelectionOptions.REPLACE_WITH)  
for (var i = 1; i < header_rows; i++)
app.select(_table.rows.item(i), SelectionOptions.ADD_TO);


Aus unterschiedlichen Gründen (z.B. auch, weil mehrere ausgewählte Tabellen behandelt werden sollen) versuche ich Copy & Paste möglichst zu vermeiden. Deswegen verfolgte ich einen weiteren Ansatz, um die Aufgabe umzusetzen:
1. Definition des Kopfbereichs
2. Einarbeiten der Kopfzeilen (aus den bereits existierenden Zeilen am Anfang der Tabelle)

Die rows kennen keinen duplicate()- und keinen move()-Befehl, mit dem Zeilen aus dem Tabellenkörper in den Tabellenkopf zu bewegen wären. Deswegen versuchte ich folgendes:
Nach der Definition des Kopfbereichs, bei der die entsprechende Anzahl der Kopfzeilen leer eingefügt wird, werden die noch leeren Kopfzeilen in ihrer Struktur (verbundene Zellen) der Strukur der einzuarbeitenden Zeilen angepasst.

Das will mir zwar mit horizontal verbundenen Zellen gelingen.
Aber die vertikal verbunden Zellen bereiten mir nicht enden wollendes Kopfzerbrechen.

Hier die entsprechende Funktion insert_header(), welche die Funktion make_header() im Skript oben ersetzt.

Code
function insert_header(_table, header_rows) 
{
if ( _table.headerRowCount == 0 && _table.rows.length > header_rows)
{
_table.headerRowCount = header_rows;
for (var h = header_rows -1; h >= 0; h--)
{
_table.rows.item(h).cells.everyItem().unmerge();
for (var c = 0; c < _table.rows.item(h + header_rows).cells.length; c++ )
{
if ( _table.rows.item(h + header_rows).cells.item(c).columnSpan > 1)
{
_table.rows.item(h).cells.item(c).merge( _table.rows.item(h).cells.item(c + _table.rows.item(h + header_rows).cells.item(c).columnSpan -1) );
}
//~ if ( _table.rows.item(h + header_rows).cells.item(c).rowSpan > 1)
//~ {
//~ do something
//~ }
_table.rows.item(h + header_rows).cells.item(c).texts.firstItem().move(LocationOptions.AT_BEGINNING, _table.rows.item(h).cells.item(c));
}
_table.rows.item(h + header_rows). remove();
}
}
}


Hat jemand eine Idee, wie hier eine Routine zur Abbildung von vertikal verbundenen Zeilen und im Kopfbereich zu integrieren wäre?

Und wie könnte das als Steigerung in Kombination von sowohl horizontal als auch vertikal verbunden Zeilen aussehen?


Oder hat jemand eine Idee von einem ganz anderen Ansatz?
X

Tabellenzeilen in Tabellenkopfzeilen umwandeln

Martin Fischer
  
Beiträge gesamt: 12668

22. Okt 2011, 19:51
Beitrag # 2 von 2
Beitrag ID: #482846
Bewertung:
(852 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Während einem Spaziergang ist mir klar geworden, dass die Lösung darin liegt, nicht alles gleichzeitig erledigen zu wollen. First things first.

Also läuft die Schleife zweimal durch die Kopfzeilen.
Beim ersten Durchlauf werden die column spans angepasst und beim zweiten Durchlauf die row spans. Dann passen nämlich die vertikal zu verbindenden Zellen vertikal auch zueinander und müssen nicht umständlich im Voraus ermittelt werden.


als Antwort auf: [#482844]

Aktuell

PDF / Print
Wolken_300

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
02.02.2023

Prozesse optimieren und effizient gestalten

Zürich
Donnerstag, 02. Feb. 2023, 08.00 - 10.00 Uhr

Digitalisierung, Webauftritt

Digitalisierung mitgestalten - Worauf kommt es an? Wie wichtig ist die Webseite? Webseite mit Word Press? Interne Prozesse optimieren

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: Birol Isik, E-Mailinfo AT bkcc DOT ch

https://digitalisierung-heute.ch/digitalisierung-informationstag-schweiz/

Veranstaltungen
01.03.2023 - 09.03.2023

Online
Mittwoch, 01. März 2023, 00.00 Uhr - Donnerstag, 09. März 2023, 00.00 Uhr

Online Webinar

Wie gehen wir mit diesen Veränderungen um? Was ist notwendig, damit wir die Digitalisierung im Unternehmen klappt? Veränderungsprozesse verstehen und entsprechend handeln Mitarbeiter als Botschafter Webseite mit WordPress erstellen SEA /SEO (Ads aufschalten)

Ja

Organisator: B. Isik - SNF Academy

Kontaktinformation: B. Isik, E-Mailinfo AT snfa DOT ch

https://www.fernstudiumfitness.ch/digitalisierung-schweiz/