使用Java通过POI读取EXCEL中的数据

桃扇骨 2023-10-05 11:29 203阅读 0赞

这里有个Excel,怎么使用java读取excel中的数据呢?

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FkbWluMTIzNDA0_size_16_color_FFFFFF_t_70

文件存放位置:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FkbWluMTIzNDA0_size_16_color_FFFFFF_t_70 1

首先引入poi的jar包

  1. <dependency>
  2. <groupId>org.apache.poi</groupId>
  3. <artifactId>poi</artifactId>
  4. <version>3.17</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.apache.poi</groupId>
  8. <artifactId>poi-ooxml</artifactId>
  9. <version>3.17</version>
  10. </dependency>

我这里写了一个People类,目的是想把Excel中的数据读取出来后转成这个类,方便后续进行操作。

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class People {
  5. private String name;
  6. private String age;
  7. private String sex;
  8. private String area;
  9. }

然后看代码:

  1. /**
  2. * FileName: MyExcelTest
  3. * Author: zp
  4. * Date: 2020/2020/10/11/10:16
  5. * Description:
  6. */
  7. package excel;
  8. import org.apache.poi.ss.usermodel.Cell;
  9. import org.apache.poi.ss.usermodel.CellType;
  10. import org.apache.poi.ss.usermodel.Row;
  11. import org.apache.poi.xssf.usermodel.XSSFCell;
  12. import org.apache.poi.xssf.usermodel.XSSFRow;
  13. import org.apache.poi.xssf.usermodel.XSSFSheet;
  14. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  15. import java.io.IOException;
  16. import java.util.ArrayList;
  17. import java.util.List;
  18. /**
  19. * Description:
  20. * @author zpzp6
  21. * @create 2020/2020/10/11/10:16
  22. * @since 1.0.0
  23. */
  24. public class MyExcelTest {
  25. public static void main(String[] args) throws IOException {
  26. //获取工作簿
  27. XSSFWorkbook book = new XSSFWorkbook("E:\\我的文件\\测试\\测试.xlsx");
  28. //获取工作表
  29. XSSFSheet sheet = book.getSheetAt(0);
  30. // //第一种读取读取所有数据,实际中不需要
  31. // //获取行
  32. // for (Row cells : sheet) {
  33. // //获取单元格
  34. // for (Cell cell : cells) {
  35. // //获取单元格中的内容
  36. // cell.setCellType(CellType.STRING);
  37. // System.out.println(cell.getStringCellValue());
  38. // }
  39. // }
  40. List<People> peopleList=new ArrayList<>();
  41. //普通for循环
  42. //开始索引0 结束索引
  43. int lastRowNum = sheet.getLastRowNum();
  44. System.out.println("最后一行:"+lastRowNum);
  45. for (int i = 1; i <= lastRowNum; i++) {
  46. //获取单元格
  47. XSSFRow row = sheet.getRow(i);
  48. if(row!=null){
  49. List<String> list =new ArrayList<>();
  50. for (Cell cell : row) {
  51. if(cell!=null && !"".equals(cell)){
  52. //此处是把单元格都转换成String类型
  53. cell.setCellType(CellType.STRING);
  54. String cellValue = cell.getStringCellValue();
  55. System.out.println("单元格数据:"+cellValue);
  56. list.add(cellValue);
  57. }
  58. }
  59. if(list.size()>0){
  60. People people = new People(list.get(0), list.get(1), list.get(2), list.get(3));
  61. peopleList.add(people);
  62. }
  63. }
  64. }
  65. for (People people : peopleList) {
  66. System.out.println(people);
  67. }
  68. //释放资源
  69. book.close();
  70. }
  71. }

结果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FkbWluMTIzNDA0_size_16_color_FFFFFF_t_70 2

如果有这样的报错是因为打开了Excel文件,关闭就好。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FkbWluMTIzNDA0_size_16_color_FFFFFF_t_70 3

测试的写得差不多了。那么就来点正式的。

