java通过poi把excel文件导入mysql数据库报错

2025-04-12 23:05:06
推荐回答(3个)
回答1:

java通过poi把excel文件导入mysql数据库报错是因为excel中的数据类型要跟mysql中的数据类型和长度对应,否则类型转换异常是最常见的。所以插入到mysql数据库的时候需要做类型检查。

1、Excel中的测试数据:

2、数据库表结构:

CREATE TABLE `student_info` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `no` varchar(20) DEFAULT NULL,

  `name` varchar(20) DEFAULT NULL,

  `age` varchar(10) DEFAULT NULL,

  `score` float DEFAULT '0',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

3、java源码部分ReadExcel.java:

/**

 * 读取excel中的数据并插入db

 */

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.ArrayList;

import java.util.List;


import org.apache.poi.hssf.usermodel.HSSFCell;

import org.apache.poi.hssf.usermodel.HSSFRow;

import org.apache.poi.hssf.usermodel.HSSFSheet;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;


import com.b510.common.Common;

import com.b510.excel.vo.Student;


/**

 * @author pieryon

 * @created 2016-5-18

 */

public class ReadExcel {


    public List readXls() throws IOException {

        InputStream is = new FileInputStream(Common.EXCEL_PATH);

        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);

        Student student = null;

        List list = new ArrayList();

        // 循环工作表Sheet

        for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {

            HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);

            if (hssfSheet == null) {

                continue;

            }

            // 循环行Row

            for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {

                HSSFRow hssfRow = hssfSheet.getRow(rowNum);

                if (hssfRow != null) {

                    student = new Student();

                    HSSFCell no = hssfRow.getCell(0);

                    HSSFCell name = hssfRow.getCell(1);

                    HSSFCell age = hssfRow.getCell(2);

                    HSSFCell score = hssfRow.getCell(3);

                    student.setNo(getValue(no));

                    student.setName(getValue(name));

                    student.setAge(getValue(age));

                    student.setScore(Float.valueOf(getValue(score)));

                    list.add(student);

                }

            }

        }

        return list;

    }

    

     @SuppressWarnings("static-access")

    private String getValue(HSSFCell hssfCell) {

            if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {

                // 返回布尔类型的值

                return String.valueOf(hssfCell.getBooleanCellValue());

            } else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {

                // 返回数值类型的值

                return String.valueOf(hssfCell.getNumericCellValue());

            } else {

                // 返回字符串类型的值

                return String.valueOf(hssfCell.getStringCellValue());

            }

        }

}

2、SaveData2DB.java

/**

 * 插入数据到db

 */

import java.io.IOException;

import java.sql.SQLException;

import java.util.List;


import com.b510.common.Common;

import com.b510.excel.util.DbUtil;

import com.b510.excel.vo.Student;


/**

 * @author pieryon

 * @created 2016-5-18

 */

public class SaveData2DB {


    @SuppressWarnings({ "rawtypes" })

    public void save() throws IOException, SQLException {

        ReadExcel xlsMain = new ReadExcel();

        Student student = null;

        List list = xlsMain.readXls();


        for (int i = 0; i < list.size(); i++) {

            student = list.get(i);

            List l = DbUtil.selectOne(Common.SELECT_STUDENT_SQL + "'%" + student.getName() + "%'", student);

            if (!l.contains(1)) {

                DbUtil.insert(Common.INSERT_STUDENT_SQL, student);

            } else {

                System.out.println("The Record was Exist : No. = " + student.getNo() + " , Name = " + student.getName() + ", Age = " + student.getAge() + ", and has been throw away!");

            }

        }

    }

}

保存结果:

回答2:

在老版本的MySQL3.22中,MySQL的单表限大小为4GB,当时的MySQL的存储引擎还是ISAM存储引擎。但是,当出现MyISAM存储引擎之后,也就是从MySQL3.23开始,MySQL单表最大限制就已经扩大到了64PB了(官方文档显示)。也就是说,从目前的技术环境来看,MySQL数据库的MyISAM存储引擎单表大小限制已经不是有MySQL数据库本身来决定,而是由所在主机的OS上面的文件系统来决定了。  而MySQL另外一个最流行的存储引擎之一Innodb存储数据的策略是分为两种的,一种是共享表空间存储方式,还有一种是独享表空间存储方式。  当使用共享表空间存储方式的时候,Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。  而当使用独享表空间来存放Innodb的表的时候,每个表的数据以一个单独的文件来存放,这个时候的单表限制,又变成文件系统的大小限制了。

回答3:

你不把报错信息贴出来,谁给你挨行代码看着去猜啊......