您的位置:首页 > 编程语言 > Java开发

Java中用poi技术将报表导出成excel表

2018-03-23 16:21 573 查看
    我相信有很多程序猿都像小M一样遇到过需要将报表导出成excel表的情况,看了网上的demo还是有点蒙的人,看过来,在这里由小M系统的给大家讲解一下。
    在这里,小M用的技术是poi技术,框架是springBoot+Maven,有需要的参考下

(1)、首先,先引入maven所需的依赖包,我这里用的是3.16版本<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.16</version>
</dependency> (2)、引入创建excel表的工具类GradesXLS
package com.xx.test.utils;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

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;

/**
*
* 导出XLS文件
*
*/
public class GradesXLS {

private String path;

public GradesXLS() {
super();
}

//构造函数获取保存excel路径
public GradesXLS(String path) {
super();
this.path = path;
}

public Boolean CreateExcel(List<Object[]> dataList, String[] column, String clientName, HttpServletResponse response) throws Exception {
//创建一个工作簿
HSSFWorkbook workBook = new HSSFWorkbook();
//创建一个工作表,名为:第一页
HSSFSheet sheet = workBook.createSheet(clientName);
//设置单元格的宽度(0:表示第一行的第一个单元格,1:第一行的第二个单元格)
sheet.setColumnWidth((short) 0, 3500);
sheet.setColumnWidth((short) 1, 5000);
sheet.setColumnWidth((short) 2, 5000);
//创建一个单元格,从0开始
HSSFRow row = sheet.createRow((short) 0);
//构造一个数组设置第一行之后的单元格
HSSFCell[] cell = new HSSFCell[column.length];
for (int i = 0; i < column.length; i++) {
cell[i] = row.createCell(i);
cell[i].setCellValue(column[i]);
}

//获得从数据库中查询出来的数据
if (dataList != null && dataList.size() > 0) {
//循环list中的数据
for (int i = 0; i < dataList.size(); i++) {
Object[] objs = dataList.get(i);
HSSFRow dataRow = sheet.createRow(i + 1);
HSSFCell data[] = new HSSFCell[column.length];
for (int j = 0; j < column.length; j++) {
data[j] = dataRow.createCell(j);
String info = String.valueOf(objs[j]);
System.out.println("GradesXLS:" + info);
data[j].setCellValue((info == null) ? "" : info);
}
}

try {
//				String fileName = clientName + "-" + String.valueOf(System.currentTimeMillis()).substring(4, 13) + ".xls";
//设置日期格式
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// new Date()为获取当前系统时间,也可使用当前时间戳
String date = df.format(new Date());
String fileName = clientName + "-" + date + ".xls";//文件名,客户端名+日期+文件后缀名
response.setContentType("application/vnd.ms-excel");//设置内容格式
response.setCharacterEncoding("utf-8");//设置编码格式
response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("gbk"), "iso8859-1"));
//用IO流来写进去
OutputStream os = response.getOutputStream();
workBook.write(os);
os.flush();
return true;
} catch (FileNotFoundException e) {
// TODO: handle exception
e.printStackTrace();
return false;
} catch (IOException e) {
// TODO: handle exception
e.printStackTrace();
return false;
}
}
return false;
}

}
(3)、controller类
@Autowired
private SubjectService subjectService;

/**
* 成绩单
*/

@RequestMapping(value="/subjectList")
@ResponseBody
public Object getSubjectList()  {

return subjectService.getSubjectList();

}
(4)、最重要的service层来了
//成绩单
@Autowired
private SubjectDao subjectDao;
//方法
public Object subjectExcel(HttpServletResponse response) {
String[] column = {"学号","语文","数学","英语","体育"};
String clientName = "成绩单";

//数据组装
ArrayList<Object[]> dataList = new ArrayList<>();
List<SubjectOut> subjectList = subjectDao.subjectExcel(SubjectOut.class);//查询数据库表,将结果放入SubjectOut类中返回
//判断查出来的数据是否为空
if (subjectList != null && subjectList.size() > 0) {
GradesXLS xls = new GradesXLS();//实例化刚才的工具类   //循环添加数据
for (SubjectOut subjectInfo : subjectList) {
Object[] obj = {subjectInfo.getId(),subjectInfo.getChinese(),subjectInfo.getMath(),subjectInfo.getSports()};
dataList.add(obj);
}
try {
return xls.CreateExcel(dataList,column,clientName,response);//将工具类创建出的excel返会下载
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}

(5)、dao层就自己写吧,这个比较简单
(6)、懒得写数据表的话,我给大家贴出来一个CREATE TABLE `tb_subject` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`chinese` varchar(255) DEFAULT NULL,
`math` varchar(255) DEFAULT NULL,
`english` varchar(255) DEFAULT NULL,
`sports` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of tb_subject
-- ----------------------------
INSERT INTO `tb_subject` VALUES ('1', '98', '100', '87', '90');
INSERT INTO `tb_subject` VALUES ('2', '88', '98', '86', '100');
INSERT INTO `tb_subject` VALUES ('3', '84', '85', '86', '87');
INSERT INTO `tb_subject` VALUES ('4', '91', '92', '93', '94');
INSERT INTO `tb_subject` VALUES ('5', '84', '87', '89', '97');
INSERT INTO `tb_subject` VALUES ('6', '91', '94', '95', '92');
INSERT INTO `tb_subject` VALUES ('7', '94', '92', '97', '91');
INSERT INTO `tb_subject` VALUES ('8', '75', '78', '79', '90');
INSERT INTO `tb_subject` VALUES ('9', '84', '72', '73', '91');
INSERT INTO `tb_subject` VALUES ('10', '85', '81', '72', '73');好了,分享到此结束,有问题在下面留言呀,小M为您解答,谢谢大家,觉得好的赞一个,,muma
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: