Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 垂直合并单元格并将数据插入单元格_Java_Excel_Apache Poi - Fatal编程技术网

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

Java 垂直合并单元格并将数据插入单元格,java,excel,apache-poi,Java,Excel,Apache Poi,我的问题是我有4个价值观。我需要在一个单元格中表示它们 我需要垂直合并单元格(列),并在合并单元格中的另一个(从上到下)下显示四个值,它们之间有换行符 我可以垂直合并单元格,但无法在单个单元格中显示四个值 CellRangeAddress cellRangeAddress = new CellRangeAddress(2,5,5,5); sheet.addMergedRegion(cellRangeAddress); 合并的单元格区域将它们自身定向到该区域中的第一个单元格上。这意味着单元格样式

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

我需要垂直合并单元格(列),并在合并单元格中的另一个(从上到下)下显示四个值,它们之间有换行符

我可以垂直合并单元格,但无法在单个单元格中显示四个值

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

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

例如:

SAMPLE.xlsx:

代码:

SAMPLENEW.xlsx:


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

如果在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

*注意:我在代码中选择了一个选项,以防您需要在可变单元格编号上执行此任务,但它将在任何
范围
对象上工作


还请注意,除非删除
IIf
中的
和(Len(c.Text)>0)
条件,否则空单元格不会生成空行。但是通过这样做,将选择与已合并的单元格合并将创建与
[合并单元格的大小]-1一样多的空行将它们连接在一起使用&或连接…感谢solar Mike的回复。请你再详细说明一下好吗。如果我使用普通连接,我会在单元格的一行中得到四个值,但我希望它们以一行一行的顺序排列。如果你想在单个单元格中得到四个值,但在单独的行中,那么你需要输入“硬”返回…“不知道如何在注释中附加屏幕截图”:不是在注释中,而是在问题中。但现在已经很清楚了。所以不需要屏幕截图。你能解释一下硬回报吗。以代码为例,为什么您认为这个问题与VBA有关?如果在excel中直接使用VBA是一种可行的替代方法,那么它被清楚地标记为
java
apache poi
,答案清楚地表明这里提出的解决方案是一种替代方法。非常感谢Axel Richter的回答。我的问题已经解决,但您能否解释一下为什么使用DataFormatter,代码中的公式计算器以及如何自动调整Columns@veera文卡特什:请看我的补充资料。但是“如何自动调整列的大小”?哪些列应自动调整大小?那么简单地使用?ok Axel呢?通过查看您提供的链接,我发现了我的问题,默认情况下,Autosizecolumn会忽略MergeCells。我们需要为方法表传递true参数。Autosizecolumn(columnIndex,true)。
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