You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从Excel传递数据时如何将double类型值转换为int类型?附代码

解决Excel读取时Double转Int的问题

嘿,我来帮你搞定这个从Excel读取数据时把double类型值转成int类型的问题!

首先得先指出你代码里的一个小语法错误:泛型声明那里不该加引号,应该是HashMap<String, String>而不是HashMap<"String","String">,这个得先修正,不然代码编译不过去。

接下来说说核心问题:Apache POI读取Excel的数字单元格时,不管单元格里是整数还是小数,默认都会以double类型返回值。比如Excel里写的是100,POI读出来就是100.0,直接转成String就会变成"100.0",但我们需要的是"100"这种整数形式的字符串。

我们可以通过判断单元格的类型,对数字类型的单元格做特殊处理:先检查这个double值是否是整数(比如用value % 1 == 0判断),如果是,就把它转成int再转成String;如果不是,就保留原double的字符串形式。

下面是修改后的完整代码:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class DataHelper {
    public static List<HashMap<String, String>> data(String filepath, String sheetName) {
        List<HashMap<String, String>> mydata = new ArrayList<>();
        // 用try-with-resources自动关闭流,避免资源泄漏
        try (FileInputStream fs = new FileInputStream(filepath);
             XSSFWorkbook workbook = new XSSFWorkbook(fs)) { 

            Sheet sheet = workbook.getSheet(sheetName);
            if (sheet == null) {
                throw new IllegalArgumentException("工作表 " + sheetName + " 在工作簿中不存在");
            }

            Row headerRow = sheet.getRow(0);
            if (headerRow == null) {
                throw new IllegalArgumentException("工作表中未找到表头行");
            }

            for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {
                Row currentRow = sheet.getRow(i);
                if (currentRow == null) {
                    continue; // 跳过空行
                }

                HashMap<String, String> currentHash = new HashMap<>();
                for (int j = 0; j < headerRow.getPhysicalNumberOfCells(); j++) {
                    Cell headerCell = headerRow.getCell(j);
                    String headerKey = headerCell == null ? "" : getCellValueAsString(headerCell);

                    Cell currentCell = currentRow.getCell(j);
                    String cellValue = getCellValueAsString(currentCell);

                    currentHash.put(headerKey, cellValue);
                }
                mydata.add(currentHash);
            }
        } catch (Exception e) {
            e.printStackTrace(); // 实际项目里建议用日志框架代替printStackTrace
        }
        return mydata;
    }

    // 提取工具方法统一处理不同类型的单元格,转换为String
    private static String getCellValueAsString(Cell cell) {
        if (cell == null) {
            return "";
        }

        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                double numericValue = cell.getNumericCellValue();
                // 判断是否为整数
                if (numericValue == Math.floor(numericValue)) {
                    return String.valueOf((int) numericValue);
                } else {
                    return String.valueOf(numericValue);
                }
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                // 处理公式单元格,先计算结果再转换
                FormulaEvaluator evaluator = cell.getSheet().getWorkbook().getCreationHelper().createFormulaEvaluator();
                CellValue cellValue = evaluator.evaluate(cell);
                return getCellValueAsString(cellValue);
            default:
                return "";
        }
    }

    // 重载方法处理公式计算后的CellValue
    private static String getCellValueAsString(CellValue cellValue) {
        if (cellValue == null) {
            return "";
        }

        switch (cellValue.getCellType()) {
            case STRING:
                return cellValue.getStringValue();
            case NUMERIC:
                double numericValue = cellValue.getNumberValue();
                if (numericValue == Math.floor(numericValue)) {
                    return String.valueOf((int) numericValue);
                } else {
                    return String.valueOf(numericValue);
                }
            case BOOLEAN:
                return String.valueOf(cellValue.getBooleanValue());
            default:
                return "";
        }
    }
}

关键修改点说明:

  • 修复了泛型的语法错误,符合Java规范。
  • 使用try-with-resources自动关闭文件流和Workbook,避免资源泄漏,这是Java 7+的最佳实践。
  • 新增getCellValueAsString工具方法,统一处理不同类型的单元格,核心是在数字类型判断中,将整数形式的double转成int再转String,解决100.0变成"100"的需求。
  • 添加了空行、空单元格的判断,避免出现空指针异常,让代码更健壮。
  • 支持公式单元格的处理,先计算公式结果再转换值。

这样修改后,当Excel里的数字是整数类型时,读取出来的String就是干净的整数形式,不会带.0后缀啦!

内容的提问来源于stack exchange,提问作者Shashank Bisht

火山引擎 最新活动