当前位置:   article > 正文

java后台导入Excel表数据到数据库_java导入excel到数据库

java导入excel到数据库

一:先确定你的Excel表是.xlsx和.xls哪个

我带领的是xlsx表导入,如果是后者去下面这个大神家找灵感!

java读取excel中的数据(包括.xlsx和.xls)_java 读取 xls和xlxs内容-CSDN博客

二:我的表格样式:

这三张表里面我只要所有绿色标注的数据

数据库:

思考:我要把Excel中的数据导入到value中,我需要用sysid和月份和日期做限制,不能乱导入,所以要人工给他条件

开导:

导入依赖:

  1. <!-- excel工具 -->
  2. <dependency>
  3. <groupId>org.apache.poi</groupId>
  4. <artifactId>poi-ooxml</artifactId>
  5. <version>4.1.2</version>
  6. </dependency>

第一种:三表一起导入:

1:Controller层,因为需要页面把文件路径当成参数传入到后台

  1. @PostMapping("/importData")
  2. @ResponseBody
  3. public AjaxResult importData(MultipartFile file) throws Exception {
  4. // 将MultipartFile转换为File对象
  5. File excelFile = File.createTempFile(file.getOriginalFilename(), ".xlsx");
  6. file.transferTo(excelFile);
  7. XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(excelFile));
  8. int sheetNum = xssfWorkbook.getNumberOfSheets();
  9. List<Object> shuju = new ArrayList<>();
  10. // 使用计数器变量记录行号
  11. int counter = 1;
  12. for (int i = 0; i < sheetNum; i++) {
  13. System.out.println("读取第" + (i+1) + "个sheet");
  14. int sysid=i+2;
  15. System.out.println("这是id为"+(sysid)+"的数据");
  16. counter = 1; // 重置计数器为1
  17. XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
  18. //获取几行数据
  19. int maxRow = sheet.getLastRowNum();
  20. for (int row = 3; row <= maxRow; row += 2) {
  21. XSSFRow xssfRow = sheet.getRow(row);
  22. if (xssfRow == null) {
  23. continue;
  24. }
  25. System.out.println("--------第" + (row + 1) + "行的数据如下"+"--------");
  26. //获取几列数据
  27. int maxCol = xssfRow.getLastCellNum();
  28. System.out.println(counter+"月:");
  29. for (int col = 1; col < maxCol; col++) {
  30. XSSFCell cell = xssfRow.getCell(col);
  31. //如果cell数据为null则跳过
  32. if (cell == null) {
  33. continue;
  34. }
  35. DataFormatter dataFormatter = new DataFormatter();
  36. String cellValue = dataFormatter.formatCellValue(cell);
  37. System.out.print(cellValue + " ");
  38. //添加数据
  39. if(!StrUtil.isEmpty(cellValue)){
  40. shuju.add(cellValue);
  41. }
  42. }
  43. klDeviceYearService.daoru(sysid , counter ,shuju);
  44. System.out.println();
  45. counter++;
  46. shuju.clear();
  47. }
  48. }
  49. return AjaxResult.success(null);
  50. }

2:业务层:

  1. public int daoru(Integer sysid,Integer counter,List<Object> shuju) {
  2. //获取年
  3. int year = Calendar.getInstance().get(Calendar.YEAR);
  4. //日期初始值
  5. int dayOfMonth = 1;
  6. for (Object data : shuju) {
  7. String zhi = data.toString();
  8. //获取当月最大天数
  9. int maxDayOfMonth=getDayOfMonth(year,counter);
  10. int daoru = klDeviceYearMapper.daoru(sysid, counter,dayOfMonth, zhi); // 使用获取到的日期号
  11. dayOfMonth++;
  12. //判断日期是否到达最后一天
  13. if (dayOfMonth>maxDayOfMonth){
  14. dayOfMonth=1;
  15. }
  16. }
  17. //去除小数点
  18. return klDeviceYearMapper.qingchudian();
  19. }
  20. /**
  21. * 根据月来确定当月的总天数
  22. * @param year
  23. * @param month
  24. * @return
  25. */
  26. public int getDayOfMonth(int year, int month) {
  27. YearMonth yearMonth = YearMonth.of(year, month);
  28. return yearMonth.lengthOfMonth();
  29. }

3:mapper:

  1. /**
  2. * 数据库修改
  3. * @param sysid
  4. * @param counter
  5. * @param dayOfMonth
  6. * @param zhi
  7. * @return
  8. */
  9. @Insert("UPDATE kl_device_year SET value=#{zhi} WHERE sys_id=#{sysid} and month=#{counter} and day=#{dayOfMonth}")
  10. Integer daoru(@Param(value = "sysid") Integer sysid, @Param(value = "counter") Integer counter,
  11. @Param(value = "dayOfMonth")Integer dayOfMonth, @Param(value = "zhi") String zhi);
  12. /**
  13. * 清除小数点
  14. * @return
  15. */
  16. @Update("UPDATE kl_device_year SET value =REPLACE(value,'.','');")
  17. Integer qingchudian();

注意:建议从后往前看,因为我的命名不太规范,如果看懵;去除小数点工作可以不做

counter 代表我的月份显示,根据Excel表格看出一行正好是一个月的

dayOfMonth 代表我每天的数据,根据Excel表格可以知道每个数据时一天的

