Attualmente sto lavorando con l'API Apache POI e sto cercando di modificare un documento Word con esso (*.docx
). Un documento è composto da paragrafi (negli oggetti XWPFParagraph
) e un paragrafo contiene testo incorporato in "corre" (XWPFRun
). Un paragrafo può avere molte esecuzioni (a seconda delle proprietà del testo, ma a volte è casuale). Nel mio documento posso avere tag specifici che ho bisogno di sostituire con i dati (tutti i miei tag segue questo schema <#TAG_NAME#>
)Ottieni l'elenco di oggetti contenenti testo corrispondente a un modello
Così, per esempio, se io elaboro un paragrafo che contiene il testo Some text with a tag <#SOMETAG#>
, ho potuto ottenere qualcosa di simile
XWPFParagraph paragraph = ... // Get a paragraph from the document
System.out.println(paragraph.getText());
// Prints: Some text with a tag <#SOMETAG#>
Ma se voglio modificare il testo di quel paragrafo ho bisogno di elaborare le esecuzioni e il numero di esecuzioni non è fisso. Quindi, se mi mostra il contenuto di piste con quel codice:
System.out.println("Number of runs: " + paragraph.getRuns().size());
for (XWPFRun run : paragraph.getRuns()) {
System.out.println(run.text());
}
A volte può essere così:
// Output:
// Number of runs: 1
// Some text with a tag <#SOMETAG#>
E altro momento come questo
// Output:
// Number of runs: 4
// Some text with a tag
// <#
// SOMETAG
// #>
Cosa devo fare è quello di ottenere la prima esecuzione contenente l'inizio del tag e gli indici delle seguenti esecuzioni contenenti il resto del tag (se il tag è diviso in più esecuzioni). Sono riuscito a ottenere una prima versione dell'algoritmo, ma funziona solo se l'inizio del tag (<#
) e la fine del tag (#>
) non sono divisi. Here's what I've already done.
Quindi quello che vorrei ottenere è un algoritmo in grado di gestire questo problema e, se possibile farlo funzionare con un dato tag (non necessariamente <#
e #>
, così ho potuto sostituirlo con qualcosa di simile {{{
e questo }}}
).
Scusate se il mio inglese non è perfetto, non esitate a chiedermi di chiarire qualsiasi punto vogliate.
È possibile concatenare tutte le esecuzioni di un paragrafo, aggiornare il testo e quindi sostituire le esecuzioni con una singola contenente il nuovo testo? Può essere che tu possa farlo funzionare usando: http://stackoverflow.com/a/3638229/2611083 –
Questo è ciò che la mia soluzione effettiva fa parzialmente (se il tag è diviso in più esecuzioni, concatena il testo delle seguenti esecuzioni nel prima eseguire e cancellarli). Non voglio concatenare tutte le esecuzioni nel primo perché perderò tutti i parametri di testo. Ad esempio, se il paragrafo è ** Dati: ** _ _ <#DATATAG#>, voglio continuare "Dati:" in grassetto e sostituire il <#DATATAG#> dai dati che ho bisogno e tenerlo in corsivo –
Se tutto il tag ha la stessi parametri, potrebbe essere in diverse esecuzioni? –