首页 > 编程语言 >java在线读取Excel内容

java在线读取Excel内容

时间:2023-02-17 19:36:32浏览次数:55  
标签:java 读取 Excel 获取 import org null wb

本示例采用Springboot的Thymeleaf做前台展示,核心还是java代码,想了解Thymeleaf的可以点击​​《SpringBoot入门十六,添加Thymeleaf模板支持》​​进行入门学习,这里就只做关于Excel内容读取的记录了。

1、pom.xml添加相关引用

<!-- 开启thymeleaf模板引擎支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<!-- Excel文件处理配置开始 -->
<!-- 引入poi依赖,Excel2003使用 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.0</version>
</dependency>

<!-- 引入poi-ooxml依赖,Excel2007+使用 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.1</version>
</dependency>
<!-- Excel文件处理配置结束 -->

2、配置文件添加thymeleaf信息

只看核心代码可以忽略此处

# ----------------项目基本配置---------------
## 端口号
#server.port=8080
## 设置项目路径.默认是“/”
#server.servlet.context-path=/qfxUploadExcelDemo

#----------------视图层thymeleaf配置---------------
## 是否开启缓存
spring.thymeleaf.cache=false
## 设置不严格的html
spring.thymeleaf.mode=HTML
## 编码格式
spring.thymeleaf.encoding=utf-8
## 前缀,也就是模板存放的路径,默认是templates,可以不用配置
#spring.thymeleaf.prefix=/view/
## 后缀
spring.thymeleaf.suffix=.html

3、Service

 核心处理就是这里了

import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.qfx.modules.test.service.TestSer;

