2014-12-31 4 views
2

Я создаю таблицу, используя POI в слове, таблица создана успешно, но я хочу сделать новую строку между каждым текстом в ячейке, я не могу этого сделать, вот то, что я делал до сих пор,Как сделать новую строку в документе с помощью apache 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)); 
    } 
}  

я хочу, чтобы добавить новую строку между каждым canndidateTrackerTableRowTwo.getCell (0) .setText (String.valueOf (ы) + "\ п");

+1

Проверили ли вы это? http://stackoverflow.com/questions/7477335/java-apache-poi-newline-characters-are-ignored-when-writing-to-xwpftable-cell – Rockstar

+0

его не работает для меня ... – lucifer

+0

Вы получаете какую-либо ошибку ? – Rockstar

ответ

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

В 'xwpfParagraph.insertNewRun (i);' не вызывает ConcurrentModificationException, как только xwpfParagraph повторяется? – dellasavia

1

Этот код работает для меня с некоторыми изменениями (цикл имеет некоторые ошибки с поиском последнего запуска и забывает вставить новую строку на других пунктах) (Отредактировано: * и, как dellasavia сказал: а «а» лучше, чем «для каждого», чтобы избежать исключения).

   // 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++; 
       } 
0

Чтобы добавить форматирование в ячейку таблицы, создайте функцию, которая принимает абзац и строку в качестве аргумента. Эта функция создаст прогон из пара, теперь вы можете добавить свое формирование в этот прогон.

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

На сайте 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(); 
Смежные вопросы