2 回答
TA贡献1796条经验 获得超4个赞
合并的单元格区域将它们定向到该区域中的第一个单元格。这意味着单元格样式以及单元格值。所以首先需要设置第一个单元格的单元格样式来换行。然后我们需要将所有单元格值连接到第一个单元格的单元格值中,该单元格值由换行符“\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
是因为源单元格内容也可能包含公式。
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
添加回答
举报