@Service
public class TestSerImpl {

/**
* 获取Excel信息
* 获取的列数信息以第一行的列数为准,比如说第一行有5列,那么所有行都是取5列的数据信息
*/
public Map<String, List<String[]>> readExcel(MultipartFile file) {
Map<String, List<String[]>> mapData = new TreeMap<String, List<String[]>>();
Workbook wb = null;
List<String[]> sheetDataList = null;
String[] cellArr = null;

try {
// 1.获取的是文件的完整名称,包括文件名称+文件拓展名
String filePath = file.getOriginalFilename();
// 2.获取输入流
InputStream stream = file.getInputStream();

// 3.根据Excel的文件格式生成对应版本的Workbook
if (filePath.endsWith(".xls")) {
wb = new HSSFWorkbook(stream);
} else if (filePath.endsWith(".xlsx")) {
wb = new XSSFWorkbook(stream);
} else {
System.out.println("未知文件格式,不是.xls和.xlsx格式[" + filePath + "]");
}
if (null == wb) {
mapData.put("没有获取到文件", null);
return mapData;
}

Iterator<Sheet> sheetIt = wb.sheetIterator();
// 4.获取工作簿中所有的工作表
while (sheetIt.hasNext()) {
sheetDataList = new LinkedList<String[]>();

// 5.获取一个Sheet页面
Sheet sheet = sheetIt.next();

// 6.指定要获取的列总数,以第一行的列数为准(表头)
int columnCount = sheet.getRow(0).getLastCellNum();

// 7.循环获取行数据
for (Row row : sheet) {
cellArr = new String[columnCount];
// 8.循环获取每个单元格数据信息
for (int i = 0; i < columnCount; i++) {
cellArr[i] = (null == row.getCell(i)) ? "" : row.getCell(i).toString();
}
// 9.添加行数据到集合中
sheetDataList.add(cellArr);
}
// 10.添加Sheet页的数据集合到map中
mapData.put(sheet.getSheetName(), sheetDataList);
}
wb.close();
stream.close();
} catch (IOException e) {
e.printStackTrace();
}

return mapData;
}

/**
* 获取Excel信息(以第一行的列数为准)
* 不限定每行的列数,只要是行中的有效数据,都可以获取到
*/
@Override
public Map<String, List<String[]>> readExcelExt(MultipartFile file) {
Map<String, List<String[]>> mapData = new TreeMap<String, List<String[]>>();
Workbook wb = null;
List<String[]> sheetDataList = null;
String[] cellArr = null;
int cellCount;

try {
// 1.获取的是文件的完整名称,包括文件名称+文件拓展名
String filePath = file.getOriginalFilename();
// 2.获取输入流
InputStream stream = file.getInputStream();

// 3.根据Excel的文件格式生成对应版本的Workbook
if (filePath.endsWith(".xls")) {
wb = new HSSFWorkbook(stream);
} else if (filePath.endsWith(".xlsx")) {
wb = new XSSFWorkbook(stream);
} else {
System.out.println("未知文件格式,不是.xls和.xlsx格式[" + filePath + "]");
}
if (null == wb) {
mapData.put("没有获取到文件", null);
return mapData;
}

Iterator<Sheet> sheetIt = wb.sheetIterator();
// 4.获取工作簿中所有的工作表
while (sheetIt.hasNext()) {
sheetDataList = new LinkedList<String[]>();

// 5.获取一个Sheet页面
Sheet sheet = sheetIt.next();
// 6.循环获取行数据
for (Row row : sheet) {
// 7.获取最后一个不为空的列是第几个(建议使用)
cellCount = row.getLastCellNum();
cellArr = new String[cellCount];

// 8.循环获取每个单元格数据信息
for (int i = 0; i < cellCount; i++) {
cellArr[i] = (null == row.getCell(i)) ? "" : row.getCell(i).toString();
}
// 9.添加行数据到集合中
sheetDataList.add(cellArr);
}
// 10.添加Sheet页的数据集合到map中
mapData.put(sheet.getSheetName(), sheetDataList);
}
wb.close();
stream.close();
} catch (IOException e) {
e.printStackTrace();
}

return mapData;
}

4、Controller

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import com.qfx.modules.test.service.impl.TestSerImpl;

@Controller
@RequestMapping("test")
public class TestCtl {

@Autowired
TestSerImpl testSer;

@RequestMapping("main")
public String firstView(){
return "main";
}

/**
* 获取Excel固定列数量的信息
*
* @param excelFile
* @return
*/
@RequestMapping("upload/excel")
@ResponseBody
public ModelAndView uploadExcel(MultipartFile excelFile) {
Map<String, List<String[]>> excelDataMap = testSer.readExcel(excelFile);

ModelAndView modelAndView = new ModelAndView("list");
modelAndView.addObject("remark", "根据表头获取固定列数据");
modelAndView.addObject("excelDataMap", excelDataMap);

return modelAndView;
}

/**
* 获取Excel固定所有列的信息
*
* @param excelFile
* @return
*/
@RequestMapping("upload/excelExt")
@ResponseBody
public ModelAndView uploadExcelExt(MultipartFile excelFile) {
Map<String, List<String[]>> excelDataMap = testSer.readExcelExt(excelFile);

ModelAndView modelAndView = new ModelAndView("list");
modelAndView.addObject("remark", "获取所有列数据");
modelAndView.addObject("excelDataMap", excelDataMap);

return modelAndView;
}
}

5、页面

5.1 测试页

main.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>main</title>
</head>
<body>
<form name="form1" action="/test/upload/excel" method="post" enctype="multipart/form-data" >
<fieldset>
<legend>Excel上传(根据表头获取固定列数据)</legend>
请选择上传文件:<input type="file" name="excelFile" /><br/><br/>
<input type="reset" name="reset" value="重置" />
<input type="submit" name="button" value="提交" />
</fieldset>
</form>

<form name="form2" action="/test/upload/excelExt" method="post" enctype="multipart/form-data" >
<fieldset>
<legend>Excel上传(获取所有列数据)</legend>
请选择上传文件:<input type="file" name="excelFile" /><br/><br/>
<input type="reset" name="reset" value="重置" />
<input type="submit" name="button" value="提交" />
</fieldset>
</form>
</body>
</html>

页面效果:

根据要获取的列数据类型选择不同模块->选择文件->提交

java在线读取Excel内容_Excel

5.2 展示页

list.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>list</title>
</head>
<body>
<table align="center" width="50%" border="0">
<th th:text="${remark}" />
</table>
<table align="center" width="50%" border="1" cellpadding="5" cellspacing="0" bordercolor="lime" th:each="map,state:${excelDataMap}">
<caption th:text="${map.key + '信息'}"></caption>
<tr th:each="item,state:${map.value}">
<th:block th:if="${state.count == 1}">
<td th:text="编号"></td>
</th:block>
<th:block th:unless="${state.count == 1}">
<td th:text="${(state.count -1) +'/'+ (state.size - 1)}"></td>
</th:block>
<th:block th:each="value,valueState:${item}">
<td th:text="${value}"></td>
</th:block>
</tr>
</table>
</body>
</html>

5.2.2 固定列数据展示

Excel内容

java在线读取Excel内容_java_02

页面展示内容:

仅展示和表头长度相同列的数据

java在线读取Excel内容_Excel_03

5.2.3 所有列数据展示

Excel内容

java在线读取Excel内容_java_02

页面展示内容:

展示所有列的数据

java在线读取Excel内容_java_05

标签:java,读取,Excel,获取,import,org,null,wb
From: https://blog.51cto.com/abcd/6061990

相关文章