控制层:

  1. @ApiOperation("读取资源文件")
  2. @PostMapping("/read-file")
  3. public List<PartyMember> readFile(@RequestParam(required = false) String path, @RequestParam(required = false) MultipartFile file) throws Exception
  4. {
  5. return new PartyMember().getExcelData(file);
  6. }
  7. MultipartFile 前端可以把excel上传,后端通过此MultipartFile来接收。path可以不写
  8. /**
  9. * @return * @param null
  10. * @Author
  11. * @Description //TODO
  12. * @Date 2019/8/15 12:14
  13. * @Param file :上传的excel文件
  14. */
  15. @Transactional
  16. public List<PartyMember> getExcelData(MultipartFile file) throws IOException {
  17. List<PartyMember> partyMembers = new ArrayList<>();
  18. PartyMember member = new PartyMember();
  19. SnapMember snapMember = new SnapMember();
  20. String fileName = checkFile(file);
  21. //获得Workbook工作薄对象
  22. Workbook workbook = getWorkBook(file);
  23. //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回
  24. List<List<String>> list = new ArrayList<>();
  25. if (workbook != null) {
  26. for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
  27. //获得当前sheet工作表
  28. Sheet sheet = workbook.getSheetAt(sheetNum);
  29. if (sheet == null) {
  30. continue;
  31. }
  32. //获得当前sheet的开始行
  33. int firstRowNum = sheet.getFirstRowNum();
  34. //获得当前sheet的结束行
  35. int lastRowNum = sheet.getLastRowNum();
  36. //循环除了所有行,如果要循环除第一行以外的就firstRowNum+1
  37. for (int rowNum = firstRowNum + 2; rowNum <= lastRowNum; rowNum++) {
  38. //业务逻辑
  39. }
  40. }
  41. workbook.close();
  42. }
  43. return partyMembers;
  44. }
  45. /**
  46. * 检查文件
  47. *
  48. * @param file
  49. * @throws IOException
  50. */
  51. public static String checkFile(MultipartFile file) throws IOException {
  52. //判断文件是否存在
  53. if (null == file) {
  54. throw new CustomException("文件不存在!",HttpStatus.BAD_REQUEST);
  55. }
  56. //获得文件名
  57. String fileName = file.getOriginalFilename();
  58. //判断文件是否是excel文件
  59. if (!StringUtils.lowerCase(fileName).endsWith("xls") && !StringUtils.lowerCase(fileName).endsWith("xlsx")) {
  60. throw new CustomException("不是excel文件",HttpStatus.BAD_REQUEST);
  61. }
  62. return fileName;
  63. }
  64. public static Workbook getWorkBook(MultipartFile file) {
  65. //获得文件名
  66. String fileName = file.getOriginalFilename();
  67. //创建Workbook工作薄对象,表示整个excel
  68. Workbook workbook = null;
  69. try {
  70. //获取excel文件的io流
  71. InputStream is = file.getInputStream();
  72. //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
  73. if (StringUtils.lowerCase(fileName).endsWith("xls")) {
  74. //2003
  75. workbook = new HSSFWorkbook(is);
  76. } else if (StringUtils.lowerCase(fileName).endsWith("xlsx")) {
  77. //2007 及2007以上
  78. workbook = new XSSFWorkbook(is);
  79. }
  80. } catch (IOException e) {
  81. e.getMessage();
  82. }
  83. return workbook;
  84. }
  85. public static String getCellValue(Cell cell) {
  86. String cellValue = "";
  87. if (cell == null) {
  88. return cellValue;
  89. }
  90. //判断数据的类型
  91. //判断数据的类型
  92. switch (cell.getCellTypeEnum()) {
  93. case NUMERIC: //数字
  94. cellValue = stringDateProcess(cell);
  95. break;
  96. case STRING: //字符串
  97. cellValue = String.valueOf(cell.getStringCellValue());
  98. break;
  99. case BOOLEAN: //Boolean
  100. cellValue = String.valueOf(cell.getBooleanCellValue());
  101. break;
  102. case FORMULA: //公式
  103. cellValue = String.valueOf(cell.getCellFormula());
  104. break;
  105. case BLANK: //空值
  106. cellValue = "";
  107. break;
  108. case ERROR: //故障
  109. cellValue = "非法字符";
  110. break;
  111. default:
  112. cellValue = "未知类型";
  113. break;
  114. }
  115. return cellValue;
  116. }
  117. public static String stringDateProcess(Cell cell) {
  118. String result = new String();
  119. if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式
  120. SimpleDateFormat sdf = null;
  121. if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {
  122. sdf = new SimpleDateFormat("HH:mm");
  123. } else {// 日期
  124. sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  125. }
  126. Date date = cell.getDateCellValue();
  127. result = sdf.format(date);
  128. } else if (cell.getCellStyle().getDataFormat() == 58) {
  129. // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)
  130. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
  131. double value = cell.getNumericCellValue();
  132. Date date = org.apache.poi.ss.usermodel.DateUtil
  133. .getJavaDate(value);
  134. result = sdf.format(date);
  135. } else {
  136. double value = cell.getNumericCellValue();
  137. CellStyle style = cell.getCellStyle();
  138. DecimalFormat format = new DecimalFormat();
  139. String temp = style.getDataFormatString();
  140. // 单元格设置成常规
  141. if (temp.equals("General")) {
  142. format.applyPattern("#");
  143. }
  144. result = format.format(value);
  145. }
  146. return result;
  147. }

发表评论

表情:
评论列表 (有 0 条评论,203人围观)

还没有评论,来说两句吧...

相关阅读