Java实现excel数据读取并导入数据库(excel版本为2003)

Java实现excel数据读取并导入数据库(excel版本为2003)


1.在pom.xml中导入相关坐标

	<!--导入读取Excel表的相关依赖-->
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>4.1.2</version>
		</dependency>
		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml-schemas</artifactId>
			<version>4.1.2</version>
		</dependency>

2.添加导入excel文件工具类ImportExeclUtil

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.sun.org.apache.xerces.internal.impl.xpath.regex.ParseException;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;


public class ImportExeclUtil {

    private static int totalRows = 0;// 总行数

    private static int totalCells = 0;// 总列数

    private static String errorInfo;// 错误信息

    /** 无参构造方法 */
    public ImportExeclUtil()
    {
    }

    public static int getTotalRows()
    {
        return totalRows;
    }

    public static int getTotalCells()
    {
        return totalCells;
    }

    public static String getErrorInfo()
    {
        return errorInfo;
    }

    /**
     *
     * 根据流读取Excel文件
     *
     *
     * @param inputStream
     * @param isExcel2003
     * @return
     * @see [类、类#方法、类#成员]
     */
    public List<List<String>> read(InputStream inputStream, boolean isExcel2003)
            throws IOException
    {

        List<List<String>> dataLst = null;

        /** 根据版本选择创建Workbook的方式 */
        Workbook wb = null;

        if (isExcel2003)
        {
            wb = new HSSFWorkbook(inputStream);
        }
        else
        {
            wb = new XSSFWorkbook(inputStream);
        }
        dataLst = readDate(wb);

        return dataLst;
    }

    /**
     *
     * 读取数据
     *
     * @param wb
     * @return
     * @see [类、类#方法、类#成员]
     */
    private List<List<String>> readDate(Workbook wb)
    {

        List<List<String>> dataLst = new ArrayList<List<String>>();

        /** 得到第一个shell */
        Sheet sheet = wb.getSheetAt(0);

        /** 得到Excel的行数 */
        totalRows = sheet.getPhysicalNumberOfRows();

        /** 得到Excel的列数 */
        if (totalRows >= 1 && sheet.getRow(0) != null)
        {
            totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
        }

        /** 循环Excel的行 */
        for (int r = 2; r < totalRows; r++)
        {
            Row row = sheet.getRow(r);
            if (row == null)
            {
                continue;
            }

            List<String> rowLst = new ArrayList<String>();

            /** 循环Excel的列 */
            for (int c = 0; c < getTotalCells(); c++)
            {

                Cell cell = row.getCell(c);
                String cellValue = "";

                if (null != cell)
                {
                    // 以下是判断数据的类型
                    switch (cell.getCellTypeEnum())
                    {
                        case NUMERIC: // 数字
                            //如果是日期的话
                            if(cell != null && HSSFDateUtil.isCellDateFormatted(cell)){
                                Date d = cell.getDateCellValue();
                                DateFormat formater = new SimpleDateFormat("yyyy/MM/dd");
                                String da = formater.format(d);
                                cellValue = da;
                                break;
                            }
                            cellValue = NumberToTextConverter.toText(cell.getNumericCellValue());
                            break;

                        case STRING: // 字符串
                            cellValue = cell.getStringCellValue();
                            break;

                        case BOOLEAN: // Boolean
                            cellValue = cell.getBooleanCellValue() + "";
                            break;

                        case FORMULA: // 公式
                            cellValue = cell.getCellFormula() + "";
                            break;

                        case BLANK: // 空值
                            cellValue = "";
                            break;

                        case ERROR: // 故障
                            cellValue = "非法字符";
                            break;

                        default:
                            cellValue = "未知类型";
                            break;
                    }
                }

                rowLst.add(cellValue);
            }

            /** 保存第r行的第c列 */
            dataLst.add(rowLst);
        }

        return dataLst;
    }

