1、FileUtils后面接的路径是src下的文件,FileUtils的jar包没有测试过,有待验证;
2、解析表格使用jar包是org.apache.poi的jar包;
3、判断某一行是否是表头下面代码中只能作为参考,只是简单的表格样式,要根据时间情况做出调整


  • 解析表格的jar包
     <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.10-FINAL</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.10-FINAL</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml-schemas --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.10-FINAL</version></dependency>
  • FileUtils
<dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>fop-transcoder-allinone</artifactId><version>2.4</version>
</dependency>
  • java代码
    @Testpublic void test() throws Exception {//测试表格数据,表格放在src目录下byte[] fileByte = new byte[0];String url = null;//url为请求表格的url,测试时用的是本地表格,url就随意写满足下面的判断条件即可File file = new File("D:\\collect\\service\\src\\test.xlsx");fileByte = FileUtils.readFileToByteArray(file);url = "https://ajdklmfjdisjufdjasdmfa.xls";if (url.endsWith(".xls") || url.endsWith(".xlsx")) {InputStream fin = null;try {fin = new ByteArrayInputStream(fileByte);Workbook workbook = null;/*if (url.endsWith(".xls")) {workbook = new HSSFWorkbook(fin);} else if (url.endsWith(".xlsx")) {workbook = new XSSFWorkbook(fin);}*///等同于上面注释部分workbook = org.apache.poi.ss.usermodel.WorkbookFactory.create(fin);//获取表格中的sheet,表格中最下面sheet1,sheet2,sheet3for (int a = 0; a < workbook.getNumberOfSheets(); a++) {Sheet sheet = workbook.getSheetAt(a);//判断是否有合并的单元格Map<Integer, org.apache.poi.ss.util.CellRangeAddress> mergeMap = new HashMap<>();for (int i = 0; i < sheet.getNumMergedRegions(); i++) {org.apache.poi.ss.util.CellRangeAddress cellRangeAddress = sheet.getMergedRegion(i);//cellRangeAddress.getFirstRow()获取合并单元格所在行mergeMap.put(cellRangeAddress.getFirstRow(), cellRangeAddress);}//获取最后一行的单元格数int rowNum = sheet.getLastRowNum();int cellNum = sheet.getRow(rowNum - 1).getPhysicalNumberOfCells();int index = 0;boolean flag = false;//遍历sheet表格的每一行,判断表头位置for (int k = 0; k < sheet.getPhysicalNumberOfRows(); k++) {int thisCellNum = sheet.getRow(k).getPhysicalNumberOfCells();//获取当前行的单元格数String first = sheet.getRow(k).getCell(0).toString();//首个单元格String last = sheet.getRow(k).getCell(thisCellNum - 1).toString();//最后一个单元格//当前行无合并的单元格,当前行的单元格数是否与最后一行的单元格数相等,行首和行尾的单元格不为空if (mergeMap.get(k) == null && (thisCellNum == cellNum) && StringUtils.isNotBlank(first) && StringUtils.isNotBlank(last)) {index = k;break;}//根据表头名称判断位置for (int j = 0; j < thisCellNum; j++) {String curCell = sheet.getRow(k).getCell(j).toString();if ("序号".equals(curCell) || "纳税人名称".equals(curCell) || "纳税人识别号".equals(curCell)) {flag = true;break;}}if (flag) {index = k;break;}}//index是表头所在行的位置,下面行为所需表格内容for (int i = index + 1; i < sheet.getPhysicalNumberOfRows(); i++) {JSONObject jsonObject = new JSONObject();Row row = sheet.getRow(i);String f = row.getCell(0).toString();if (StringUtils.isBlank(f) || mergeMap.get(i) != null) {continue;}//遍历一行中的每个单元格for (int j = 0; j < sheet.getRow(i).getPhysicalNumberOfCells(); j++) {String key = sheet.getRow(index).getCell(j).toString();String value = "";if (row.getCell(j) != null) {//获取单元格中的值if (row.getCell(j).getCellType() == Cell.CELL_TYPE_BLANK) {value = "";} else if (row.getCell(j).getCellType() == Cell.CELL_TYPE_NUMERIC) {if (DateUtil.isCellDateFormatted(row.getCell(j))) {Date tempValue = row.getCell(j).getDateCellValue();SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd");value = simpleFormat.format(tempValue);} else {value = String.valueOf(row.getCell(j).getNumericCellValue());}} else if (row.getCell(j).getCellType() == org.apache.poi.ss.usermodel.Cell.CELL_TYPE_STRING) {value = row.getCell(j).getStringCellValue();} else {value = row.getCell(j).toString();}}//存储数据jsonObjectif (key != null && key != "null" && StringUtils.isNotBlank(key)) {jsonObject.put(key, value);}}//输出结果,也可以保存到json中Iterator it = jsonObject.entrySet().iterator();while (it.hasNext()) {Map.Entry entry = (Map.Entry) it.next();System.out.println(entry.getKey() + " = " + entry.getValue());}System.out.println("-----------------------------");}}} catch (Exception e) {e.printStackTrace();} finally {if (fin != null) {fin.close();}}}}
  • 表格样式
      成绩表
序号  年级  姓名  成绩
1   一   张三   88
2   二   张思   99
3   三   张武   90
  • 结果
姓名 = 张三
序号 = 1.0
成绩 = 88.0
年级 = 一
-----------------------------
姓名 = 张思
序号 = 2.0
成绩 = 99.0
年级 = 二
-----------------------------
姓名 = 张武
序号 = 3.0
成绩 = 90.0
年级 = 三
-----------------------------

使用java解析excel表格(包含表头判断)相关推荐

  1. Java解析excel表格

    第一步:引入相关依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxm ...

  2. Java解析excel表格中的图片的方式

    我们要用java解析首先得在项目中引入解析excel的相关包,我们这里使用的是apache的poi-3.12.jar来做开发. 首先获取excel文件,获取文件的方式这里就不细说了,获取到文件后,将文 ...

  3. POI解析Excel表格

    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 这里实现poi解析Excel表格的例子,导入Exc ...

  4. Jxl解析Excel表格数据

    /** * @file ExcelUtils.java * * @brief ExcelUtils.java相关函数 * * * @author * - Dec 28, 2011 xxxx * * @ ...

  5. java访问excel表格_Java读取excel表格(示例代码)

    Java读取excel表格 一般都是用poi技术去读取excel表格的,但是这个技术又是什么呢 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建, ...

  6. Java 操作excel表格 - JXL(Java excel api)

    Java 操作excel表格 Java 操作 Excel 最常用的就是JXL(Java excel api)和POI,用起来挺简单的,不过相应的其功能也并非很强大,够用就行! 首先,下载jxl.jar ...

  7. java解析excel存入map,java解析excel数据,将excel数据转换为实体类,存入数据库

    前一段时间写了一个功能,从数据库中抽取出来的字段,写入到excel文件里:java使用poi把从数据库中取出的数据写入excel 最近实现了一个相反的功能,前台传一个excel文件,在后台解析该exc ...

  8. Java 解析Excel(xls、xlsx两种格式)

    Java 解析Excel(xls.xlsx两种格式) 一.环境 JDK 1.8 二.JAR 1.commons-collections4-4.1.jar 2.poi-3.9-20121203.jar ...

  9. java 浏览器 excel导出excel_使用Java导出Excel表格并由浏览器直接下载——基于POI框架...

    非异步方法 /** * 使用Java导出Excel表格并由浏览器直接下载--基于POI框架 * * @param response * @return * @throws IllegalAccessE ...

最新文章

  1. 『TensorFlow』数据读取类_data.Dataset
  2. java实现线程同步的方法_Java实现线程同步方法及原理详解
  3. SQL 数据库 存储过程 视图
  4. C++之显示构造函数
  5. SpringTest2
  6. c++中友元函数详解
  7. gitlab重置root密码
  8. selenium +chrome headless Adhoc模式渲染网页
  9. 退化射线和净化装置获得法
  10. android客户端设计,Android客户端设计.ppt
  11. 动态加载so库的实现方法与问题处理
  12. 某高手毕生精力总结的电脑技巧
  13. 如何查看浏览器cookie?附2个方法
  14. 示波器在Multisim仿真中如何看信号周期频率
  15. IntelliJ IDEA 破解 到2100年到期
  16. google浏览器Chrome部署HttpWatch
  17. 麒麟v10安装达梦数据库
  18. php获取应用宝app下载连接
  19. xshell 密钥身份验证_使用密钥斗篷和大使边缘堆栈进行集中式身份验证
  20. (实测可用)STM32CubeMX教程-STM32L431RCT6开发板研究串口通信(DMA)

热门文章

  1. C语言基础之10:数组和指针
  2. 安卓brook服务器账号,Brook 端口转发 一键管理脚本,支持DDNS
  3. 惠普mini机箱小欧290安装固态硬盘(SSD)过程
  4. matlab读csv文件问题
  5. 将一句英文中的每个单词首字母大写,其余字母小写
  6. 大学生活费怎么控制在1000以内
  7. OpenGl ES---纹理
  8. 2021UPC第十四场部分题解(ADFL)
  9. word怎么改一张纸的方向_word怎么把其中一张纸横过来
  10. 东北大学计算机学院李捷,计算机与通信工程学院第四次学生代表大会暨第十届院属学生组织换届表彰大会顺利举行...