添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
* 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