一.POI介绍
ApachePOI是用Java编写的免费开源的跨平台的JavaAPI,ApachePOI提供API给Java程序对MicrosoftOffice格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。
依赖导入:
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
二.POI结构
针对不同的文档形式来操作的时候会提供相应的一些类
HSSF - 提供读写Microsoft Excel XLS格式档案的功能
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能
HWPF - 提供读写Microsoft Word DOC格式档案的功能
HSLF - 提供读写Microsoft PowerPoint格式档案的功能
HDGF - 提供读Microsoft Visio格式档案的功能
HPBF - 提供读Microsoft Publisher格式档案的功能
HSMF - 提供读Microsoft Outlook格式档案的功能
HSSF常用类和方法介绍:
- HSSFWorkbook :工作簿,代表一个excel的整个文档
- HSSFWorkbook(); // 创建一个新的工作簿
- HSSFWorkbook(InputStream inputStream); // 创建一个关联输入流的工作簿,可以将一个excel文件封装成工作簿
- HSSFSheet createSheet(String sheetname); 创建一个新的Sheet
- HSSFSheet getSheet(String sheetName); 通过名称获取Sheet
- HSSFSheet getSheetAt(int index); // 通过索引获取Sheet,索引从0开始
- HSSFCellStyle createCellStyle(); 创建单元格样式
- write(OutputStream stream);
- HSSFSheet:工作表
- HSSFRow createRow(int rownum); 创建新行,需要指定行号,行号从0开始
- HSSFRow getRow(int index); 根据索引获取指定的行
- getLastRowNum(); 获取最后的行的索引,没有行或者只有一行的时候返回0
- HSSFRow :行
- HSSFCell createCell(int column); 创建新的单元格
- HSSFCell getCell(shot index);通过下标获取单元格
- short getLastCellNum(); 获取最后的列的索引+1
- HSSFCell:单元格
- getCellType(); 获取单元格类型,如 字符串、数字、布尔等
- String getStringCellValue(); 获取单元格中的字符串值
- HSSFCellStyle :单元格样式
- setFont(Font font); 为单元格设置字体样式
- setAlignment(HorizontalAlignment align); // 设置水平对齐方式
- setVerticalAlignment(VerticalAlignment align); // 设置垂直对齐方式
- setFillPattern(FillPatternType fp);
- setFillForegroundColor(short bg); 设置前景色
- setFillBackgroundColor(short bg); 设置背景颜色
三.读Excel
3.1 导入maven坐标
3.2 使用SpringMVC上传文件,需要用到commons-fileupload
pom依赖:commons-fileupload
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
springmvc.xml中配置文件上传解析器
<!-- 配置文件上传解析器 id:必须是multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="#{1024*1024*5}"/>
<property name="defaultEncoding" value="utf-8"/>
</bean>
3.3 代码编写
前端代码(异步请求):
读取excel,前端可以发送同步请求,也可以发送异步请求
//给"导入"按钮添加单击事件
$("#importActivityBtn").click(function (){
//获取文件名
var activityFileName=$("#activityFile").val();
var suffix=activityFileName.substr(activityFileName.lastIndexOf(".")+1).toLowerCase();
if(suffix!="xls"){
alert("只支持.xls");
return;
}
//获取文件本身
var activityFile = $("#activityFile")[0].files[0];
if(activityFile.size>5*1024*1024){
alert("文件大小不能超过5MB");
return;
}
//FormData是ajax提供的接口,可以模拟键值对向后台提供信息
//FormData最大的优势是不但能提交字符串信息,还能提交二进制数据
var formData = new FormData();
formData.append("activityFile",activityFile);
formData.append("userName","张三");
//发送ajax请求
$.ajax({
url:'workbench/activity/importActivity.do',
data:formData,
processData:false,//设置ajax向后台提交参数之前,是否把参数统一转换成字符串:true--是,false--不是,默认是true
contentType:false,//设置ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码:true--是,false--不是,默认是true
type:'post',
dataType:'json',
success:function (data){
if(data.code=="1"){
alert(data.message);
$("#importActivityModal").modal("hide");
//刷新市场活动列表,显示第一页数据,保持每页条数不变
queryActivityByConditionForPage(1,$("#demo_pag1").bs_pagination('getOption', 'rowsPerPage'));
}else{
alert(data.message);
$("#importActivityModal").modal("show");
}
}
});
});
Controller层:
@RequestMapping("/workbench/activity/importActivity.do")
@ResponseBody
public Object importActivity(MultipartFile activityFile,HttpSession session){
User user= (User) session.getAttribute(Constants.SESSION_USER);
ReturnObject returnObject=new ReturnObject();
try {
//获取输入流
InputStream inputStream = activityFile.getInputStream();
//获取excel文本
HSSFWorkbook wb = new HSSFWorkbook(inputStream);
HSSFSheet sheet = wb.getSheetAt(0);//页的下标,从0开始
HSSFRow row=null;
HSSFCell cell=null;
//解析excel文本,封装成Activity对象
Activity activity=null;
List<Activity> activityList=new ArrayList<>();
for(int i=1;i<=sheet.getLastRowNum();i++){//sheet.getLastRowNum():最后一行的下标
row=sheet.getRow(i);//行的下标,下标从0开始
activity=new Activity();
activity.setId(UUIDUtils.getUUID());
activity.setOwner(user.getId());
activity.setCreateTime(DateUtils.formatDateTime(new Date()));
activity.setCreateBy(user.getId());
for(int j=0;j<row.getLastCellNum();j++){//row.getLastCellNum():最后一列的下标+1
//根据HSSFRow对象,封装一列信息
cell=row.getCell(j);//列的下标,下标从0开始
//获取列中的数据
String cellValueForStr = HSSFUtils.getCellValueForStr(cell);
if(j==0){
activity.setName(cellValueForStr);
}else if(j==1){
activity.setStartDate(cellValueForStr);
}else if(j==2){
activity.setEndDate(cellValueForStr);
}else if(j==3){
activity.setCost(cellValueForStr);
}else if(j==4) {
activity.setDescription(cellValueForStr);
}
}
//每一行封装完之后,添加到list集合
activityList.add(activity);
}
//调用service层方法,保存导入的市场活动
int count=activityService.saveCreateActivityByList(activityList);
if(count>0){
returnObject.setCode(Constants.RETURN_OBJECT_CODE_SUCCESS);
returnObject.setMessage("导入"+count+"条市场活动");
}else{
returnObject.setCode(Constants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("系统忙,请稍后重试...");
}
}catch (Exception e){
e.printStackTrace();
returnObject.setCode(Constants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("系统忙,请稍后重试...");
}
return returnObject;
}
HSSF的工具类:
package com.jm.crm.commons.utils;
import org.apache.poi.hssf.usermodel.HSSFCell;
/**
* 关于excel文件操作的工具类
*/
public class HSSFUtils {
/**
* 从指定的HSSFCell对象中获取列的值
* @return
*/
public static String getCellValueForStr(HSSFCell cell){
String str="";
if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
str=cell.getStringCellValue();
}else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
str=cell.getNumericCellValue()+"";
}else if(cell.getCellType()==HSSFCell.CELL_TYPE_FORMULA){
str=cell.getCellFormula()+"";
}else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
str=cell.getBooleanCellValue()+"";
}else {
str="";
}
return str;
}
}
前端发送同步请求(测试):
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<html>
<head>
<base href="<%=basePath%>">
<title>演示文件上传</title>
</head>
<body>
<!--
文件上传的表单三个条件:
1.表单组件标签必须用:<input type="file">
<input type="text|password|radio|checkbox|hidden|button|submit|reset|file">
<select>,<textarea>等
2.请求方式只能用:post
get:参数通过请求头提交到后台,参数放在URL后边;只能向后台提交文本数据;对参数长度有限制;数据不安全;效率高
post:参数通过请求体提交到后台;既能能提交文件数据,又能够提交二进制数据;理论上对参数长度没有限制;相对安全;效率相对较低
3.表单的编码格式只能用:multipart/form-data
根据HTTP协议的规定,浏览器每次向后台提交参数,都会对参数进行统一编码;默认采用的编码格式是urlencoded,这种编码格式只能对文本数据进行编码;
浏览器每次向后台提交参数,都会首先把所有的参数转换成字符串,然后对这些数据统一进行urlencoded编码;
文件上传的表单编码格式只能用multipart/form-data:enctype="multipart/form-data"
-->
<form action="workbench/activity/fileUpload.do" method="post" enctype="multipart/form-data">
<input type="file" name="myFile"><br>
<input type="text" name="userName"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
四.写Excel
4.1 导入maven坐标
4.2 代码编写
前端代码:
编写excel,前端必须发送同步请求文章来源:https://www.toymoban.com/news/detail-447860.html
//给"批量导出"按钮添加单击事件
$("#exportActivityAllBtn").click(function (){
//发送同步请求
window.location.href="workbench/activity/exportAllActivities.do";
});
//给"选择导出"按钮添加单击事件
$("#exportActivityXzBtn").click(function (){
//收集参数
var checkedIds=$("#tBody input[type='checkbox']:checked");
//拼接ids
var ids="";
$.each(checkedIds,function (i,obj){
ids+="id="+obj.value+"&";
});
ids.substr(0,ids.length-1);
//发送同步请求
window.location.href="workbench/activity/exportActivityXzBtn.do?"+ids;
});
Controller层:文章来源地址https://www.toymoban.com/news/detail-447860.html
@RequestMapping("/workbench/activity/exportAllActivities.do")
public void exportAllActivities(HttpServletResponse response) throws IOException {
//调用service层方法,查询所有市场活动
List<Activity> activityList = activityService.queryAllActivities();
//创建excel文件,并且把activityList写入到excel文件中
HSSFWorkbook wb=new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("市场活动列表");
HSSFRow row = sheet.createRow(0);//第一行
HSSFCell cell = row.createCell(0);//第一列
cell.setCellValue("ID");
cell=row.createCell(1);
cell.setCellValue("所有者");
cell=row.createCell(2);
cell.setCellValue("名称");
cell=row.createCell(3);
cell.setCellValue("开始日期");
cell=row.createCell(4);
cell.setCellValue("结束日期");
cell=row.createCell(5);
cell.setCellValue("成本");
cell=row.createCell(6);
cell.setCellValue("描述");
cell=row.createCell(7);
cell.setCellValue("创建时间");
cell=row.createCell(8);
cell.setCellValue("创建者");
cell=row.createCell(9);
cell.setCellValue("修改时间");
cell=row.createCell(10);
cell.setCellValue("修改者");
//遍历activityList,创建HSSFRow对象,生成所有数据行
if(activityList!=null&&activityList.size()>0){
Activity activity=null;
for(int i=0;i<activityList.size();i++){
activity=activityList.get(i);
//每遍历出一个activity,生成一行
row=sheet.createRow(i+1);
cell=row.createCell(0);
cell.setCellValue(activity.getId());
cell=row.createCell(1);
cell.setCellValue(activity.getOwner());
cell=row.createCell(2);
cell.setCellValue(activity.getName());
cell=row.createCell(3);
cell.setCellValue(activity.getStartDate());
cell=row.createCell(4);
cell.setCellValue(activity.getEndDate());
cell=row.createCell(5);
cell.setCellValue(activity.getCost());
cell=row.createCell(6);
cell.setCellValue(activity.getDescription());
cell=row.createCell(7);
cell.setCellValue(activity.getCreateTime());
cell=row.createCell(8);
cell.setCellValue(activity.getCreateBy());
cell=row.createCell(9);
cell.setCellValue(activity.getEditTime());
cell=row.createCell(10);
cell.setCellValue(activity.getEditBy());
}
}
//把生成的excel文件下载到客户端
//设置响应的内容类型和编码方式
response.setContentType("application/octet-stream;charset=UTF-8");
//实现文件下载的时候,避免浏览器自动打开文件
response.addHeader("Content-Disposition","attachment;filename=activityList.xls");
//从response中获取输出流
ServletOutputStream outputStream = response.getOutputStream();
//将内存中文件写入到客户端
wb.write(outputStream);
//关闭刷新流
wb.close();
outputStream.flush();
}
@RequestMapping("/workbench/activity/exportActivityXzBtn.do")
public void exportActivityXzBtn(HttpServletRequest request,HttpServletResponse response) throws IOException {
//获取参数
String[] ids = request.getParameterValues("id");
//调用service层方法,查询符合条件的市场活动
List<Activity> activityList = activityService.queryActivityByIds(ids);
//创建excel文件,将activityList内容写到excel中
HSSFWorkbook wb=new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("市场活动列表");
HSSFRow row = sheet.createRow(0);//第一行
HSSFCell cell = row.createCell(0);//第一列
cell.setCellValue("ID");
cell=row.createCell(1);
cell.setCellValue("所有者");
cell=row.createCell(2);
cell.setCellValue("名称");
cell=row.createCell(3);
cell.setCellValue("开始日期");
cell=row.createCell(4);
cell.setCellValue("结束日期");
cell=row.createCell(5);
cell.setCellValue("成本");
cell=row.createCell(6);
cell.setCellValue("描述");
cell=row.createCell(7);
cell.setCellValue("创建时间");
cell=row.createCell(8);
cell.setCellValue("创建者");
cell=row.createCell(9);
cell.setCellValue("修改时间");
cell=row.createCell(10);
cell.setCellValue("修改者");
//遍历activityList,创建HSSFRow对象,生成所有数据行
if(activityList!=null&&activityList.size()>0){
Activity activity=null;
for(int i=0;i<activityList.size();i++){
activity=activityList.get(i);
//每遍历出一个activity,生成一行
row=sheet.createRow(i+1);
cell=row.createCell(0);
cell.setCellValue(activity.getId());
cell=row.createCell(1);
cell.setCellValue(activity.getOwner());
cell=row.createCell(2);
cell.setCellValue(activity.getName());
cell=row.createCell(3);
cell.setCellValue(activity.getStartDate());
cell=row.createCell(4);
cell.setCellValue(activity.getEndDate());
cell=row.createCell(5);
cell.setCellValue(activity.getCost());
cell=row.createCell(6);
cell.setCellValue(activity.getDescription());
cell=row.createCell(7);
cell.setCellValue(activity.getCreateTime());
cell=row.createCell(8);
cell.setCellValue(activity.getCreateBy());
cell=row.createCell(9);
cell.setCellValue(activity.getEditTime());
cell=row.createCell(10);
cell.setCellValue(activity.getEditBy());
}
}
//把生成的excel文件下载到客户端
//设置响应内容和编码
response.setContentType("application/octet-stream;charset=UTF-8");
//实现下载的时候,防止浏览器打开文件
response.addHeader("Content-Disposition","attachment;filename=activityList"+UUIDUtils.getUUID()+".xls");
ServletOutputStream outputStream = response.getOutputStream();
//写入客户端
wb.write(outputStream);
//关闭刷新流
wb.close();
outputStream.flush();
}
到了这里,关于Apache-POI读写excel文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!