Replacing a text in Apache POI XWPF

前端 未结 10 2199
鱼传尺愫
鱼传尺愫 2020-11-29 18:18

I just found Apache POI library very useful for editing Word files using Java. Specifically, I want to edit a DOCX file using Apache POI\'s XWPF classes. I

10条回答
  •  醉梦人生
    2020-11-29 18:48

    As of the date of writing, none of the answers replace properly.

    Gagravars answer does not include cases where words to replace are split in runs; Thierry Boduins solution sometimes left words to replace blank when they were after other words to replace, also it does not check tables.

    Using Gagtavars answer as base I have also checked the run before current run if the text of both runs contain the word to replace, adding else block. My addition in kotlin:

    if (text != null) {
            if (text.contains(findText)) {
                text = text.replace(findText, replaceText)
                r.setText(text, 0)
            } else if (i > 0 && p.runs[i - 1].getText(0).plus(text).contains(findText)) {
                val pos = p.runs[i - 1].getText(0).indexOf('$')
                text = textOfNotFullSecondRun(text, findText)
                r.setText(text, 0)
                val findTextLengthInFirstRun = findTextPartInFirstRun(p.runs[i - 1].getText(0), findText)
                val prevRunText = p.runs[i - 1].getText(0).replaceRange(pos, findTextLengthInFirstRun, replaceText)
                p.runs[i - 1].setText(prevRunText, 0)
            }
        }
    
    private fun textOfNotFullSecondRun(text: String, findText: String): String {
        return if (!text.contains(findText)) {
            textOfNotFullSecondRun(text, findText.drop(1))
        } else {
            text.replace(findText, "")
        }
    }
    
    private fun findTextPartInFirstRun(text: String, findText: String): Int {
        return if (text.contains(findText)) {
            findText.length
        } else {
            findTextPartInFirstRun(text, findText.dropLast(1))
        }
    }
    

    it is the list of runs in a paragraph. Same with the search block in the table. With this solution I did not have any issues yet. All formatting is intact.

    Edit: I made a java lib for replacing, check it out: https://github.com/deividasstr/docx-word-replacer

提交回复
热议问题