当前位置:   article > 正文

springboot实现简单的excel导入_springboot导入excel文件

springboot导入excel文件

前文其实已经实现了较为复杂的excel导入了,这篇博客就给大家介绍简单的excel表格导入方法

以下是我的excel表格:

以下是我的实体类:

  1. package com.datapojo.bean;
  2. import com.baomidou.mybatisplus.annotation.IdType;
  3. import com.baomidou.mybatisplus.annotation.TableField;
  4. import com.baomidou.mybatisplus.annotation.TableId;
  5. import com.baomidou.mybatisplus.annotation.TableName;
  6. import com.fasterxml.jackson.annotation.JsonFormat;
  7. import io.swagger.annotations.ApiModel;
  8. import io.swagger.annotations.ApiModelProperty;
  9. import lombok.Builder;
  10. import lombok.Getter;
  11. import lombok.Setter;
  12. import java.io.Serializable;
  13. import java.util.Date;
  14. /**
  15. * <p>
  16. *
  17. * </p>
  18. *
  19. * @author yinan
  20. * @since 2024-03-08
  21. */
  22. @Getter
  23. @Setter
  24. @Builder
  25. @TableName("data_standard_manage")
  26. @ApiModel(value = "DataStandardManage对象", description = "")
  27. public class DataStandardManage implements Serializable {
  28. private static final long serialVersionUID = 1L;
  29. @ApiModelProperty("数据库标准id")
  30. @TableId(value = "data_id", type = IdType.AUTO)
  31. private Integer dataId;
  32. @ApiModelProperty("数据标准编号")
  33. @TableField("data_standard_code")
  34. private String dataStandardCode;
  35. @ApiModelProperty("中文名")
  36. @TableField("cn_name")
  37. private String cnName;
  38. @ApiModelProperty("英文名")
  39. @TableField("en_name")
  40. private String enName;
  41. @ApiModelProperty("数据标准说明")
  42. @TableField("data_standard_explain")
  43. private String dataStandardExplain;
  44. @ApiModelProperty("来源机构")
  45. @TableField("source_orgnization")
  46. private String sourceOrgnization;
  47. @ApiModelProperty("数据类型")
  48. @TableField("data_standard_type")
  49. private String dataStandardType;
  50. @ApiModelProperty("数据长度")
  51. @TableField("data_standard_length")
  52. private Double dataStandardLength;
  53. @ApiModelProperty("数据精度")
  54. @TableField("data_standard_accuracy")
  55. private Double dataStandardAccuracy;
  56. @ApiModelProperty("默认值")
  57. @TableField("data_standard_default")
  58. private String dataStandardDefault;
  59. @ApiModelProperty("取值范围的最大值")
  60. @TableField("data_standard_value_max")
  61. private String dataStandardValueMax;
  62. @ApiModelProperty("取值范围的最小值")
  63. @TableField("data_standard_value_min")
  64. private String dataStandardValueMin;
  65. @ApiModelProperty("枚举范围:字典组编码")
  66. @TableField("data_standard_enumeration_range")
  67. private String dataStandardEnumerationRange;
  68. @ApiModelProperty("标准状态(0:未发布 1:已发布 2:已停用)")
  69. @TableField("data_standard_status")
  70. private Integer dataStandardStatus;
  71. @ApiModelProperty("是否为空(0:可为空 1:不为空)")
  72. @TableField("data_standard_is_blank")
  73. private Integer dataStandardIsBlank;
  74. @ApiModelProperty("创建时间")
  75. @TableField("create_time")
  76. @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")
  77. private Date createTime;
  78. @ApiModelProperty("修改数据")
  79. @TableField("update_time")
  80. @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss", timezone = "GMT+8")
  81. private Date updateTime;
  82. }
