Вертикальное слияние ячеек и вставка данных в ячейку - PullRequest
0 голосов
/ 29 января 2019

У меня вопрос: у меня 4 значения.Мне нужно представлять их в одной ячейке.

Мне нужно объединить ячейки по вертикали (столбцы) и представить четыре значения одно под другим (сверху вниз) с переводом строки между этими объединенными ячейками.

Я могу объединить ячейки по вертикали, но не могу представить четыре значения в одной ячейке.

CellRangeAddress cellRangeAddress = new CellRangeAddress(2,5,5,5);
sheet.addMergedRegion(cellRangeAddress);

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Если использование VBA непосредственно в Excel является жизнеспособной альтернативой, вы можете написать макрос для выполнения этой задачи.Макрос будет сохранен в фактическом файле Excel.

Когда Excel объединяет ячейки, он сохраняет только значение первой ячейки, поэтому, прежде чем объединить эти ячейки, объедините их значения в нужном формате.Чтобы добавить разрыв строки к вашему значению, объедините Chr(10) там, где вы хотите новую строку.

Имейте в виду, что если вы отформатируете числовые ячейки таким образом, значение ячейки станет строкой и поэтому может 'больше не может использоваться как число в формулах.

Следующий код будет делать то, что вы хотите *:

Dim finalValue As String
For Each c In Selection
    finalValue = finalValue & IIf((Len(finalValue) > 0) And (Len(c.Text) > 0), Chr(10), Empty) & c.Text
Next c

Selection.Clear
Selection.Merge
Selection.Value = finalValue

* примечание: я сделал код с выбором на случайвам нужно выполнить эту задачу с переменным номером ячейки, но она будет работать с любым Range объектом

, также обратите внимание, что пустая ячейка не будет содержать пустую строку, если вы не удалите условие And (Len(c.Text) > 0) в IIf.Но при этом слияние выделения с уже объединенными ячейками создаст столько пустых строк, сколько [the size of the merged cell] - 1

0 голосов
/ 29 января 2019

Область объединенной ячейки ориентируется на первую ячейку в этой области.Это означает стиль ячейки, а также значение ячейки.Поэтому сначала нужно задать стиль ячейки первой ячейки для переноса текста.Затем нам нужно объединить все значения ячеек вместе в значение ячейки первой ячейки, разделенное символом "\ n", переводом строки.Затем мы можем объединить ячейки.

Пример:

SAMPLE.xlsx: enter image description here

Код:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.*;
import org.apache.poi.util.LocaleUtil;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Locale;

class ExcelConcatenateAndMerge {

 private static void concatenateAndMerge(
  Sheet sheet, CellRangeAddress cellRangeAddress, DataFormatter formatter, FormulaEvaluator evaluator, CellStyle cellStyle) {

  Row row = null;
  Cell cell = null;
  Cell firstCell = null;
  String cellValue = "";
  boolean first = true;
  for (CellAddress cellAddress : cellRangeAddress) {
   row = sheet.getRow(cellAddress.getRow());
   if (first) {
    if (row == null) row = sheet.createRow(cellAddress.getRow());
    firstCell = row.getCell(cellAddress.getColumn());
    if (firstCell == null) firstCell = row.createCell(cellAddress.getColumn());
    firstCell.setCellStyle(cellStyle);
    cellValue = formatter.formatCellValue(firstCell, evaluator);
    first = false;
   } else {
    if (row != null) {
     cell = row.getCell(cellAddress.getColumn());
     if (cell != null) {
      cellValue += "\n" + formatter.formatCellValue(cell, evaluator);
     } else cellValue += "\n" + "";
    } else cellValue += "\n" + "";
   }
  }

  firstCell.setCellValue(cellValue);

  sheet.addMergedRegion(cellRangeAddress);

 }

 public static void main(String[] args) throws Exception {

  Workbook wb  = WorkbookFactory.create(new FileInputStream("SAMPLE.xlsx"));

  Locale locale = new Locale("en", "US");
  LocaleUtil.setUserLocale(locale);
  DataFormatter formatter = new DataFormatter();
  FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  CellStyle cellStyle = wb.createCellStyle();
  cellStyle.setWrapText(true);

  Sheet sheet = wb.getSheetAt(0);
  CellRangeAddress cellRangeAddress = new CellRangeAddress(2,5,5,5);

  concatenateAndMerge(sheet, cellRangeAddress, formatter, evaluator, cellStyle);

  FileOutputStream out = new FileOutputStream("SAMPLENEW.xlsx");
  wb.write(out);
  out.close();
  wb.close();

 }
}

SAMPLENEW.xlsx: enter image description here

Мой метод concatenateAndMerge использует DataFormatter, поскольку исходное содержимое ячеек может быть не просто текстом, а датой или другими числами.Поскольку содержимое объединенных ячеек должно быть объединенной строкой, в этой объединенной строке должно присутствовать другое содержимое предыдущих отдельных ячеек, как показано ранее в отдельных ячейках.Вот почему DataFormatter.И мой метод использует FormulaEvaluator, потому что содержимое исходных ячеек может также содержать формулы.

...