为了账号安全,请及时绑定邮箱和手机立即绑定

垂直合并单元格并将数据插入单元格

垂直合并单元格并将数据插入单元格

UYOU 2022-05-25 15:45:11
我的问题是我有 4 个值。我需要在一个单元格中表示它们。我需要垂直合并单元格(列)并将四个值呈现在另一个下方(从上到下),在合并的单元格之间有换行符。我能够垂直合并单元格,但无法在单个单元格中显示四个值。CellRangeAddress cellRangeAddress = new CellRangeAddress(2,5,5,5);sheet.addMergedRegion(cellRangeAddress);
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

合并的单元格区域将它们定向到该区域中的第一个单元格。这意味着单元格样式以及单元格值。所以首先需要设置第一个单元格的单元格样式来换行。然后我们需要将所有单元格值连接到第一个单元格的单元格值中,该单元格值由换行符“\n”分隔。然后我们可以合并单元格。

例子:

样品.xlsx:

//img1.sycdn.imooc.com//628ddea40001c70603920250.jpg

代码:


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: 

//img1.sycdn.imooc.com//628ddebb000114de03720251.jpg

concatenateAndMerge使用DataFormatter的方法是因为源单元格内容可能不仅仅是文本,而是日期或其他数字。由于合并的单元格内容需要是串联字符串,因此之前单个单元格的不同内容应该出现在该串联字符串中,如之前在单个单元格中所示。这就是为什么DataFormatter. 我的方法使用FormulaEvaluator是因为源单元格内容也可能包含公式。



查看完整回答
反对 回复 2022-05-25
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

如果直接在 excel 中使用 VBA 是一种可行的替代方案,您可以编写一个宏来完成此任务。宏将保存在实际的 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


查看完整回答
反对 回复 2022-05-25
  • 2 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信