POI是什么
- POI提供API给Java程序对Microsoft Office格式档案读和写的功能
- Microsoft Office是一套办公软件
POI怎么和项目结合起来使用
- 首先我们需要下载相关jar包
- 从哪里下载POI?
- 网址https://poi.apache.org/
- 第一步
- 从哪里下载POI?
- 第二步
- 第三步
- 下载完成将其解压,然后找到相关jar包,将其导入项目的lib目录下
导出普通的excel表
-
前台
function downloadexcel(){
var v_movieform=document.getElementById("movieform");
v_movieform.action=" <%=request.getContextPath()%>/movie/downloadexcel.fh";
v_movieform.method="post";
v_movieform.submit();
}
b.后台
//查询所有电影
movielist=movieService.findAllMovie(movie);
//创建excel
////生成表
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet("电影列表");
//创建表头行
XSSFRow header = sheet.createRow(0);
//给表头行中的列赋值
header.createCell(0).setCellValue("电影名称");
header.createCell(1).setCellValue("电影类型");
header.createCell(2).setCellValue("电影地区");
header.createCell(3).setCellValue("电影评分");
header.createCell(4).setCellValue("上映时间");
header.createCell(5).setCellValue("电影年代");
//创建样式
XSSFCellStyle style = wb.createCellStyle();
//给样式添加日期格式 style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
//for循环将查询出来的值赋到excel中
for (int i = 0; i < movielist.size(); i++) {
Movie tomovie = movielist.get(i);
XSSFRow row = sheet.createRow(i+1);
XSSFCell movienameCell = row.createCell(0);
movienameCell.setCellValue(tomovie.getMovieName());
XSSFCell typecell = row.createCell(1);
typecell.setCellValue(tomovie.getMovieType().getTypeName());
XSSFCell areacell = row.createCell(2);
areacell.setCellValue(tomovie.getMovieArea().getAreaName());
XSSFCell scorecell = row.createCell(3);
scorecell.setCellValue(tomovie.getScore());
XSSFCell datecell = row.createCell(4);
datecell.setCellValue(tomovie.getShowDate());
//给这一列添加样式
datecell.setCellStyle(style);
XSSFCell agecell = row.createCell(5);
agecell.setCellValue(tomovie.getAge().getAgeName());
}
//导出excell
FileUtil.excelDownload(wb, getResponse());
导出带有样式的excel表
a.前台
function typeexcelstyle(){
var v_movieform=document.getElementById("movieform");
v_movieform.action="<%=request.getContextPath()%>/movie/typeexcelstyle.fh";
v_movieform.method="post";
v_movieform.submit();
}
b.后台
为了代码更清晰易懂将代码进行了重构
1. //查询所有电影
movielist=movieService.findAllMovie(movie);
//生成Excel
XSSFWorkbook wb = builExcel(movielist);(详细内容见一)
//下载
FileUtil.excelDownload(wb, getResponse());
一生成Excel
.private XSSFWorkbook builExcel(List<Movie> movielist) {
//生成表
XSSFWorkbook wb=new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet("电影总数"+movielist.size());
//表头
builTitle(wb, sheet);(详细内容见二)
//构建header
builHeader(wb, sheet);(详细内容见三)
//构建主体
builbody(movielist, wb, sheet);(详细内容见四)
return wb;
}
二表头.
private void builTitle(XSSFWorkbook wb, XSSFSheet sheet) {
//添加样式
XSSFCellStyle titleStyle = wb.createCellStyle();
//合并单元格
CellRangeAddress titlecellrange = new CellRangeAddress(3,5,7,12);
sheet.addMergedRegion(titlecellrange);
//居中样式
titleStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
titleStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
//字体大小
XSSFFont titlefont=wb.createFont();
titlefont.setBold(true);
titlefont.setFontHeightInPoints((short) 22);
titleStyle.setFont(titlefont);
//背景颜色
titleStyle.setFillForegroundColor(HSSFColor.GREEN.index);
titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//创建标题行
XSSFRow titlerow = sheet.createRow(3);
//创建标题列
XSSFCell titlecell = titlerow.createCell(7);
titlecell.setCellValue("电影列表");
titlecell.setCellStyle(titleStyle);
}
三构建header
.private void builHeader(XSSFWorkbook wb, XSSFSheet sheet) {
//构建header
XSSFRow headerrow = sheet.createRow(6);
//创建样式
XSSFCellStyle headerstyle = wb.createCellStyle();
//样式居中
headerstyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
headerstyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
//背景颜色
headerstyle.setFillForegroundColor(HSSFColor.RED.index);
headerstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
String[] headerval={"电影名称","评分","上映时间","地区","类型","电影年代"};
int start=7;
int end=start+headerval.length;
for (int i = start; i < end; i++) {
XSSFCell headerCell = headerrow.createCell(i);
headerCell.setCellValue(headerval[i-start]);
headerCell.setCellStyle(headerstyle);
}
}
四构建主体
.private void builbody(List<Movie> movielist, XSSFWorkbook wb, XSSFSheet sheet) {
//创建样式
XSSFCellStyle bodystyle = wb.createCellStyle();
//修改日期格式
bodystyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
//创建样式
XSSFCellStyle warnstyle=wb.createCellStyle();
//改变背景颜色
warnstyle.setFillForegroundColor(HSSFColor.YELLOW.index);
warnstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//整合两个样式
XSSFCellStyle allstyle=wb.createCellStyle();
allstyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy"));
allstyle.setFillForegroundColor(HSSFColor.YELLOW.index);
allstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//for循环赋值
for (int i = 0; i < movielist.size(); i++) {
Movie movieinfo = movielist.get(i);
XSSFRow bodyrow = sheet.createRow(i+7);
XSSFCell movienamecell = bodyrow.createCell(7);
movienamecell.setCellValue(movieinfo.getMovieName());
XSSFCell scorecell = bodyrow.createCell(8);
scorecell.setCellValue(movieinfo.getScore());
XSSFCell showdatecell = bodyrow.createCell(9);
showdatecell.setCellValue(movieinfo.getShowDate());
showdatecell.setCellStyle(bodystyle);
XSSFCell areacell = bodyrow.createCell(10);
areacell.setCellValue(movieinfo.getMovieArea().getAreaName());
XSSFCell typecell = bodyrow.createCell(11);
typecell.setCellValue(movieinfo.getMovieType().getTypeName());
XSSFCell agecell = bodyrow.createCell(12);
agecell.setCellValue(movieinfo.getAge().getAgeName());
if (movieinfo.getScore()<6) {
movienamecell.setCellStyle(warnstyle);
scorecell.setCellStyle(warnstyle);
showdatecell.setCellStyle(allstyle);
areacell.setCellStyle(warnstyle);
typecell.setCellStyle(warnstyle);
agecell.setCellStyle(warnstyle);
}
}
}
导出代样式分类型的excel表
-
前台
- function typeexcelstyle(){
var v_movieform=document.getElementById("movieform");
v_movieform.action="<%=request.getContextPath()%>/movie/typeexcelstyle.fh";
v_movieform.method="post";
v_movieform.submit();
}
-
后台
- public void typeexcelstyle(){
//查询类型
List<MovieType> querytypeall = movieTypeService.querytypeall();
//查询电影
movielist=movieService.findAllMovie(movie);
//生成excel
XSSFWorkbook wb = new XSSFWorkbook();
for (MovieType movieType : querytypeall) {
//调用类型相同电影的方法
List<Movie> findMovieListByType = findMovieListByType(movieType.getId(), movielist);(见内容五)
XSSFSheet sheet = wb.createSheet(movieType.getTypeName()+findMovieListByType.size()+"条");
(表头,header,主体 ,与 导出带有样式的excel表中二三四一样)
//表头
builTitle(wb, sheet);
//构建header
builHeader(wb, sheet);
//构建主体
builbody(findMovieListByType, wb, sheet);
}
//下载
FileUtil.excelDownload(wb, getResponse());
}
五
判断相同的类型的电影(电影的集合是从已经查询出来中的,不需要再次与数据库交汇)
private List<Movie> findMovieListByType(int typeid,List<Movie> movielist){
List<Movie> movieinfo=new ArrayList<>();
for (Movie movie : movielist) {
if (typeid==movie.getMovieType().getId()) {
movieinfo.add(movie);
}
}
return movieinfo;
}
导出代样式分地区的excel表
-
前台
- function areaexcelstyle(){
var v_movieform=document.getElementById("movieform");
v_movieform.action="<%=request.getContextPath()%>/movie/areaexcelstyle.fh";
v_movieform.method="post";
v_movieform.submit();
}
-
- 后台
- public void areaexcelstyle(){
- 后台
//查询所有地区
List<MovieArea> queryareaall = movieAreaService.queryareaall();
//查询所有电影
movielist=movieService.findAllMovie(movie);
XSSFWorkbook wb = new XSSFWorkbook();
for (MovieArea area : queryareaall) {
// //调用地区相同电影的方法
List<Movie> findMovieListByArea = findMovieListByArea(area.getId(),movielist);(详细见六)
XSSFSheet sheet = wb.createSheet(area.getAreaName()+findMovieListByArea.size()+"条");
(表头,header,主体 ,与 导出带有样式的excel表中二三四一样)
//表头
builTitle(wb, sheet);
//构建header
builHeader(wb, sheet);
//构建主体
builbody(findMovieListByArea, wb, sheet);
}
//下载
FileUtil.excelDownload(wb, getResponse());
}
六
判断相同的地区的电影(电影的集合是从已经查询出来中的,不需要再次与数据库交汇)
private List<Movie> findMovieListByArea(int areaid,List<Movie> movielist){ List<Movie> moviearr=new ArrayList<>();
for (Movie movie : movielist) {
if (areaid==movie.getMovieArea().getId()) {
moviearr.add(movie);
}
}
return moviearr;
}
POI在使用过程中的注意事项
1.前台
注意:1.movieform与from表单中的id一致
2.由于导出需要下载所以不能使用ajax发送请求
3.条件查询需要使用from表单发送请求,并且from表单中的元素都需
要加上name属性
2.后台
注意:1.excel表中的下标从0开始
2.给列调节样式不能够使用一个以上的样式否则会产生覆盖
3.excel表中的单元格中的数据是有数据类型的,默认情况下字符
串靠左,数字靠右
4.如果将文件写到硬盘上就用FileOutPutStrema如果将文件直接
写到客户端浏览器就用response.getOutPutStream
5.如果需要将服务器端相应的数据发送给客户端浏览器则需要
response这个核心对象