FileUploadConfig工具类:
  1. public String objectNameFromUploadPath(String filepath) {
  2. // 假设filepath是一个完整的URL形式
  3. // 首先判断是否为空或者不是一个合法的HTTP/HTTPS URL
  4. if (filepath == null || !(filepath.startsWith("http://") || filepath.startsWith("https://"))) {
  5. throw new IllegalArgumentException("Invalid file path: " + filepath);
  6. }
  7. try {
  8. // 将文件路径转换成URL对象
  9. URL url = new URL(filepath);
  10. // 获取URL的路径部分
  11. String path = url.getPath();
  12. // 我们需要去掉路径前的“/”,因为OSS object name是不带前导“/”的
  13. if (path.startsWith("/")) {
  14. path = path.substring(1);
  15. }
  16. // 返回“files/”之后的部分作为object name
  17. int filesIndex = path.indexOf("files/");
  18. if (filesIndex != -1) {
  19. // 返回 "files/" 后面的部分
  20. return path.substring(filesIndex);
  21. } else {
  22. // 如果路径中不含 "files/",直接使用路径作为object name,根据具体情况调整
  23. return path;
  24. }
  25. } catch (MalformedURLException e) {
  26. throw new IllegalArgumentException("Malformed file path URL: " + filepath, e);
  27. }
  28. }

这里的filepath路径我是将前端传给我的文件先上传到oss上面然后获取的链接,你也可以上传到自己本地然后获取文件,或者后台私信我给你具体的上传oss的代码。