所有参数都是在“控制层”做好配置然后往后传

第二种:单表导入

直接在一个文件里面完成

  1. package com.ruoyi.web.controller.Excel;
  2. import cn.hutool.core.util.StrUtil;
  3. import org.apache.poi.ss.usermodel.DataFormatter;
  4. import org.apache.poi.xssf.usermodel.XSSFCell;
  5. import org.apache.poi.xssf.usermodel.XSSFRow;
  6. import org.apache.poi.xssf.usermodel.XSSFSheet;
  7. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  8. import java.io.FileInputStream;
  9. import java.io.IOException;
  10. import java.sql.Connection;
  11. import java.sql.DriverManager;
  12. import java.sql.PreparedStatement;
  13. import java.sql.SQLException;
  14. import java.time.YearMonth;
  15. import java.util.ArrayList;
  16. import java.util.Calendar;
  17. import java.util.List;
  18. public class excle{
  19. public static void main(String[] args) {
  20. try (XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream("C:\\Users\\Administrator\\Desktop\\河北.xlsx"))) {
  21. int sheetNum = xssfWorkbook.getNumberOfSheets();
  22. List<Object> list = new ArrayList<>();
  23. // 使用计数器变量记录行号
  24. int mounth = 1;
  25. for (int i = 0; i < sheetNum; i++) {
  26. System.out.println("读取第" + (i + 1) + "个sheet");
  27. mounth = 1; // 重置计数器为1
  28. XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
  29. //获取几行数据
  30. int maxRow = sheet.getLastRowNum();
  31. for (int row = 3; row <= maxRow; row += 2) {
  32. XSSFRow xssfRow = sheet.getRow(row);
  33. if (xssfRow == null) {
  34. continue;
  35. }
  36. System.out.println("--------第" + (row + 1) + "行的数据如下"+"--------");
  37. //获取几列数据
  38. int maxCol = xssfRow.getLastCellNum();
  39. System.out.println(mounth+"月:");
  40. for (int col = 1; col < maxCol; col++) {
  41. XSSFCell cell = xssfRow.getCell(col);
  42. //如果cell数据为null则跳过
  43. if (cell == null) {
  44. continue;
  45. }
  46. DataFormatter dataFormatter = new DataFormatter();
  47. String cellValue = dataFormatter.formatCellValue(cell);
  48. System.out.print(cellValue + " ");
  49. //排除cellValue里面的空值
  50. if (!StrUtil.isEmpty(cellValue)) {
  51. list.add(cellValue);
  52. }
  53. }
  54. //添加方法
  55. jia(mounth, list);
  56. System.out.println();
  57. mounth++;
  58. list.clear();
  59. }
  60. System.out.println("添加完成!请去数据库表中核对信息");
  61. }
  62. } catch (IOException e) {
  63. e.printStackTrace();
  64. }
  65. }
  66. /**
  67. * 添加
  68. */
  69. public static void jia(Integer mounth ,List<Object> shuju){
  70. //获取年
  71. int year = Calendar.getInstance().get(Calendar.YEAR);
  72. //天数初始化
  73. int day=1;
  74. Connection conn = null;
  75. PreparedStatement statement=null;
  76. try {
  77. //建立数据库连接
  78. conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/zzy_moni_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&&useSSL=false&serverTimezone=GMT%2B8","Li","123456");
  79. //设置自动提交为false(事务手动控制)
  80. conn.setAutoCommit(false);
  81. //sql
  82. String sql="UPDATE kl_device_year SET value=? WHERE sys_id=? and month=? and day=?";
  83. //创建对象,设置参数
  84. statement=conn.prepareStatement(sql);
  85. for (Object data:shuju){
  86. String zhi = data.toString();
  87. //获取最大天数
  88. int maxDay = getDayOfMonth(year, mounth);
  89. //设置sql参数
  90. statement.setString(1,zhi);
  91. statement.setInt(2,2);
  92. statement.setInt(3,mounth);
  93. statement.setInt(4,day);
  94. //执行sql
  95. statement.executeUpdate();
  96. day++;
  97. //判断日期是否最大值最后一天
  98. if (day>maxDay){
  99. day=1;
  100. }
  101. }
  102. //提交事物
  103. conn.commit();
  104. } catch (SQLException e) {
  105. e.printStackTrace();
  106. //出现异常回滚
  107. try {
  108. if (conn!=null){
  109. conn.rollback();
  110. }
  111. }catch (SQLException ex){
  112. ex.printStackTrace();
  113. }
  114. }finally {
  115. //关闭数据库
  116. try {
  117. if (statement!=null||conn!=null){
  118. statement.close();
  119. }
  120. } catch (SQLException e) {
  121. e.printStackTrace();
  122. }
  123. }
  124. }
  125. /**
  126. * 日期换算
  127. */
  128. public static int getDayOfMonth(int year, int month) {
  129. YearMonth yearMonth = YearMonth.of(year, month);
  130. return yearMonth.lengthOfMonth();
  131. }
  132. }

注意:面对不同的项目直接修改数据库配置,然后修改sql条件,main方法修改文件名称运行即可。

其实不管哪个方法,最主要的就是先把Excel表里面的数据都拿出来,然后再进行操作,吃的都放到嘴边了怎么张嘴还不好决定嘛!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/726125
推荐阅读
相关标签
  

闽ICP备14008679号