Modifica file word openxml c#

di il
1 risposte

Modifica file word openxml c#

Buongiorno a tutti, ho un problema con un file word, devo eliminare del testo tra 2 tag, ed i tag stessi, ma non riesco a capire dove sto sbagliando, sto provando con delle espressioni regolari, ma non so se sia il metodo migliore. Ah nell'esercizio devo utilizzare solo openxml.

Questa è la parte del testo che devo eliminare, ovviamente prima e dopo ne è presente dell'altro.

[?USA_DETTAGLIO_TARIFFE_G]
DETTAGLI TARIFFA GIORNALIERA:
[?DETTAGLIO_TARIFFA_G]
Tariffa: [CODICE_TARIFFA] - [DESCRIZIONE_TARIFFA]
Netto: [IMPONIBILE] - Imposta: [IMPOSTA] - Totale: [TOTALE] - IVA: [IVA]
[/?DETTAGLIO_TARIFFA_G]
[/?USA_DETTAGLIO_TARIFFE_G]

Devo eliminare tutto quello presente all'interno dei tag [?USA_DETTAGLIO_TARIFFE_G] e [/?USA_DETTAGLIO_TARIFFE_G] compresi questi ultimi.

Per ora ho scritto questo.


public static void UpdateTAG()
{

using (WordprocessingDocument wordDoc = WordprocessingDocument.Open("D:\\Word\\testOriginale.docx", true))
{

string docText = null;
using (StreamReader reader = new StreamReader(wordDoc.MainDocumentPart.GetStream()))
{
docText = reader.ReadToEnd();
}

//I alternativa
//string startTag = "[?USA_DETTAGLIO_TARIFFE_G]";
//string endTag = "[/?USA_DETTAGLIO_TARIFFE_G]";
//string textToRemove = docText.Substring(docText.IndexOf(startTag) + startTag.Length, docText.IndexOf(endTag)+ endTag.Length);
//docText = docText.Replace(textToRemove, "");

//II alternativa
//Regex expression = new Regex("(\\[?USA_DETTAGLIO_TARIFFE_G\\])(.*?)(\\[/?USA_DETTAGLIO_TARIFFE_G\\])");
//docText = expression.Replace(docText, "");

//III alternativa
//docText = Regex.Replace(docText,@"(?s)(?is)(?<=[?USA_DETTAGLIO_TARIFFE_G])(.*?)(?=[/?USA_DETTAGLIO_TARIFFE_G])", "");


using (StreamWriter writer = new StreamWriter(
wordDoc.MainDocumentPart.GetStream(FileMode.Create)))
{
writer.Write(docText);
}

wordDoc.Save();


Ovviamente nessuna delle 3 alternative funziona

1 Risposte

  • Re: Modifica file word openxml c#

    Lavorare con OpenXML non è proprio banale, io ho una classe che gestisce il replace di 800 righe

    Ti incollo qui un po' di codice che ti può dare qualche idea su come si scorre la gerarchia di Word, non è completo ne funzionante, come ho detto serve solo a darti qualche idea. Se hai qualche domanda precisa su come raggiungere un oggetto, chiedi e provo a darti una mano.

    using (MemoryStream outStr = new MemoryStream())
    {
    byte[] buffer = File.ReadAllBytes(SourceFile);
    outStr.Write(buffer, 0, buffer.Length);


    // Open a WordprocessingDocument for editing using the filepath.
    DOP.WordprocessingDocument wordprocessingDocument =
    DOP.WordprocessingDocument.Open(outStr, true);

    DOP.MainDocumentPart mainPart = wordprocessingDocument.MainDocumentPart;

    //Do something in the document body
    W.Body body = mainPart.Document.Body;
    foreach (W.Text txt in body.Descendants<W.Text>().ToList())
    {
    DoSomething(txt);
    }
    List<W.Paragraph> paragraphs = body.Descendants<W.Paragraph>().ToList();
    DoSomethingInMultipleRunsWParagraphs( paragraphs);
    }

    private static void DoSomething(W.Text txt)
    {
    string theNewText = txt.Text;

    //... some code that changes the content and produces a new text

    txt.Text = theNewText;

    }

    private static void DoSomethingInMultipleRuns(List<W.Run> rObj)
    {

    foreach (W.Run run in rObj)
    {
    string text = W.Run.Descendants<W.Text>().FirstOrDefault();
    string deletedText = W.Run.Descendants<W.DeletedText>().FirstOrDefault();

    //Do Something
    }

    }

    Saluti
Devi accedere o registrarti per scrivere nel forum
1 risposte