2016-05-20 3 views
2

Ich mache Bulk-Upload-Aufgabe in Alfresco.Ersetzen Sie Daten zu Word-Dokument In Alfresco mit Java-Code ohne Junk-Zeichen

Bevor ich benutzerdefinierte Aktion zum Aufrufen von Java-Code erstellt habe, habe ich auch erfolgreich Daten aus Excel-Blatt gelesen, und ich fand Knoten Referenz des Zieldokuments sowie Quelldokument. Mit dieser Knotenreferenz kann ich auch mehrere neue Dokumente erstellen. Jetzt ist meine Anforderung, ich möchte Excel-Daten in diesem neu erstellten Dokument ersetzen. Ich habe versucht, es zu ersetzen, aber es ersetzt die Zeichenfolge nur in der ersten Zeile des Dokuments, und es löscht Rest des vorhandenen Inhalts in neu erstellten Dokument. Ich habe dafür einen Code geschrieben.

Im unteren Code versuche ich zuerst einige hartcodierte Daten zum Dokument zu ersetzen. Aber meine Anforderung ist, ich möchte die Daten innerhalb des Dokuments ersetzen, die ich bereits aus der Excel-Datei gelesen habe.

Java-Code:

public class MoveReplacedActionExecuter extends ActionExecuterAbstractBase { 
    InputStream is; 
    Cell cell = null; 
    public static final String NAME = "move-replaced"; 
    private FileFolderService fileFolderService; 
    private NodeService nodeService; 
    private ContentService contentService; 
    private SearchService searchService; 
    @Override 
    protected void addParameterDefinitions(List <ParameterDefinition> paramList) { 

    } 
    public void executeImpl(Action ruleAction, NodeRef actionedUponNodeRef) { 

    try { 
    ContentReader contentReader = contentService.getReader(actionedUponNodeRef, ContentModel.PROP_CONTENT); 
    is = contentReader.getContentInputStream(); 
    } catch (NullPointerException ne) { 
    System.out.println("Null Pointer Exception" + ne); 
    } 

    try { 

    Workbook workbook = new XSSFWorkbook(is); 

    Sheet firstSheet = workbook.getSheetAt(0); 
    Iterator <Row> iterator = firstSheet.rowIterator(); 

    while (iterator.hasNext()) { 
    ArrayList <String> al = new ArrayList < >(); 
    System.out.println(""); 
    Row nextRow = iterator.next(); 
    Iterator <Cell> cellIterator = nextRow.cellIterator(); 
    while (cellIterator.hasNext()) { 
     cell = cellIterator.next(); 
     switch (cell.getCellType()) { 
     case Cell.CELL_TYPE_STRING: 
     System.out.print("\t" + cell.getStringCellValue()); 
     al.add(cell.getStringCellValue()); 
     break; 
     case Cell.CELL_TYPE_BOOLEAN: 
     System.out.print("\t" + cell.getBooleanCellValue()); 
     al.add(String.valueOf(cell.getBooleanCellValue())); 
     break; 
     case Cell.CELL_TYPE_NUMERIC: 
     System.out.print("\t" + cell.getNumericCellValue()); 
     al.add(String.valueOf(cell.getNumericCellValue())); 
     break; 
     } 
    } 
    } 

    is.close(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    String query = "PATH:\"/app:company_home/cm:Dipak/cm:OfferLetterTemplate.doc\""; 
    SearchParameters sp = new SearchParameters(); 
    StoreRef storeRef = new StoreRef(StoreRef.PROTOCOL_WORKSPACE, "SpacesStore"); 
    sp.addStore(storeRef); 
    sp.setLanguage(SearchService.LANGUAGE_LUCENE); 
    sp.setQuery(query); 
    ResultSet resultSet = searchService.query(sp); 
    System.out.println("Result Set" + resultSet.length()); 
    NodeRef sourceNodeRef = null; 
    for (ResultSetRow row: resultSet) { 
    NodeRef currentNodeRef = row.getNodeRef(); 
    sourceNodeRef = currentNodeRef; 
    System.out.println(currentNodeRef.toString()); 
    } 
    NodeRef n = new NodeRef("workspace://SpacesStore/78342318-37b8-4b42-aadc-bb0ed5d413d9"); 

    try { 
    org.alfresco.service.cmr.model.FileInfo fi = fileFolderService.copy(sourceNodeRef, n, "JustCreated" + Math.random() + ".doc"); 
    NodeRef newNode = fi.getNodeRef(); 

    QName TYPE_AUTHORTY = QName.createQName("sunpharma.hr.model", "hrdoctype"); 
    nodeService.setType(newNode, TYPE_AUTHORTY); 

    ContentReader contentReader1 = contentService.getReader(newNode, ContentModel.PROP_CONTENT); 
    InputStream is2 = contentReader1.getContentInputStream(); 

    POIFSFileSystem fs = new POIFSFileSystem(is2); 
    HWPFDocument doc = new HWPFDocument(fs); 

    doc = replaceText1(doc, "Company", "Datamatics"); 
    ContentWriter writerDoc = contentService.getWriter(newNode, ContentModel.PROP_CONTENT, true); 
    writerDoc.putContent(doc.getDocumentText()); 

    } catch (FileExistsException | FileNotFoundException e) { 

    e.printStackTrace(); 
    } catch (IOException e) { 

    e.printStackTrace(); 
    } 

    } 
    private static HWPFDocument replaceText1(HWPFDocument doc, String findText, String replaceText) { 
    System.out.println("In the method replacetext" + replaceText); 

    Range r1 = doc.getRange(); 
    System.out.println("Range of Doc : " + r1); 

    for (int i = 0; i < r1.numSections(); ++i) { 
    Section s = r1.getSection(i); 
    for (int x = 0; x < s.numParagraphs(); x++) { 
    Paragraph p = s.getParagraph(x); 
    for (int z = 0; z < p.numCharacterRuns(); z++) { 
     CharacterRun run = p.getCharacterRun(z); 
     String text = run.text(); 
     if (text.contains(findText)) { 
     run.replaceText(findText, replaceText); 
     } else { 
     System.out.println("NO text found"); 
     } 
    } 
    } 
    } 
    return doc; 
    } 
    public void setFileFolderService(FileFolderService fileFolderService) { 
    this.fileFolderService = fileFolderService; 
    } 
    public void setNodeService(NodeService nodeService) { 
    this.nodeService = nodeService; 
    } 
    public void setContentService(ContentService contentService) { 
    this.contentService = contentService; 
    } 
    public void setSearchService(SearchService searchService) { 
    this.searchService = searchService; 
    } 
} 
+1

Eine neue Frage für dieses Problem zu stellen war eine gute Entscheidung. Also, die Weitergabe einer temporären Datei hat nicht geklappt? Sicher würde ich doc.getDocumentText() nicht verwenden, da es einen String (und dann eine Teilinformation aus Ihrem Quelldokument) erhält: Sie müssen den gesamten Inhalt Ihrer Datei kopieren. – Akah

+0

Ja, Sie haben Recht. Eigentlich liest es nicht den ganzen Inhalt aus dem Dokument. Ich habe versucht, alle Inhalte auf der Konsole zu drucken, aber einige nicht übereinstimmende Inhalte zu drucken. Jetzt versuche ich den ganzen Inhalt zu lesen. –

+0

Hallo, jetzt kann ich Daten ersetzen. Aber es schreiben einige Junk-Zeichen in Datei. Kann mir jemand helfen, diese Junk-Charaktere zu entfernen? –

Antwort

3

Es ist nicht möglich, die direkte Datei Stream-Objekt in im Freien zu nehmen. Also habe ich eine Datei auf dem lokalen Laufwerk erstellt, im Hintergrund habe ich alle Ersetzungsoperationen durchgeführt. und danach lese ich alle Daten mit dem File Input Stream Objekt. und später habe ich den Stream mit dem Knoten verwendet.

und es gab mir meine gewünschte Ausgabe. :)

Verwandte Themen