  • Java Web(二)MyBatis
    MyBatis一.MyBatis简介1.什么是MyBatisMyBatis是一款优秀的持久层框架,用于简化JDBC开发MyBatis本是Apache的一个开源项目iBatis,2010年这个项目由apachesoftwarefoundati......
  • 安装netbense时提示在此计算机中找不到Java SE开发工具包(JDK)
    在提示信息中显示的需要JDK8或更高版本,这边需要提醒大家不要把jdk8和jdk1.8弄混首先大家打开控制面板找到程序并点击进去点击程序和功能  在电脑上查看是否有jav......
  • java jna框架免注册调用大漠插件及指针参数方法调用
    大漠dll说明1、dm.dll为com类型组件。2、DmReg.dll免注册为常规dll。学习研究时的历程1、因为大漠是com组件,所以可以使用jacob调用大漠。但是不支持免注册dll的使......
  • 在VScode中引入JAVASCript的方式
    打开VSCODE,创建一个html文件夹,shift+!快速创建代码。创建js文件,然后可以在里面定义变量,函数然后在html文件body中引入javaScript ......
  • javascript 高级编程系列 - 迭代器/生成器
    1.迭代器(Iterator)特殊对象,具有迭代过程的接口next()方法每次调用next()方法,返回一个结果对象结果对象有两个属性value(任何类型)和done(布尔类型)当集合的值返回完时......
  • 强记 分支结构语法 java 230217
    单路分支//格式if(条件){条件成立时要做的事情;}//例子intage=19;if(age>18){System.out.println("天天网吧欢迎你");}二路分支//格式if(条件){......
  • 读取properties文件,并将数据赋值给实体类
    @Data@Configuration//读取文件中的数据@PropertySource("classpath:aliyun.properties")//将文件中的数据赋值给实体类中的属性@ConfigurationProperties(prefix="a......
  • 用Java实现邮件发送 SimpleMailMessage
    网上很多用Session方式那种发送,有点过于冗余,需要在POM文件里添加依赖有一个文章更详细可以参考:https://www.php.cn/manual/view/22279.html<dependency><......
  • Java工具类Collections
    一、概述Collections工具类提供了大量针对Collection和Map的操作,都为静态(static)方法,总体可分为四类:排序操作查找、替换操作同步控制设置不可变(只读)集合二、排......
  • 求1到100的总和 java 230217
    新增一个变量s保存总结果给这个s初始化值为0每次得到循环的数字后就给这个变量s进行累加代码:publicclassTest{publicstaticvoidmain(String[]args){//......