POI解析Excel表格

逃离我推掉我的手 2023-06-06 12:01 167阅读 0赞

Apache POIApache软件基金会的开放源码函式库,POI提供APIJava程序对Microsoft Office格式档案读和写的功能。

这里实现poi解析Excel表格的例子,导入Excel

准备食材

第一道菜

在这里插入图片描述

第二道菜

在这里插入图片描述

下锅炸至两面金黄

  1. package com.ftx.poi;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.text.DecimalFormat;
  5. import java.text.SimpleDateFormat;
  6. import java.util.ArrayList;
  7. import java.util.Date;
  8. import java.util.List;
  9. import org.apache.poi.hssf.usermodel.HSSFDataFormat;
  10. import org.apache.poi.hssf.usermodel.HSSFDateUtil;
  11. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  12. import org.apache.poi.ss.usermodel.Cell;
  13. import org.apache.poi.ss.usermodel.Row;
  14. import org.apache.poi.ss.usermodel.Sheet;
  15. import org.apache.poi.ss.usermodel.Workbook;
  16. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  17. public class ParseExcel {
  18. /** * 解析文件的方法 *@param inputStream文件输入流 ,要解析的Excel文件输入流 *@param suffix 后缀名,xls或xlsx,代码决定使用什么方式解析Excel *@param startRow 从第几行开始读取数据 *@return List<String[]> 集合中的一个元素对应一行解析的数据 * 元素为字符串数组类型,数组中的每一个元素对应一列数据 * @throws IOException */
  19. public List<String[]> parseExcel(InputStream inputStream,String suffix,int startRow) throws IOException{
  20. //定义Excel对象变量
  21. Workbook workbook=null;
  22. //判断后缀 决定使用的解析方式,决定如何创建具体的对象
  23. if("xls".equals(suffix)) {
  24. //2003版的解析方式
  25. workbook=new HSSFWorkbook(inputStream);
  26. }else if("xlsx".equals(suffix)) {
  27. //2007
  28. workbook=new XSSFWorkbook(inputStream);
  29. }else {
  30. //未知内容
  31. return null;
  32. }
  33. //获取工作表,Excel分为若干个表,sheet
  34. Sheet sheet = workbook.getSheetAt(0);//得到第一个表格sheet
  35. if(sheet==null) {
  36. return null;
  37. }
  38. //获取表格中最后一行的行号
  39. int lastRowNum = sheet.getLastRowNum();
  40. //最后一行的行号大于startRow
  41. if(lastRowNum<=startRow) {
  42. return null;
  43. }
  44. List<String[]> result=new ArrayList<String[]>();
  45. //定义行变量和单元格变量
  46. Row row=null;
  47. Cell cell=null;
  48. //循环读取
  49. for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) {
  50. row=sheet.getRow(rowNum);
  51. //获取当前行的第一列和最后一列的标记
  52. short firstCellNum = row.getFirstCellNum();
  53. short lastCellNum = row.getLastCellNum();
  54. if(lastCellNum!=0) {
  55. String[] rowArray=new String[lastCellNum];
  56. for(int cellNum=firstCellNum;cellNum<lastCellNum;cellNum++) {
  57. //拿到单元格的值
  58. cell=row.getCell(cellNum);
  59. //判断单元格是否有数据
  60. if(cell==null) {
  61. rowArray[cellNum]=null;
  62. }else {
  63. rowArray[cellNum]=parseCell(cell);
  64. }
  65. }
  66. result.add(rowArray);
  67. }
  68. }
  69. return result;
  70. }
  71. /** * 解析单元格数据(返回字符串) */
  72. private String parseCell(Cell cell) {
  73. String cellStr=null;
  74. //判断单元格的类型
  75. switch (cell.getCellType()) {
  76. case STRING :
  77. //字符串类型单元格
  78. cellStr=cell.getRichStringCellValue().toString();
  79. break;
  80. case BLANK :
  81. //空数据
  82. cellStr="";
  83. break;
  84. case NUMERIC :
  85. //数字类型 包含日期、时间、数字
  86. //判断日期【年月日2016-12-20 | 时分10:20】类型
  87. if(HSSFDateUtil.isCellDateFormatted(cell)) {
  88. //判断具体类型,是日期还是时间
  89. SimpleDateFormat sdf=null;
  90. if(cell.getCellStyle().getDataFormat()==HSSFDataFormat.getBuiltinFormat("h:mm")) {
  91. //时间
  92. sdf=new SimpleDateFormat("HH:mm");
  93. }else {
  94. //日期
  95. sdf=new SimpleDateFormat("yyyy-MM-dd");
  96. }
  97. Date temp = cell.getDateCellValue();
  98. cellStr=sdf.format(temp);
  99. }else {
  100. //数字
  101. double temp=cell.getNumericCellValue();
  102. //数字格式化工具
  103. DecimalFormat format=new DecimalFormat();
  104. //查看单元格中的具体样式类型
  105. String formatStr=cell.getCellStyle().getDataFormatString();
  106. if(formatStr.equals("General")) {
  107. /** * 定义格式化正则 * 保留一位小数 #.# * 保留两位小数#.## */
  108. format.applyPattern("#");
  109. }
  110. cellStr=format.format(temp);
  111. }
  112. break;
  113. default:
  114. cellStr="";
  115. }
  116. return cellStr;
  117. }
  118. }

吃一口嘎嘣脆

  1. public class Test {
  2. public static void main(String[] args) throws IOException {
  3. ParseExcel parser=new ParseExcel();
  4. InputStream inputStream=new FileInputStream("D:\\工作内容\\poiTestTwo.xls");
  5. String suffix="xls";
  6. int startRow=1;
  7. List<String[]> result = parser.parseExcel(inputStream, suffix, startRow);
  8. for(String[] i:result) {
  9. //Arrays.toString("字符串数组") 打印字符串数组,直接打印字符串数组会打印出数组的地址
  10. System.out.println(Arrays.toString(i));
  11. }
  12. }
  13. }

运行测试类,解析出了Excel表格的内容。
在这里插入图片描述
说明:上面的poi只能是解析03和07版本的Excel,如果不是这个版本的Excel的话需要另存为03或07版本然后再进行解析,否则会报错找不到对应的jar包。
在这里插入图片描述
现在只是把Excel表格的内容解析成了字符串数组的形式,如果导入到数据库的话还需要再对其字符串数组进行处理。

思路提示:实现在页面点击按钮导入Excel表格进行导入的功能,使用<input type="file" />表单提交,在controller中接收到的就是File对象,就不用像上面的测试类中写死的样子了。
根据suffix判断表格文件的版本(获取后缀参考图片上传)

  1. public String upload(@RequestParam(value = "pic") MultipartFile pic,@RequestParam Map param,Model model) throws ParseException {
  2. String fileName=pic.getOriginalFilename();//得到文件名
  3. String suffixName=fileName.substring(fileName.lastIndexOf("."));//得到后缀名

发表评论

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

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

相关阅读

    相关 POI解析Excel

    原创作品,允许转载,转载时请务必以超链接形式标明文章  [原始出处][Link 1] 、作者信息和本声明。否则将追究法律责任。 [http://programmer.blog.