2016-05-20 2 views
2

Alfrescoでバルクアップロードタスクを実行しています。データをワードドキュメントに置き換えるジャンク文字を除くJavaコードを使用してアルフレコで

これまでJavaコードを呼び出すためのカスタムアクションを作成しましたが、Excelシートのデータも正常に読み込みました。ターゲットドキュメントとソースドキュメントのノード参照が見つかりました。そのノード参照を使用して、私は新しい複数のドキュメントを作成することもできます。 私の要件は、新しく作成したドキュメントのExcelデータを置き換えることです。私はそれを置き換えようとしましたが、文字列をドキュメントの最初の行に置き換え、新しく作成したドキュメント内の既存のコンテンツの残りを削除します。私はこれのために以下のコードを書いています。

以下のコードでは、まずハードコードされたデータをドキュメントに置き換えようとしています。 しかし、私の要件は、私がすでに読み込んだ文書の中のデータをExcelファイルから置き換えたいということです。

Javaコード:

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

この問題の新しい質問をすることは素晴らしい決定でした。だから、一時ファイルを渡すことはできませんでしたか?私はdoc.getDocumentText()を使用しません。なぜなら、文字列(そしてソース文書から部分的な情報)を取得するからです。ファイルの内容全体をコピーする必要があります。 – Akah

+0

ええ、あなたは正しいです。実際には、その文書から全内容を読んでいない。私はコンソールにすべての内容を印刷しようとしましたが、不一致の内容が印刷されていました。今私は全体の内容を読むことを試みている。 –

+0

こんにちは、今私はデータを置き換えることができます。しかし、いくつかの迷惑な文字をファイルに書き込んでいます。誰も私がそれらの迷惑な文字を削除するのを助けることができます。 –

答えて

3

屋外で直接ファイルストリームオブジェクトを取るために、そのことはできません。 ローカルドライブに1つのファイルを作成しました。バックグラウンドでは、すべての置換操作を実行しました。その後、ファイル入力ストリームオブジェクトを使用してすべてのデータを読み込みます。後で私はそのストリームをノードと一緒に使用しました。

それは私に私の希望する出力を与えました。 :)

関連する問題