【问题标题】:How to do new line in doc using apache POI如何使用 apache POI 在文档中换行
【发布时间】:2014-12-31 06:12:03
【问题描述】:

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

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));
    }
}       

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

【问题讨论】:

标签: java apache ms-word apache-poi


【解决方案1】:

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

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");
}

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

XWPFTableRow tableRow = table.createRow();
tableText(tableRow.getCell(0).getParagraphs(), " 6 ", true);

【讨论】:

  • 添加中断解决了我的问题。赞成
【解决方案2】:

POI 网站列出了一种适合我的技术。

https://poi.apache.org/spreadsheet/quick-guide.html#Using+newlines+in+cells

在单元格中使用换行符

Workbook wb = new XSSFWorkbook();   //or new HSSFWorkbook();
Sheet sheet = wb.createSheet();

Row row = sheet.createRow(2);
Cell cell = row.createCell(2);
cell.setCellValue("Use \n with word wrap on to create a new line");

//to enable newlines you need set a cell styles with wrap=true
CellStyle cs = wb.createCellStyle();
cs.setWrapText(true);
cell.setCellStyle(cs);

//increase row height to accomodate two lines of text
row.setHeightInPoints((2*sheet.getDefaultRowHeightInPoints()));

//adjust column width to fit the content
sheet.autoSizeColumn((short)2);

FileOutputStream fileOut = new FileOutputStream("ooxml-newlines.xlsx");
wb.write(fileOut);
fileOut.close();

【讨论】:

  • 这不适用于word文档
【解决方案3】:

此代码对我进行了一些修改(循环在查找最后一次运行时出现了一些错误,并且忘记在其他段落中插入新行)(编辑:*正如 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++;
                }

【讨论】:

    【解决方案4】:

    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 );
                    }
                }
            }
        }
    }
    

    【讨论】:

    • xwpfParagraph.insertNewRun( i ); 中不会导致 ConcurrentModificationException,一旦 xwpfParagraph 被迭代?
    • @dellasavia,是的,确实如此。
    【解决方案5】:

    这可能有点晚了。我有一个方法,我创建表格的标题(行 = 0),每个标题都有标题编号,然后我添加另一个带有参数文本的段落

    public  static final String[] headings= {"Title", "Name", "Surname", "Address", "DOB","Notes"};
    
     '''
    XWPFTableRow row = table.getRow(0);
    
    for (int pos=0; pos < COLUMN_NUMBER; pos++) {
        addCellHeading(row, pos, headings[pos]);
    }
    
    ...
    
    private void addCellHeading(XWPFTableRow row, Integer pos, String text){
    
        XWPFTableCell cell = row.getCell(pos);
        XWPFParagraph headingNo = cell.addParagraph();
        headingNo.setAlignment(ParagraphAlignment.CENTER);
        XWPFRun run = headingNo.createRun();
        run.setBold(true);
        run.setText(String.valueOf(pos+1) + ". ");
    
        XWPFParagraph heading = cell.addParagraph();
        heading.setAlignment(ParagraphAlignment.CENTER);
        run = heading.createRun();
        run.setBold(true);
        run.setText(text);
    }
    

    【讨论】:

      【解决方案6】:

      请通过增加行高来检查。

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多