[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: 12783

22. Okt 2011, 16:28
Beitrag # 1 von 2
Bewertung:
(938 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: 12783

22. Okt 2011, 19:51
Beitrag # 2 von 2
Beitrag ID: #482846
Bewertung:
(898 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]