如何使用 apache POI 在文档中换行

luc*_*fer 5 java apache ms-word apache-poi

我正在使用 POI 在 word 中创建一个表格表格已成功创建,但我想在单元格中的每个文本之间做一个新行,我无法做到这一点,这是我到目前为止所做的,

XWPFTable candidateTrackerTable = document.createTable();
XWPFTableRow canndidateTrackerTableRowOne =  candidateTrackerTable.getRow(0);
canndidateTrackerTableRowOne.getCell(0).setText("Presented ");
canndidateTrackerTableRowOne.addNewTableCell().setText("Interview ");
canndidateTrackerTableRowOne.addNewTableCell().setText("Phone ");
canndidateTrackerTableRowOne.addNewTableCell().setText("Final Interview ");
canndidateTrackerTableRowOne.addNewTableCell().setText("Offer ");

XWPFTableRow canndidateTrackerTableRowTwo = null;
for(Map.Entry<Integer, ArrayList<String>> candidateName:aMap.entrySet()){
    canndidateTrackerTableRowTwo =  candidateTrackerTable.createRow();
    for(String s:candidateName.getValue()){
        //System.out.println("------>>"+s);
        canndidateTrackerTableRowTwo.getCell(0).setText(String.valueOf(s)+"\n");
    }
    for(Map.Entry<Integer, ArrayList<String>> candidatePhone:bMap.entrySet()){
        for(String s1:candidatePhone.getValue()){
            //System.out.println("------>>"+s1);
            canndidateTrackerTableRowTwo.getCell(1).setText(String.valueOf(s1));
        }
        for(Map.Entry<Integer, ArrayList<String>> candidateSkyped: cMap.entrySet())
            for(String s2:candidateSkyped.getValue())
                canndidateTrackerTableRowTwo.getCell(2).setText(String.valueOf(s2));
        for(Map.Entry<Integer, ArrayList<String>> candidateOnsite : dMap.entrySet())
            for(String s3:candidateOnsite.getValue())
                canndidateTrackerTableRowTwo.getCell(3).setText(String.valueOf(s3));
        for(Map.Entry<Integer, ArrayList<String>> candidateOffered : eMap.entrySet())
            for(String s4:candidateOffered.getValue())
                canndidateTrackerTableRowTwo.getCell(4).setText(String.valueOf(s4));
    }
}       
Run Code Online (Sandbox Code Playgroud)

我想在每个 canndidateTrackerTableRowTwo.getCell(0).setText(String.valueOf(s)+"\n"); 之间添加新行;

小智 6

要向表格单元格添加格式,请创建一个以段落和字符串作为参数的函数。此函数将从段落创建一个运行,现在您可以将格式添加到该运行中。

private static void tableText(List<XWPFParagraph> paragraph, String text) {
    XWPFRun run = paragraph.get(0).createRun();
    run.setFontSize(14);
    run.setFontFamily("Times New Roman");
    run.setText(text);
    run.addBreak();
    run.setText("Next line");
}
Run Code Online (Sandbox Code Playgroud)

现在使用此函数将文本添加到表格中。

XWPFTableRow tableRow = table.createRow();
tableText(tableRow.getCell(0).getParagraphs(), " 6 ", true);
Run Code Online (Sandbox Code Playgroud)


PCG*_*rar 5

这段代码经过一些修改后对我有用(循环在找到最后一次运行时有一些错误,并且忘记在其他段落上插入新行)(编辑:*正如 dellasavia 所说:“while”比“for each”好" 以避免异常)。

                // Loop through runs in paragraph.
                int i_paragraph = 0;
                //for (XWPFRun xwpfRun : parrafo.getRuns()) { //EXCEPTION UPDATING RUNS IN THE PARAGRAPH
                while (i_paragraph < parrafo.getRuns().size()) { //BETTER THE WHILE
                    XWPFRun xwpfRun = parrafo.getRuns().get(i_paragraph);

                    // Split runs by new line character.
                    String textOfRun = xwpfRun.getText(0);
                    if (textOfRun.contains("\n")) {
                        String[] stringsOnNewLines = textOfRun.split("\n");

                        // For each additional line, create a new run. Add carriage return on previous.
                        for (int i = 0; i < stringsOnNewLines.length; i++) {

                            // For every run except last one, add a carriage return.
                            String textForLine = stringsOnNewLines[i];
                            if (i == stringsOnNewLines.length - 1) {
                                xwpfRun.setText(textForLine, 0);
                                xwpfRun.addCarriageReturn();
                            } else {
                                parrafo.insertNewRun(i);
                                XWPFRun newRun = parrafo.getRuns().get(i);
                                CTRPr rPr = newRun.getCTR().isSetRPr() ? newRun.getCTR().getRPr() : newRun.getCTR().addNewRPr();
                                rPr.set(xwpfRun.getCTR().getRPr());
                                newRun.setText(textForLine);
                                newRun.addCarriageReturn(); //ADD THE NEW LINE
                            }
                        }
                    }
                    i_paragraph++;
                }
Run Code Online (Sandbox Code Playgroud)


Dan*_*rey 0

Apache POI/OpenXML 格式无法识别传统的回车符和换行符。相反,需要调用 XWPFRun.addCarriageReturn() 方法来创建新行。

您将需要循环遍历单元格段落和运行,然后将要在新行上显示的文本拆分为新的运行,然后在所有先前的运行中添加回车符。

这里有一些代码可以帮助您入门。我没有测试这个,但我应该让你继续。

// Loop through paragraphs in cell.
for ( XWPFParagraph xwpfParagraph : cell.getParagraphs() ) {

    // Loop through runs in paragraph.
    for ( XWPFRun xwpfRun : xwpfParagraph.getRuns() ) {

        // Split runs by new line character.
        String textOfRun = xwpfRun.getText( 0 );
        if ( textOfRun.contains( "\n" ) ) {
            String[] stringsOnNewLines = textOfRun.split( "\n" );

            // For each additional line, create a new run. Add carriage return on previous.
            for ( int i = 0; i < stringsOnNewLines.length; i++ ) {

                // For every run except last one, add a carriage return.
                String textForLine = stringsOnNewLines[i];
                if ( i < stringsOnNewLines.length - 1 ) {
                    xwpfRun.setText(textForLine, 0);
                    xwpfRun.addCarriageReturn();
                }
                else {
                    xwpfParagraph.insertNewRun( i );
                    XWPFRun newRun = paragraph.getRuns().get( i );
                    CTRPr rPr = newRun.getCTR().isSetRPr() ? newRun.getCTR().getRPr() : newRun.getCTR().addNewRPr();
                    rPr.set( xwpfRun.getCTR().getRPr() );
                    newRun.setText( textForLine );
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 一旦 xwpfParagraph 被迭代,在 `xwpfParagraph.insertNewRun( i );` 中不会导致 ConcurrentModificationException 吗? (2认同)