    /**
     *
     * 根据Excel表格中的数据判断类型得到值
     *
     * @param cell
     * @return
     * @see [类、类#方法、类#成员]
     */
    /*private static String getCellValue(Cell cell)
    {
        String cellValue = "";

        if (null != cell)
        {
            // 以下是判断数据的类型
            switch (cell.getCellType())
            {
                case HSSFCell.CELL_TYPE_NUMERIC: // 数字
                    ;: // 数字
                    if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell))
                    {
                        DateTest theDate = cell.getDateCellValue();
                        SimpleDateFormat dff = new SimpleDateFormat("yyyy-MM-dd");
                        cellValue = dff.format(theDate);
                    }
                    else
                    {
                        DecimalFormat df = new DecimalFormat("0");
                        cellValue = df.format(cell.getNumericCellValue());
                    }
                    break;
                case HSSFCell.CELL_TYPE_STRING: // 字符串
                    cellValue = cell.getStringCellValue();
                    break;

                case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
                    cellValue = cell.getBooleanCellValue() + "";
                    break;

                case HSSFCell.CELL_TYPE_FORMULA: // 公式
                    cellValue = cell.getCellFormula() + "";
                    break;

                case HSSFCell.CELL_TYPE_BLANK: // 空值
                    cellValue = "";
                    break;

                case HSSFCell.CELL_TYPE_ERROR: // 故障
                    cellValue = "非法字符";
                    break;

                default:
                    cellValue = "未知类型";
                    break;
            }

        }
        return cellValue;
    }*/

    /**
     *
     * 根据实体成员变量的类型得到成员变量的值
     *
     * @param realValue
     * @param fields
     * @param f
     * @param cellValue
     * @return
     * @see [类、类#方法、类#成员]
     */
    private static Object getEntityMemberValue(Object realValue, Field[] fields, int f, String cellValue)
    {
        String type = fields[f].getType().getName();
        switch (type)
        {
            case "char":
            case "java.lang.Character":
            case "java.lang.String":
                realValue = cellValue;
                break;
            case "java.util.DateTest":
                realValue = StringUtils.isBlank(cellValue) ? null : DateUtil.strToDate(cellValue, DateUtil.YYYY_MM_DD);
                break;
            case "java.lang.Integer":
                realValue = StringUtils.isBlank(cellValue) ? null : Integer.valueOf(cellValue);
                break;
            case "int":
            case "float":
            case "double":
            case "java.lang.Double":
            case "java.lang.Float":
            case "java.lang.Long":
            case "java.lang.Short":
            case "java.math.BigDecimal":
                realValue = StringUtils.isBlank(cellValue) ? null : new BigDecimal(cellValue);
                break;
            default:
                break;
        }
        return realValue;
    }

    /**
     *
     * 根据路径或文件名选择Excel版本
     *
     *
     * @param filePathOrName
     * @param in
     * @return
     * @throws IOException
     * @see [类、类#方法、类#成员]
     */
    public static Workbook chooseWorkbook(String filePathOrName, InputStream in)
            throws IOException
    {
        /** 根据版本选择创建Workbook的方式 */
        Workbook wb = null;
        boolean isExcel2003 = ExcelVersionUtil.isExcel2003(filePathOrName);

        if (isExcel2003)
        {
            wb = new HSSFWorkbook(in);
        }
        else
        {
            wb = new XSSFWorkbook(in);
        }

        return wb;
    }

    static class ExcelVersionUtil
    {

        /**
         *
         * 是否是2003的excel,返回true是2003
         *
         *
         * @param filePath
         * @return
         * @see [类、类#方法、类#成员]
         */
        public static boolean isExcel2003(String filePath)
        {
            return filePath.matches("^.+\\.(?i)(xls)$");

        }

        /**
         *
         * 是否是2007的excel,返回true是2007
         *
         *
         * @param filePath
         * @return
         * @see [类、类#方法、类#成员]
         */
        public static boolean isExcel2007(String filePath)
        {
            return filePath.matches("^.+\\.(?i)(xlsx)$");

        }

    }

    public static class DateUtil
    {

        // ======================日期格式化常量=====================//

        public static final String YYYY_MM_DDHHMMSS = "yyyy-MM-dd HH:mm:ss";

        public static final String YYYY_MM_DD = "yyyy-MM-dd";

