* copyCellValue() 方法用于将源单元格的值复制到目标单元格中。
* @param sourceCell 是源单元格对象
* @param destCell 是目标单元格对象
public static void copyCellValue(Cell sourceCell, Cell destCell) {
// 如果 sourceCell 和 destCell 中任意一个为 null,则不进行操作,方法直接返回。
if (sourceCell == null || destCell == null) {
return;
// 首先,将源单元格的单元格样式克隆到目标单元格上,然后再将源单元格的值赋给目标单元格。
CellStyle sourceStyle = sourceCell.getCellStyle();
CellStyle destinationStyle = destCell.getSheet().getWorkbook().createCellStyle();
destinationStyle.cloneStyleFrom(sourceStyle);
destCell.setCellStyle(destinationStyle);
// 如果源单元格的数据类型为字符串类型,则复制字符串值;如果为布尔类型,则复制布尔值;如果为公式类型,则复制公式字符串;如果为数字类型,则复制数字值。
if (sourceCell.getCellTypeEnum().equals(CellType.STRING)) {
destCell.setCellValue(sourceCell.getStringCellValue());
} else if (sourceCell.getCellTypeEnum().equals(CellType.BOOLEAN)) {
destCell.setCellValue(sourceCell.getBooleanCellValue());
} else if (sourceCell.getCellTypeEnum().equals(CellType.FORMULA)) {
destCell.setCellValue(sourceCell.getCellFormula());
} else if (sourceCell.getCellTypeEnum().equals(CellType.NUMERIC)) {
if (DateUtil.isCellDateFormatted(sourceCell)) {
destCell.setCellValue(sourceCell.getDateCellValue());
} else {
destCell.setCellValue(sourceCell.getNumericCellValue());
// 如果源单元格是空的,则在目标单元格中写入一个空串("")。
} else if (sourceCell.getCellTypeEnum().equals(CellType.BLANK)) {
destCell.setCellValue("");
这样写在进行大部分数据类型复制的过程的都没有问题,但除了公式类型的数据不能成功复制,网上有一些博主的做法是直接将
if (DateUtil.isCellDateFormatted(sourceCell)) {
destCell.setCellValue(sourceCell.getDateCellValue());
} else {
destCell.setCellValue(sourceCell.getNumericCellValue());
复制到公式的类型下,当然这样也可以成功的将源单元格中的数据复制过来,而且复制过来的数据类型是相同的,但是这里有一个问题,就是当某个单元格是依赖这个复制过来的单元格时(比如有公式依赖关系),这种情况下就会出现,这个依赖的单元格的值就不能自动生成。
拿图说话吧,就是当从别的表复制110.73这个值过来后,下面的0这个数字根据公式关系就应该立刻发生改变,但结果是,按照映射关系,指定的单元格的值复制成功了,但是先关联的单元格的值并没有发生改变。
根本原因就是,仅仅只复制了内容没有复制样式,在这里体现出来的就是,公式没有复制过来
二、解决问题
尝试方法1、
将 destCell.setCellValue(sourceCell.getCellFormula());
该成 destCell.setCellFormula(sourceCell.getCellFormula());
结果失败,公式转换不过去,计算出的结果通通为 0
尝试方法2、
经过查阅资料发现要在生成文件前加个一行代码,命令公式生效
于是我将 destinationWorkbook.setForceFormulaRecalculation(true);// 执行公式
分别和这两个
destCell.setCellValue(sourceCell.getCellFormula()); destCell.setCellFormula(sourceCell.getCellFormula());
进行组合并再尝试运行,发现还是不行。甚至直接解析不了了
尝试方法3、
正确尝试!!!!!!
destCell.setCellFormula(String.valueOf(sourceCell.getNumericCellValue()));
其实,解决问题的思路很简单,在经历之前的尝试后发现,只有把公式作为 NUMERIC 类型读进来才会有效果,但这样就不能用 setCellFormula 方法了,所以进行转换了一下,再结合
destinationWorkbook.setForceFormulaRecalculation(true);// 执行公式
就可以得到正确结果了。
1、直接将原单元格样式加载新建单元格上
XSSFRow newRow = sheet.createRow(row + 5);
for (int cell = 0; cell < maxCellNum; cell++) {
XSSFCel...
EXCEL模板有两个sheet,画面内容要出力到第二个sheet中,第一个sheet设置公式,读取第二个sheet的内容进行计算。
出现了这样一个问题,画面内容正常出力到第二个sheet中了,但是第一个sheet中并没有反映出相应的内容,把光标放到有公式的单元格中,再打一下回车键,内容才会显示出来。
解决办法如下:
public static String writeExcel(File output)
* Whether the application shall perform a full recalculation when the workbook is opened.
当java操作excel表格的时候,有时候通过公式计算比直接后台计算要方便,所以公式计算的重要性体现了出来
// 单元格类型
cell.setCellType(CellType.FORMULA.getCode());
// 公式
cell.setCellFormula("SUM(J20:J"+(count+1)+")/SUM(G20:G"+(count+1)+")");
单元格类型有这些
public enum CellType {
@Internal(
since = "POI
具体表现为将字符串类型的电话号码存入Excel中,双击单元格后,转变为大数类型。
问题解决
原因是设置样式和填入数据的先后顺序问题,所以只需要在填入数据前设置单元格样式和类型即可解决:
row.createCell(2).setCellStyle(cellStyle);
row.createCell(2).setCellValue(addressBook.getPhonenum());
关键代码:
List<Sheet> sheets = reader.getSheets();
sheets.stream().forEach(sheet -> sheet.setForceFormulaRecalculation(true));
获取
Excel中所有的Sheet,强制启用指定Sheet
中的
公式
找了好久没有看到有人解决,大多都是xls版本的HSSF。下面是解决xlsx版本XSSF公式失效问题。
需求:从系统中生成EXCEL,在最后一行合计。
实现:代码中写出excel的合计公式。拼凑出例如:=SUM(J3:J7)放进代码。
问题:实际导出来的excel文件,合计栏出现了空白。鼠标放上去看,公式完全没有问题,就是没有生效,并且提示是非受保护视图。点击启用编辑关掉受保护视图,公式又生效了。
// 合计2 数值格式
XSSFCellStyle contextStyle2 =
1、本文记录 poi excel 实现 单元格cell的复制 、 row行复制 、 sheet 页复制;一般应用的场景:excel 模板中 可能需要进行的复制操作。
Java Excel 复制单元格 poi Excel 复制单元格 Java Excel 复制行 Java Excel 复制 sheet 页 poi excel...
import org.apache.
poi.ss.usermodel.Sheet;
import org.apache.
poi.ss.usermodel.Workbook;
import org.apache.
poi.ss.util.Cel