java导出excel后,单元格内的数字不能进行数学运算(公式)

前情提要

参与的项目有一个导出excel的功能,是之前已经完成的功能,现在要添加新的序号列;发现导出的excel中的数值单元格是文本型数字,并非数字,换句话说,excel将这些数据识别为文本而非数字,单元格右上角会出现绿三角。
在这里插入图片描述下方的平均值和求和也不生效。

我发现的原因:代码将数据写入workbook对象时,这些数据是String类型。

测试

public class Test04 {

    public static void main(String[] args) throws IOException {
//        List<List<String>> dataList = new ArrayList<>();
//        dataList.add(List.of("10000", "1.12345", "0.1234567"));
//        dataList.add(List.of("10000", "1.12345", "0.1234567"));
//        dataList.add(List.of("10000", "1.12345", "0.1234567"));
        List<List<Double>> dataList = new ArrayList<>();
        List<Double> list = new ArrayList<>();
        list.add(10000D);
        list.add(-12345.12345D);
        list.add(0.1234567D);
        dataList.add(list);
        dataList.add(list);
        dataList.add(list);
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("sheet1");
        CellStyle style = workbook.createCellStyle();
        CreationHelper creationHelper = workbook.getCreationHelper();
        // 格式分类设为常规 (避免出现小数部分显示不全)
        style.setDataFormat(creationHelper.createDataFormat().getFormat("General")); 
        for (int j = 0; j < dataList.size(); j++) {
            Row row = sheet.createRow(j);
            for (int k = 0; k < dataList.get(j).size(); k++) {
                Cell first = row.createCell(k);
                first.setCellValue(dataList.get(j).get(k));
                first.setCellStyle(style);
            }
        }
        FileOutputStream outputStream = new FileOutputStream("D:\\test1.xlsx");
        workbook.write(outputStream);
        workbook.close();
        outputStream.close();
    }
}

用Double类型写入后,就是正常的数字了(整型和浮点都可以,对应的包装类也可以)
在这里插入图片描述

如果用String的话,就会出现不是数字的情况
在这里插入图片描述

小数显示问题

上边测试代码有一行设置了格式分类为常规是为了显示全部小数,也可设置其他的来控制

style.setDataFormat(creationHelper.createDataFormat().getFormat("General"));

当设置为“0”,即

style.setDataFormat(creationHelper.createDataFormat().getFormat("0"));

在这里插入图片描述设置为“0.0”,即
在这里插入图片描述
等等
具体设置什么要看需求决定

实际应用

可以直接在写入workbook对象时将需要的数据处理为Double,要考虑精度问题;
也可以在写入workbook对象之后再取出来转换为Double,例如

public static void dealCellType(Workbook workbook, ExportHeadType exportHeadType, Boolean exportType){
        List<String> exportHead = getExportHead(exportHeadType); // 获得表头对应的list
        Sheet sheet = workbook.getSheetAt(0);
        CellStyle style = workbook.createCellStyle();
        CreationHelper helper = workbook.getCreationHelper();
        style.setDataFormat(helper.createDataFormat().getFormat("General")); // 格式分类设为常规 (避免出现小数部分显示不全)
        int lastRowNum = sheet.getLastRowNum();
        for (int i = 3; i < lastRowNum + 1; i++) { // 除去表头,数据从第三行开始
            Row row = sheet.getRow(i);
            for (int j = 0; j < exportHead.size(); j++) {
                if (Objects.equals(exportHead.get(j), "合计金额")){
                    Cell cell = row.getCell(j);
                    String s = cell.getStringCellValue().replace(",", ""); //可能会出现分级号
                    if (StringUtils.hasText(s)) {
                        double value = Double.parseDouble(s); // 转为double  即可转为数值型
                        cell.setCellValue(value);
                        cell.setCellStyle(style);
                    }
                }
            }
        }
    }

这只是一个示例,具体还想看项目情况决定条件,整体思路为拿到需要转换的单元格内的数据,转换为Double,再写回去

PS:只是我个人发现的一个处理方法,欢迎大家指正补充

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Java 中设置单元格颜色,但不是整个单元格填满颜色,可以使用 `CellStyle.setFillPattern()` 方法来设置单元格填充模式。具体来说,可以使用 `CellStyle.SOLID_FOREGROUND` 填充模式来设置单元格的前景色,然后使用 `CellStyle.setFillForegroundColor()` 方法来设置所需的颜色。 以下是一个示例代码,演示如何将单元格的左半部分设置为红色,右半部分设置为黄色: ```java Workbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet("Sheet1"); // 创建一个样式对象 CellStyle style = wb.createCellStyle(); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); // 设置左半部分为红色 style.setFillForegroundColor(IndexedColors.RED.getIndex()); style.setFillBackgroundColor(IndexedColors.WHITE.getIndex()); style.setAlignment(HorizontalAlignment.LEFT); style.setVerticalAlignment(VerticalAlignment.CENTER); // 设置右半部分为黄色 style.setFillForegroundColor(IndexedColors.YELLOW.getIndex()); style.setFillBackgroundColor(IndexedColors.WHITE.getIndex()); style.setAlignment(HorizontalAlignment.RIGHT); style.setVerticalAlignment(VerticalAlignment.CENTER); // 创建一个单元格对象,并将样式应用于它 Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("Hello World"); cell.setCellStyle(style); ``` 注意,这里使用了 `HorizontalAlignment` 和 `VerticalAlignment` 枚举类型来设置单元格内容的水平和垂直对齐方式。你可以根据需要进行更改,以满足你的具体需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值