猿问

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

我的问题是我有 4 个值。我需要在一个单元格中表示它们。


我需要垂直合并单元格(列)并将四个值呈现在另一个下方(从上到下),在合并的单元格之间有换行符。


我能够垂直合并单元格,但无法在单个单元格中显示四个值。


CellRangeAddress cellRangeAddress = new CellRangeAddress(2,5,5,5);

sheet.addMergedRegion(cellRangeAddress);


UYOU
浏览 96回答 2
2回答

SMILET

合并的单元格区域将它们定向到该区域中的第一个单元格。这意味着单元格样式以及单元格值。所以首先需要设置第一个单元格的单元格样式来换行。然后我们需要将所有单元格值连接到第一个单元格的单元格值中,该单元格值由换行符“\n”分隔。然后我们可以合并单元格。例子:样品.xlsx:代码: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: 我concatenateAndMerge使用DataFormatter的方法是因为源单元格内容可能不仅仅是文本,而是日期或其他数字。由于合并的单元格内容需要是串联字符串,因此之前单个单元格的不同内容应该出现在该串联字符串中,如之前在单个单元格中所示。这就是为什么DataFormatter. 我的方法使用FormulaEvaluator是因为源单元格内容也可能包含公式。

牛魔王的故事

如果直接在 excel 中使用 VBA 是一种可行的替代方案,您可以编写一个宏来完成此任务。宏将保存在实际的 excel 文件中。当 Excel 合并单元格时,它只保留第一个单元格的值,因此在合并这些单元格之前,请以您想要的格式连接它们的值。要为您的值添加换行符,请Chr(10)在您想要新行的位置连接。请记住,如果您以这种方式格式化数字单元格,则单元格值将变为字符串,因此不能再用作公式中的数字。以下代码将执行您想要的*:Dim finalValue As StringFor Each c In Selection    finalValue = finalValue & IIf((Len(finalValue) > 0) And (Len(c.Text) > 0), Chr(10), Empty) & c.TextNext cSelection.ClearSelection.MergeSelection.Value = finalValue*注意:如果您需要对可变单元格编号执行此任务,我选择了代码,但它适用于任何Range对象另请注意,除非您删除And (Len(c.Text) > 0). IIf但是通过这样做,将选择与已合并的单元格合并将创建尽可能多的空行[the size of the merged cell] - 1
随时随地看视频慕课网APP

相关分类

Java
我要回答