java - Apache POI读取excel单元格的公式值

标签 java excel apache-poi

我正在开发上传 Excel 文件并将其值插入数据库的应用程序。

我的代码如下:

FileInputStream inputStream = new FileInputStream(excelFile);
String fileExtension = FilenameUtils.getExtension(temp1);

Workbook wb = null;
if(fileExtension.equalsIgnoreCase("xls")){ 
    wb = new HSSFWorkbook(inputStream);
} else {
    wb = new XSSFWorkbook(inputStream);
}

if (wb != null){
    logger.info("Read File");
}

Sheet sheet = null;
Row row = null;
Cell cell = null;

dbConnect();

sheet = wb.getSheetAt(0);
int rows = sheet.getPhysicalNumberOfRows() + 1;

for (int y=1; y<rows; y++){
    row = sheet.getRow(y);
    int cells = row.getPhysicalNumberOfCells();

    String sqlQuery = "INSERT INTO paycheck(" + 
        "paycheckId, payTitle, payEmployee, payDisDate, payBasicSalary, payIncentive, payAllowance, paySpecialAllowance, " + 
        "payEducation, payTotal, payTax, payOther, payAdvanced, payDeductible, payNet, payDuration, payRate)" + 
            "VALUES(";

    for (int z=0; z<cells; z++){
        cell = row.getCell(z);

        if(z != cells -1){
            sqlQuery += "'" + cell + "', ";
        } else {
            sqlQuery += cell + ")";
        }
    }
    stmt.execute(sqlQuery);
}
dbDisConnect();

因此,当我上传如下所示的 Excel 文件时,它会工作并将其数据插入数据库。

enter image description here

但是,当我上传如下所示的 Excel 文件时,数据库不会更新。

enter image description here

请问如何解决这个问题,这样即使cell的值为=ROUNDUP((600),2),而不是600,它仍然会更新db。

提前谢谢您。

最佳答案

兴趣点 Cell类代表一个单元格,并提供了许多使用该单元格的方法。

当您执行 sqlQuery += "'"+ cell + "', "; 时,您将插入 Cell.toString() 返回的值。该值没有明确定义为执行任何操作,因此您不能依赖它返回的内容。

您想要做的是使用 cell.getStringCellValue() 方法,“以字符串形式获取单元格的值”,如 javadoc 所述它。

除此之外,您不想执行当前正在执行的字符串连接,因为它会使您的代码变得脆弱并且容易受到 SQL Injection 的影响。攻击,这将使黑客能够窃取您的数据和/或删除您的所有表。

您应该使用 PreparedStatement,使用参数标记 (?) 和 setXxx() 方法。

关于java - Apache POI读取excel单元格的公式值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35447144/

相关文章:

java - Apache POI将图像插入到excel文件中,但不显示

java - 使用 GridBagLayout 将跨列居中

java - 有没有一种简单的方法来替换常量的用法?

VBA/公式、工作表之间的映射

excel - 是否能够在保留相邻列的值的同时拆分单元格?

excel - 使用年份和儒略日期确定已经过去了多少天的公式

java - 如何在 PCF 中重新暂存应用程序实例而不重新暂存应用程序

java - 将信息存储在音频中

java - 在java中创建一个visio 2013文件

apache-poi - 如何使用 Apache POI 设置 docx 文件中的运行(行中的单词或段落)的背景颜色?