接下来是具体的service里面的实现方法:

  1. public R addDataStandardsByExcel(MultipartFile file) throws IOException {
  2. // String filepath = fileUploadConfig.upload(file);
  3. String filepath = "https://yinan-bucket.oss-cn-beijing.aliyuncs.com/files/33ae3fdb-7b9d-46f4-8227-62c0189c08d6.xlsx";
  4. String filename = fileUploadConfig.objectNameFromUploadPath(filepath);
  5. System.out.println("filepath:" + filepath + " filename:" + filename);
  6. String fileName = file.getOriginalFilename();
  7. // if (Objects.equals(filepath, "文件上传失败")) {
  8. // return R.Failed("文件上传失败,无法进行数据导入");
  9. // }
  10. // 初始化变量
  11. boolean notNull = false;
  12. List<DataStandardManage> dsmList = new ArrayList<>();
  13. // InputStream is = fileUploadConfig.download(filename);
  14. InputStream is = file.getInputStream();
  15. // 检查文件格式是否正确
  16. if (!fileName.matches("^.+\\.(?i)(xls)$") && !fileName.matches("^.+\\.(?i)(xlsx)$")) {
  17. // 自定义异常处理
  18. throw new FileNotStandardException(MessageConstant.File_NOT_STANDARD);
  19. }
  20. Workbook workbook = null;
  21. try {
  22. // 判断文件是2003格式的Excel还是2007格式的Excel
  23. boolean isExcel2003 = true;
  24. if (fileName.matches("^.+\\.(?i)(xlsx)$")) {
  25. isExcel2003 = false;
  26. }
  27. // 创建workbook对象
  28. workbook = null;
  29. if (isExcel2003) {
  30. workbook = new HSSFWorkbook(is);
  31. } else {
  32. workbook = new XSSFWorkbook(is);
  33. }
  34. // 获取第一个工作表
  35. Sheet sheet = workbook.getSheetAt(0);
  36. // 判断是否为空
  37. if (sheet != null) {
  38. notNull = false;
  39. } else {
  40. throw new FileIsEmptyException(MessageConstant.FILE_IS_EMPTY);
  41. }
  42. // 遍历工作表的每一行
  43. for (int i = 1; i <= Objects.requireNonNull(sheet).getLastRowNum(); i++) {
  44. Row row = sheet.getRow(i);
  45. // 检查行是否为空
  46. if (row == null) {
  47. continue; // 如果为空,跳过该行
  48. }
  49. DataStandardManage dsm = null;
  50. String dsmCnName = row.getCell(0).getStringCellValue();
  51. String dsmEnName = row.getCell(1).getStringCellValue();
  52. String dsmExplain = row.getCell(2) == null ? null : row.getCell(2).getStringCellValue();
  53. Integer dsmIsBlank = Objects.equals(row.getCell(3).getStringCellValue(), "可为空") ? 0 : 1;
  54. String dsmSourceOrg = row.getCell(4).getStringCellValue();
  55. String dsmDefault = row.getCell(5) == null ? null : row.getCell(5).getStringCellValue();
  56. String dsmDataType = row.getCell(6).getStringCellValue();
  57. Double dsmLength = row.getCell(7) == null ? null : row.getCell(7).getNumericCellValue();
  58. // 格式化科学计数法,取一位整数,如取小数,值如0.0,取小数点后几位就写几个0
  59. DecimalFormat df = new DecimalFormat("0");
  60. Double dsmAccuracy = ObjectUtils.isEmpty(row.getCell(8).getNumericCellValue()) ? null : row.getCell(7).getNumericCellValue();
  61. // Integer dsmAccuracy = dsmAccuracyTemp == null ? null : Integer.parseInt(df.format(dsmAccuracyTemp));
  62. Double dsmMinTemp = ObjectUtils.isEmpty(row.getCell(9).getNumericCellValue()) ? null : row.getCell(8).getNumericCellValue();
  63. String dsmMin = dsmMinTemp == null ? null : df.format(dsmMinTemp);
  64. // String dsmMin=ObjectUtils.isEmpty(row.getCell(9))?null:String.valueOf(row.getCell(9).getNumericCellValue());//使用此方法也可以,但是转换后格式有点不对
  65. Double dsmMaxTemp = ObjectUtils.isEmpty(row.getCell(10).getNumericCellValue()) ? null : row.getCell(10).getNumericCellValue();
  66. String dsmMax = dsmMaxTemp == null ? null : df.format(dsmMaxTemp);
  67. // String dsmMax=ObjectUtils.isEmpty(row.getCell(10))?null:String.valueOf(row.getCell(10).getNumericCellValue());
  68. String dsmMaBiao = row.getCell(11) == null ? null : row.getCell(11).getStringCellValue();
  69. dsm = DataStandardManage.builder()
  70. .dataStandardCode(RandomUtil.generateRandomNumber("BZ",2))
  71. .cnName(dsmCnName)
  72. .enName(dsmEnName)
  73. .dataStandardExplain(dsmExplain)
  74. .sourceOrgnization(dsmSourceOrg)
  75. .dataStandardType(dsmDataType)
  76. .dataStandardIsBlank(dsmIsBlank)
  77. .dataStandardDefault(dsmDefault)
  78. .dataStandardLength(dsmLength)
  79. .dataStandardAccuracy(dsmAccuracy)
  80. .dataStandardValueMin(dsmMin)
  81. .dataStandardValueMax(dsmMax)
  82. .dataStandardEnumerationRange(dsmMaBiao)
  83. .createTime(dateConfig.getDate())
  84. .updateTime(dateConfig.getDate())
  85. .dataStandardStatus(0)
  86. .build();
  87. dsmList.add(dsm);
  88. }
  89. for (DataStandardManage dsm : dsmList) {
  90. dataStandardManageDao.insert(dsm);
  91. System.out.println("插入:" + dsm);
  92. }
  93. is.close();
  94. return R.Success("导入成功");
  95. } catch (Exception e) {
  96. // 处理文件读取异常
  97. e.printStackTrace(); // 这里可以记录日志或者返回相应错误信息
  98. return R.Failed("文件读取异常,无法进行数据导入");
  99. } finally {
  100. // 确保关闭流
  101. if (workbook != null) {
  102. workbook.close();
  103. }
  104. is.close();
  105. }
  106. }

 代码中均做有注释,不懂得可以在评论区进行留言~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/726020
推荐阅读
相关标签
  

闽ICP备14008679号