        public static final String YYYY_MM = "yyyy-MM";

        public static final String YYYY = "yyyy";

        public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

        public static final String YYYYMMDD = "yyyyMMdd";

        public static final String YYYYMM = "yyyyMM";

        public static final String YYYYMMDDHHMMSS_1 = "yyyy/MM/dd HH:mm:ss";

        public static final String YYYY_MM_DD_1 = "yyyy/MM/dd";

        public static final String YYYY_MM_1 = "yyyy/MM";

        /**
         *
         * 自定义取值,Date类型转为String类型
         *
         * @param date 日期
         * @param pattern 格式化常量
         * @return
         * @see [类、类#方法、类#成员]
         */
        public static String dateToStr(Date date, String pattern)
        {
            SimpleDateFormat format = null;

            if (null == date)
                return null;
            format = new SimpleDateFormat(pattern, Locale.getDefault());

            return format.format(date);
        }

        /**
         * 将字符串转换成Date类型的时间
         * <hr>
         *
         * @param s 日期类型的字符串<br>
         *            datePattern :YYYY_MM_DD<br>
         * @return java.util.DateTest
         */
        public static Date strToDate(String s, String pattern)
        {
            if (s == null)
            {
                return null;
            }
            Date date = null;
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            try
            {
                date = sdf.parse(s);
            }
            catch (ParseException | java.text.ParseException e)
            {
                e.printStackTrace();
            }
            return date;
        }
    }

}


3.在controller层接收传递过来的excel文件参数

UseEnergyDataDetailsDto实体类

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;

@Getter
@Setter
public class UseEnergyDataDetailsVo implements Serializable {
    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;

    private String workName;

    private String stationName;

    private String deviceNum;

    private String consumptionType;

    private Long consumptionNum;

    private Boolean deleted;

}

controller层调用

