1、什么是POI?
Apache POI 是 Apache 软件基金会的开放源码函式库,POI 提供 API 给 Java 程序对
Microsoft Office 格式档案读和写的功能。
常用的两种java操作Excel技术POi和JXL的对比:
POI 和 JXL 对 Excel 抽象出来的对象对比
POI | JXL | |
---|---|---|
Excel 文档 | HSSFWorkbook | Workbook |
Excel 的工作表 | HSSFSheet | Sheet |
Excel 的行 | HSSFRow | 无 |
Excel 中的单元格 | HSSFCell | Cell |
Excel 字体 | HSSFFont | |
Excel 单元格样式 | HSSFCellStyle | |
Excel 颜色 | HSSFColor | |
合并单元格 | CellRangeAddress |
2、使用POI实现Excel的导入导出
先来回忆一下window使用Excel和POi对Excel抽象出来的对象
- 创建一个Excel文件 HSSFWorkbook
- 创建一张工作表 HSSFSheet
- 选中一行 HSSFRow
- 选中一个单元格 HSSFCell
- 在单元格中写入数据
- 保存
第一个demo Excel导出
1,导入POI依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.11</version>
</dependency>
2,POI工具类实现导出
案例1:
package com.macw;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.Test;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class PoiTest {
@Test
public void test1() throws IOException {
// 1.创建一个文件对象
HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
// 2.创建一个表对象 通过文件对象创建表对象
HSSFSheet sheet = hssfWorkbook.createSheet("表名:excel数据表");
// 3.获取行对象 下标从0开始
HSSFRow row = sheet.createRow(0);
// 4.获取第1个单元格 下标从0开始
HSSFCell cell = row.createCell(0);
// 5.在单元格中写入数据
cell.setCellValue("Hello Wolld");
// 6.保存在磁盘中 流 文件名的后缀必须有.xls
hssfWorkbook.write(new FileOutputStream("E://demo.xls"));
}
}
```java
案例2:
模拟从数据库查到的所有用户及用户信息导出到excel文件中
@RequestMapping("/exportAll")
public void exportAll(HttpServletResponse resp){
//模拟从数据库查到的所有用户及用户信息
List<User> users = new ArrayList<User>();
User user = new User("1","张三 1","2019-8-10");
User user1 = new User("2","张三 2","2019-8-10");
User user2 = new User("3","张三 3","2019-8-10");
User user3 = new User("4","张三 4","2019-8-10");
User user4 = new User("5","张三 5","2019-8-10");
User user5 = new User("6","张三 6","2019-8-10");
User user6 = new User("7","张三 7","2019-8-10");
User user7 = new User("8","张三 8","2019-8-10");
users.add(user);
users.add(user1);
users.add(user2);
users.add(user3);
users.add(user4);
users.add(user5);
users.add(user6);
users.add(user7);
//创建工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
//创建工作表
HSSFSheet sheet = workbook.createSheet("用户信息");
//设置列宽 第一个参数:列索引 第二个参数:列宽
sheet.setColumnWidth(2, 4500);
//创建导出样式
HSSFCellStyle cellStyle = workbook.createCellStyle();
//创建字体
HSSFFont font = workbook.createFont();
//设置字体颜色
font.setColor(HSSFFont.COLOR_RED);
//设置加粗
font.setBold(true);
//设置字体
font.setFontName("宋体");
//设置居中
cellStyle.setAlignment(CellStyle.ALIGN_CENTER);
//管理字体样式
cellStyle.setFont(font);
//创建标题栏
HSSFRow row = sheet.createRow(0);
HSSFCell cell = null;
String[] titles = {"编号","真实姓名","出生年月"};
for (int i = 0; i < titles.length; i++) {
cell = row.createCell(i);
cell.setCellValue(titles[i]);
//标题行使用样式
cell.setCellStyle(cellStyle);
}
for (int i = 1; i <= users.size(); i++) {
//创建数据行对象
row = sheet.createRow(i);
//数据行第一列设值
cell = row.createCell(0);
cell.setCellValue(users.get(i-1).getUserId());
//数据行第二列设值
cell = row.createCell(1);
cell.setCellValue(users.get(i-1).getRealname());
//数据行第三列设值
cell = row.createCell(2);
cell.setCellValue(users.get(i-1).getDharmaName());
}
String fileName = "用户报表("+new
SimpleDateFormat("yyyy-MM-dd").format(new Date())+").xls";
//处理中文下载名乱码
try {
fileName = new String(fileName.getBytes("utf-8"),"utf-8");
//设置 response
resp.setContentType("application/vnd.ms-excel");
resp.setHeader("content-disposition","attachment;filename="+fileN
ame);
workbook.write(resp.getOutputStream());
workbook.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3、POI导入
@RequestMapping("/uploadIn")
@ResponseBody
public Map uploadIn(MultipartFile multipartFile) throws IOException {
//输出文件名
logger.info("----------文件名为: "+multipartFile.getOriginalFilename());
//1,获取流对象
InputStream inputStream = multipartFile.getInputStream();
// 2.通过poi解析流 得到 Excel文件对象
HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
// 3.通过对象获取数据 得到表
HSSFSheet sheet = workbook.getSheetAt(0);
// 4.通过表 得到行
int lastRowNum = sheet.getLastRowNum();
//定义计数器,计算批量导入多少条数据
int sum = 0;
for (int i = 1; i <= lastRowNum; i++) {
Guru guru = new Guru();
HSSFRow row = sheet.getRow(i);
// 获取单元格
double guruId = row.getCell(0).getNumericCellValue();
guru.setGuruId((int) guruId);
guru.setGuruName(row.getCell(1).getStringCellValue());
guru.setGuruImage(row.getCell(2).getStringCellValue());
guru.setGuruNickname(row.getCell(3).getStringCellValue());
guru.setGuruStatus((int) row.getCell(4).getNumericCellValue());
System.out.println(guru);
//执行添加的SQL
int insert = guruMapper.insert(guru);
//统计添加成功的条数
sum+=insert;
}
Map map = new HashMap();
map.put("flag", sum+"");
return map;
}
页面代码:
<div id="insertFile" class="easyui-dialog" data-options="closed:true">
<form id="insertFileForm" enctype="multipart/form-data" method="post">
上传Excel文件:<input class="easyui-filebox" name="multipartFile"
data-options="required:true,missingMessage:'请选择文件'"/><br/><br/>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-save" onClick="insertFileConfirm()">上传</a>
</form>
</div>
js代码:
//批量上传的文件提交
function insertFileConfirm() {
$("#insertFileForm").form("submit", {
url: "${pageContext.request.contextPath}/guru/uploadIn",
success: function (data) {
console.log(data);
alert("成功添加:"+data.flag+" 条数据");
$("#insertFile").dialog("close");
$("#guruManager").datagrid("reload");
}
})
}