@PostMapping(value = "dateImport")
public Result useEnergyDateImport(@RequestParam(value = "gasDataFile", required = false) MultipartFile gasDataFile){
        try {
            //调用工具类ImportExeclUtil
            ImportExeclUtil readExcelUtil = new ImportExeclUtil();
            //读取传入excel文件中的行,类型为List<List<String>>
            List<List<String>> gasRead = readExcelUtil.read(gasDataFile.getInputStream(), true);

            if (CollectionUtils.isNotEmpty(gasRead)) {
                //记录非空,即有数据,将读取到的List<List<String>>类型的数据以流的形式转换为List<UseEnergyDataDetailsDto>
                List<UseEnergyDataDetailsDto> gasList = gasRead.stream().map(e -> {
                    UseEnergyDataDetailsDto gas = new UseEnergyDataDetailsDto();
                        gas.setWorkName(e.get(0));
                        gas.setStationName(e.get(2));
                        gas.setDeviceNum("加热炉");
                        gas.setConsumptionType("用气");
                        gas.setConsumptionNum(Long.valueOf(e.get(18)));
                        return gas;
                }).collect(Collectors.toList());
                //可采用filter过滤一些数据
               // List<UseEnergyDataDetailsDto> gasListDto = gasList.stream().filter(gas -> gas.getStationName() != null && !gas.getStationName().equals("")).collect(Collectors.toList());
            }else{
                //excel文件里数据为空,返回提示信息
            }
            //将得到的gasList数据存入数据库,调用mp的saveBatch批量新增(省略Service、mapper层代码)
            iUseEnergyDataDetailsService.saveBatch(gasList);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要使用Java实现Excel数据导入MySQL数据库,可以按照以下步骤进行: 1. 首先需要导入相关的Java库,包括Apache POI用于读取Excel文件中的内容,以及JDBC用于连接和操作MySQL数据库。 2. 使用Apache POI库读取Excel文件。可以使用HSSFWorkbook类来表示整个Excel文件,然后通过HSSFSheet和HSSFRow来遍历每个工作表和每一行。 3. 在读取Excel文件时,可以通过HSSFCell获取每个单元格的值。根据Excel文件的结构和数据需求,可以自定义解析单元格的逻辑。 4. 将读取到的数据存储在Java对象中,可以使用ArrayList或其他数据结构。 5. 建立与MySQL数据库的连接,使用JDBC的相关API。需要提供数据库的URL、用户名和密码等信息。 6. 创建数据库表,在MySQL中执行CREATE TABLE语句。可以使用PreparedStatement预编译SQL语句,确保数据的安全性和可扩展性。 7. 将读取到的数据插入到MySQL数据库中,可以使用INSERT语句。通过PreparedStatement设置参数,将Java对象中的数据传递给SQL语句。 8. 执行INSERT语句,将数据写入MySQL数据库。 9. 关闭资源,包括关闭Excel文件数据库连接等。 以上就是使用Java实现Excel数据导入MySQL数据库的基本步骤。实际操作中需要考虑异常处理、数据校验和转换等问题,以保证数据的完整性和准确性。同时也可以根据需求进行扩展,例如支持多个工作表、数据更新和删除等操作。 ### 回答2: 要使用Java实现Excel数据导入MySQL数据库,可以按照以下步骤进行: 1. 使用Java中的Apache POI库读取Excel文件。Apache POI是一个开源库,可以用于读取和写入Microsoft Office文档格式,包括Excel文件。通过POI库,可以获取Excel文件中的每个单元格的数据。 2. 创建一个Java对象来表示MySQL数据库连接。可以使用JDBC驱动程序来连接MySQL数据库。可以通过使用`java.sql`包中的`Connection`、`Statement`和`ResultSet`等类,来建立与数据库的连接和执行SQL语句。 3. 在Java中解析Excel文件数据,并将其存储在适当的数据结构中。根据Excel文件的结构,可以将数据存储在Java数组、列表或实体类对象中。 4. 根据数据结构中的数据,编写SQL插入语句。可以使用Java中的字符串操作方法,或者使用SQL模板引擎来创建插入语句。 5. 在Java中执行SQL插入语句,将Excel数据插入到MySQL数据库中。可以使用`Statement`对象的`executeUpdate()`方法来执行插入语句。 6. 最后,关闭数据库连接和Excel文件,释放资源。 注意事项: - 在导入数据之前,需要确保MySQL数据库已经正确地设置和配置,并且在Java项目中添加了MySQL驱动。 - 需要处理Excel文件的格式和结构,确保文件中的表格和数据符合预期。 - 可以使用异常处理机制来处理可能发生的错误,并提供适当的错误处理和日志记录。 通过以上步骤,可以实现Excel数据导入MySQL数据库的功能。使用Java编写代码,可以灵活地处理不同类型的Excel文件数据库表格,提高数据导入的效率和准确性。 ### 回答3: 要通过Java实现Excel数据导入MySQL数据库,可以按照以下步骤进行: 1. 首先,需要导入相关的Java库,如Apache POI用于解析Excel文件,以及MySQL驱动程序用于连接和操作MySQL数据库。 2. 在Java代码中,使用POI库来读取Excel文件的内容。可以使用Workbook类来加载Excel文件,并通过Sheet和Row类来遍历和读取工作表和行。 3. 在读取Excel数据时,可以根据需要进行数据处理和验证。例如,可以检查数据的有效性、格式是否正确,并将数据存储在Java对象中。 4. 英九读取Excel数据后,可以使用MySQL驱动程序来连接到MySQL数据库。将数据库连接信息提供给Java代码,以建立与数据库的连接。 5. 创建适当的数据库和表以存储Excel数据。可以使用MySQL Workbench或命令行工具来创建和管理数据库和表结构。 6. 使用Java代码将Excel数据插入到MySQL数据库中。可以使用PreparedStatement来执行插入操作,并将从Excel读取数据绑定到查询参数中。 7. 在数据插入过程中,可以通过事务管理来确保数据的完整性和一致性。通过使用事务,可以在一次操作中插入所有数据,并在失败时回滚所有操作。 8. 最后,检查和验证数据插入是否成功。可以使用SQL查询来检查插入的数据,并与Excel文件中的数据进行对比。 通过以上步骤,可以实现Excel数据导入MySQL数据库的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值