1、概述

简单的说:报表就是用表格、图表等格式来动态显示数据,可以用公式表示为:“报表 = 多样的格式 + 动态的数据”。

1、环境搭建

功能说明:整个案例我们操作用户表,做一个企业员工(用户)数据的导入导出。

我们使用SpringBoot+通用mapper+vue方式搭建开发环境。
项目初始代码:

链接:https://pan.baidu.com/s/1HskpHp48Qs2cUiuEbM85zw
提取码:vn37

1、数据库准备

CREATE DATABASE /*!32312 IF NOT EXISTS*/`xiaobear-report` /*!40100 DEFAULT CHARACTER SET utf8 */;USE `xiaobear-report`;SET FOREIGN_KEY_CHECKS=0;-- ----------------------------
-- Table structure for tb_dept
-- ----------------------------
DROP TABLE IF EXISTS `tb_dept`;
CREATE TABLE `tb_dept` (`id` bigint(20) DEFAULT NULL COMMENT '部门编号',`dept_name` varchar(100) DEFAULT NULL COMMENT '部门编号'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of tb_dept
-- ----------------------------
INSERT INTO `tb_dept` VALUES ('5', '资产管理部');
INSERT INTO `tb_dept` VALUES ('6', '质量监察部');
INSERT INTO `tb_dept` VALUES ('7', '营销部');
INSERT INTO `tb_dept` VALUES ('1', '销售部');
INSERT INTO `tb_dept` VALUES ('2', '人事部');
INSERT INTO `tb_dept` VALUES ('3', '财务部');
INSERT INTO `tb_dept` VALUES ('4', '技术部');-- ----------------------------
-- Table structure for tb_province
-- ----------------------------
DROP TABLE IF EXISTS `tb_province`;
CREATE TABLE `tb_province` (`id` bigint(50) NOT NULL,`name` varchar(100) DEFAULT NULL COMMENT '省份或直辖市或特别行政区名称',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of tb_province
-- ----------------------------
INSERT INTO `tb_province` VALUES ('1', '北京市');
INSERT INTO `tb_province` VALUES ('2', '天津市');
INSERT INTO `tb_province` VALUES ('3', '上海市');
INSERT INTO `tb_province` VALUES ('4', '重庆市');
INSERT INTO `tb_province` VALUES ('5', '河北省');
INSERT INTO `tb_province` VALUES ('6', '山西省');
INSERT INTO `tb_province` VALUES ('7', '辽宁省');
INSERT INTO `tb_province` VALUES ('8', '吉林省');
INSERT INTO `tb_province` VALUES ('9', '黑龙江省');
INSERT INTO `tb_province` VALUES ('10', '江苏省');
INSERT INTO `tb_province` VALUES ('11', '浙江省');
INSERT INTO `tb_province` VALUES ('12', '安徽省');
INSERT INTO `tb_province` VALUES ('13', '福建省');
INSERT INTO `tb_province` VALUES ('14', '江西省');
INSERT INTO `tb_province` VALUES ('15', '山东省');
INSERT INTO `tb_province` VALUES ('16', '河南省');
INSERT INTO `tb_province` VALUES ('17', '湖北省');
INSERT INTO `tb_province` VALUES ('18', '湖南省');
INSERT INTO `tb_province` VALUES ('19', '广东省');
INSERT INTO `tb_province` VALUES ('20', '海南省');
INSERT INTO `tb_province` VALUES ('21', '四川省');
INSERT INTO `tb_province` VALUES ('22', '贵州省');
INSERT INTO `tb_province` VALUES ('23', '云南省');
INSERT INTO `tb_province` VALUES ('24', '陕西省');
INSERT INTO `tb_province` VALUES ('25', '甘肃省');
INSERT INTO `tb_province` VALUES ('26', '青海省');
INSERT INTO `tb_province` VALUES ('27', '台湾省');
INSERT INTO `tb_province` VALUES ('28', '内蒙古自治区');
INSERT INTO `tb_province` VALUES ('29', '广西壮族自治区');
INSERT INTO `tb_province` VALUES ('30', '西藏自治区');
INSERT INTO `tb_province` VALUES ('31', '宁夏回族自治区');
INSERT INTO `tb_province` VALUES ('32', '新疆维吾尔自治区');
INSERT INTO `tb_province` VALUES ('33', '香港特别行政区');
INSERT INTO `tb_province` VALUES ('34', '澳门特别行政区');-- ----------------------------
-- Table structure for tb_resource
-- ----------------------------
DROP TABLE IF EXISTS `tb_resource`;
CREATE TABLE `tb_resource` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(50) DEFAULT NULL,`price` double(10,1) DEFAULT NULL,`user_id` bigint(20) DEFAULT NULL,`need_return` tinyint(1) DEFAULT NULL COMMENT '是否需要归还',`photo` varchar(200) DEFAULT NULL COMMENT '照片',PRIMARY KEY (`id`),KEY `fk_user_id` (`user_id`),CONSTRAINT `fk_user_id` FOREIGN KEY (`user_id`) REFERENCES `tb_user` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of tb_resource
-- ----------------------------
INSERT INTO `tb_resource` VALUES ('1', '记录本', '2.0', '3', '0', '\\resource_photos\\3\\1.jpg');
INSERT INTO `tb_resource` VALUES ('2', '笔记本电脑', '7000.0', '3', '1', '\\resource_photos\\3\\2.jpg');
INSERT INTO `tb_resource` VALUES ('3', '办公桌', '1000.0', '3', '1', '\\resource_photos\\3\\3.jpg');
INSERT INTO `tb_resource` VALUES ('4', '订书机', '50.0', '4', '1', '\\resource_photos\\4\\1.jpg');
INSERT INTO `tb_resource` VALUES ('5', '双面胶带', '5.0', '4', '0', '\\resource_photos\\4\\2.jpg');
INSERT INTO `tb_resource` VALUES ('6', '资料文件夹', '10.0', '4', '0', '\\resource_photos\\4\\3.jpg');
INSERT INTO `tb_resource` VALUES ('7', '打印机', '1200.0', '4', '1', '\\resource_photos\\4\\4.jpg');-- ----------------------------
-- Table structure for tb_user
-- ----------------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',`user_name` varchar(100) DEFAULT NULL COMMENT '姓名',`phone` varchar(15) DEFAULT NULL COMMENT '手机号',`province` varchar(50) DEFAULT NULL COMMENT '省份',`city` varchar(50) DEFAULT NULL COMMENT '城市',`salary` int(10) DEFAULT NULL,`hire_date` datetime DEFAULT NULL COMMENT '入职日期',`dept_id` bigint(20) DEFAULT NULL COMMENT '部门编号',`birthday` datetime DEFAULT NULL COMMENT '出生日期',`photo` varchar(200) DEFAULT NULL COMMENT '照片路径',`address` varchar(300) DEFAULT NULL COMMENT '现在住址',PRIMARY KEY (`id`),KEY `fk_dept` (`dept_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of tb_user
-- ----------------------------
INSERT INTO `tb_user` VALUES ('1', '大一', '13800000001', '北京市', '北京市', '11000', '2001-01-01 21:18:29', '1', '1981-03-02 00:00:00', '\\static\\user_photos\\1.jpg', '北京市西城区宣武大街1号院');
INSERT INTO `tb_user` VALUES ('2', '不二', '13800000002', '河北省', '石家庄市', '12000', '2002-01-02 21:18:29', '2', '1982-03-02 00:00:00', '\\static\\user_photos\\2.jpg', '北京市西城区宣武大街2号院');
INSERT INTO `tb_user` VALUES ('3', '张三', '13800000003', '河北省', '石家庄市', '13000', '2003-03-03 21:18:29', '3', '1983-03-02 00:00:00', '\\static\\user_photos\\3.jpg', '北京市西城区宣武大街3号院');
INSERT INTO `tb_user` VALUES ('4', '李四', '13800000004', '河北省', '石家庄市', '14000', '2004-02-04 21:18:29', '4', '1984-03-02 00:00:00', '\\static\\user_photos\\4.jpg', '北京市西城区宣武大街4号院');
INSERT INTO `tb_user` VALUES ('5', '王五', '13800000005', '河北省', '唐山市', '15000', '2005-03-05 21:18:29', '5', '1985-03-02 00:00:00', '\\static\\user_photos\\5.jpg', '北京市西城区宣武大街5号院');
INSERT INTO `tb_user` VALUES ('6', '赵六', '13800000006', '河北省', '承德市省', '16000', '2006-04-06 21:18:29', '6', '1986-03-02 00:00:00', '\\static\\user_photos\\6.jpg', '北京市西城区宣武大街6号院');
INSERT INTO `tb_user` VALUES ('7', '沈七', '13800000007', '河北省', '秦皇岛市', '17000', '2007-06-07 21:18:29', '7', '1987-03-02 00:00:00', '\\static\\user_photos\\7.jpg', '北京市西城区宣武大街7号院');
INSERT INTO `tb_user` VALUES ('8', '酒八', '13800000008', '河北省', '秦皇岛市', '18000', '2008-07-08 21:18:29', '6', '1988-03-02 00:00:00', '\\static\\user_photos\\8.jpg', '北京市西城区宣武大街8号院');
INSERT INTO `tb_user` VALUES ('9', '第九', '13800000009', '山东省', '德州市', '19000', '2009-03-09 21:18:29', '1', '1989-03-02 00:00:00', '\\static\\user_photos\\9.jpg', '北京市西城区宣武大街9号院');
INSERT INTO `tb_user` VALUES ('10', '石十', '13800000010', '山东省', '青岛市', '20000', '2010-07-10 21:18:29', '4', '1990-03-02 00:00:00', '\\static\\user_photos\\10.jpg', '北京市西城区宣武大街10号院');
INSERT INTO `tb_user` VALUES ('11', '肖十一', '13800000011', '山东省', '青岛市', '21000', '2011-12-11 21:18:29', '4', '1991-03-02 00:00:00', '\\static\\user_photos\\11.jpg', '北京市西城区宣武大街11号院');
INSERT INTO `tb_user` VALUES ('12', '星十二', '13800000012', '山东省', '青岛市', '22000', '2012-05-12 21:18:29', '4', '1992-03-02 00:00:00', '\\static\\user_photos\\12.jpg', '北京市西城区宣武大街12号院');
INSERT INTO `tb_user` VALUES ('13', '钗十三', '13800000013', '山东省', '济南市', '23000', '2013-06-13 21:18:29', '3', '1993-03-02 00:00:00', '\\static\\user_photos\\13.jpg', '北京市西城区宣武大街13号院');
INSERT INTO `tb_user` VALUES ('14', '贾十四', '13800000014', '山东省', '威海市', '24000', '2014-06-14 21:18:29', '2', '1994-03-02 00:00:00', '\\static\\user_photos\\14.jpg', '北京市西城区宣武大街14号院');
INSERT INTO `tb_user` VALUES ('15', '甄世武', '13800000015', '山东省', '济南市', '25000', '2015-06-15 21:18:29', '4', '1995-03-02 00:00:00', '\\static\\user_photos\\15.jpg', '北京市西城区宣武大街15号院');-- ----------------------------
-- Table structure for tb_month
-- ----------------------------
DROP TABLE IF EXISTS `tb_month`;
CREATE TABLE `tb_month` (`name` varchar(2) DEFAULT NULL COMMENT '月份'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ----------------------------
-- Records of tb_month
-- ----------------------------
INSERT INTO `tb_month` VALUES ('01');
INSERT INTO `tb_month` VALUES ('02');
INSERT INTO `tb_month` VALUES ('03');
INSERT INTO `tb_month` VALUES ('04');
INSERT INTO `tb_month` VALUES ('05');
INSERT INTO `tb_month` VALUES ('06');
INSERT INTO `tb_month` VALUES ('07');
INSERT INTO `tb_month` VALUES ('08');
INSERT INTO `tb_month` VALUES ('09');
INSERT INTO `tb_month` VALUES ('10');
INSERT INTO `tb_month` VALUES ('11');
INSERT INTO `tb_month` VALUES ('12');

2、页面搭建

整个页面都是已经搭建好的,主要还是后台的实现

3、启动项目

访问地址:http://localhost:8080/list.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OAv3Y2Gk-1629427251204)(Java报表数据可视化学习笔记.assets/image-20210728225110033.png)]

1、Excel简介

在企业级应用开发中,Excel报表是一种最常见的报表需求。Excel报表开发一般分为两种形式:
1、为了方便操作,基于Excel的报表批量上传数据,也就是把Excel中的数据导入到系统中。
2、通过java代码生成Excel报表。也就是把系统中的数据导出到Excel中,方便查阅。

1、Excel版本

目前世面上的Excel分为两个大的版本Excel2003Excel2007及以上两个版本;

Excel2003 Excel2007
后缀 xls xlsx
结构 二进制格式,核心是复合文档类型结构 XML类型结构
单sheet数量 行:65525,列:256 行:1048576,列:16384
特点 存储容量有限 基于xml压缩,占用空间小,操作效率高

2、常见的Excel操作工具

Java中常见的用来操作Excel的方式一般有2种:JXLPOI

1、JXL

JXL只能对Excel进行操作,属于比较老的框架,它只支持到Excel 95-2000的版本。现在已经停止更新和维护.

2、POI

POI是apache的项目,可对微软的Word,Excel,PPT进行操作,包括office2003和2007,Excle2003和2007。poi现在一直有更新。所以现在主流使用POI。

Apache POI是Apache软件基金会的开源项目,由Java编写的免费开源的跨平台的 Java API,ApachePOI提供API给Java语言操作Microsoft Office的功能。

API对象介绍

Excle2003 Excle2007
工作簿(WorkBook) HSSFWordBook XSSFWorkBook
工作表(Sheet) HSSFSheet XSSFSheet
行(Row) HSSFRow XSSFRow
单元格(Cell) HSSFCell XSSCell

2、JXL导出excel

1、JXL导出基本知识点

通过WritableWorkbook,WritableSheet,Label这三个对象我们就可以实现Excel文件的导出工作。

1、 创建可写入的Excel工作薄

WritableWorkbook workbook= Workbook.createWorkbook(输出流);

2、创建工作表

WritableSheet sheet= workbook.createSheet(工作表的名称, 工作表的索引值);

3、创建单元格,添加文本类单元格

Label labelC = new Label(列索引值, 行索引值, "单元格中的内容");sheet.addCell(labelC);

4、写入到文件

workbook.write();// 写入数据

5、释放资源:

workbook.close();// 关闭文件

2、代码实现

/*** 通过JSL进行下载* @param response*/
public void downLoadByJxl(HttpServletResponse response){try{//输出流ServletOutputStream outputStream = response.getOutputStream();//创建一个工作簿WritableWorkbook wb = Workbook.createWorkbook(outputStream);//创建一个sheet页 s:sheet名 i:sheet号WritableSheet wbSheet = wb.createSheet("xiaobear第一个报表文件", 0);//设置列宽 col:列 wid:宽dwbSheet.setColumnView(0,5);wbSheet.setColumnView(1,8);wbSheet.setColumnView(2,8);wbSheet.setColumnView(3,8);wbSheet.setColumnView(4,10);wbSheet.setColumnView(5,30);//创建单元格// Label labelC = new Label(列索引值, 行索引值, "单元格中的内容");//sheet.addCell(labelC);Label label = null;String[] titles = new String[]{"编号","名称","电话","生日","入职日期","住址"};//处理标题for (int i = 0; i < titles.length; i++) {label = new Label(i, 0, titles[i]);wbSheet.addCell(label);}//查询数据进行处理List<User> users = findAll();//行初始化值int rowIndex = 1;for (User user : users) {//编号label = new Label(0, rowIndex, user.getId().toString());wbSheet.addCell(label);//名称label = new Label(1, rowIndex, user.getUserName());wbSheet.addCell(label);//电话label = new Label(2, rowIndex, user.getPhone());wbSheet.addCell(label);//生日label = new Label(3, rowIndex, sd.format(user.getBirthday()));wbSheet.addCell(label);//入职日期label = new Label(4, rowIndex, sd.format(user.getHireDate()));wbSheet.addCell(label);//地址label = new Label(5, rowIndex, user.getAddress());wbSheet.addCell(label);//行+1rowIndex++;}//导出的文件名称String fileName = "JXL导出示例.xls";// 设置文件的打开方式和mime类型response.setHeader("Content-Disposition","attachment;filename="  + new String(fileName.getBytes(),"ISO8859-1"));response.setContentType("application/vnd.ms-excel");//导出wb.write();//关闭资源wb.close();outputStream.close();}catch (Exception e){e.printStackTrace();}
}

3、POI操作Excel

<!--poi所需要的依赖-->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version>
</dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.1</version>
</dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.0.1</version>
</dependency>

1、版本之间的区别

在POI包中有如下几个主要对象和excel的几个对象对应:

对应excel名称 低版本中的类名 高版本中的类名
工作簿 HSSFWorkbook XSSFWorkbook
工作表 HSSFSheet XSSFSheet
HSSFRow XSSFRow
单元格 HSSFCell XSSFCell
单元格样式 HSSFCellStyle XSSFCellStyle

1、2003操作excel

/*** 通过低版本创建excel*/
public static void CreateExcelBy2003() throws IOException {//创建一个工作簿HSSFWorkbook hssfWorkbook = new HSSFWorkbook();//创建一个sheet页HSSFSheet sheet = hssfWorkbook.createSheet("低版本");//创建行HSSFRow row = sheet.createRow(0);//创建列HSSFCell cell = row.createCell(0);//创建单元格cell.setCellValue("xiaobear so nice");hssfWorkbook.write(new FileOutputStream("D://test.xls"));}

2、2007操作excel

/*** 通过高版本创建excel*/
public static void CreateExcelBy2007() throws IOException {//创建一个工作簿Workbook workbook = new XSSFWorkbook();//创建一个sheet页Sheet sheet = workbook.createSheet("低版本");//创建行Row row = sheet.createRow(0);//创建列Cell cell = row.createCell(0);//创建单元格cell.setCellValue("xiaobear so nice");workbook.write(new FileOutputStream("D://test.xls"));}

2、数据导入

数据的导入就是读取excel中的内容,转成对象插入到数据库中

导入上图的数据

1、思路

一般来说,即将导入的文件,每个列代表什么意思基本上都是固定的,比如第1列就是用户姓名,最后一列就是用户的现住址,并且在做excel时对每个列的类型都是有要求的,这样就可以给我们开发带来很大的简便。

最终的目标就是读取每一行数据,把数据转成用户的对象,保存到表中

步骤

  1. 根据上传的文件创建Workbook
  2. 获取到第一个sheet工作表
  3. 从第二行开始读取数据
  4. 读取每一个单元格,把内容放入到用户对象的相关的属性中

2、代码实现

/*** 用户导入数据* @param file* @throws IOException* @throws ParseException*/
public void importUserByExcel(MultipartFile file) throws IOException, ParseException {//通过文件流返回一个工作薄XSSFWorkbook wb = new XSSFWorkbook(file.getInputStream());//获取第一个sheet页XSSFSheet sheet = wb.getSheetAt(0);//获取最后一行int lastRowNum = sheet.getLastRowNum();//遍历获取数据 开始循环每行,获取每行的单元格中的值,放入到user属性中User user;for (int i = 1; i <= lastRowNum ; i++) {user = new User();String userName = sheet.getRow(i).getCell(0).getStringCellValue();user.setUserName(userName);//手机号String phone = null;try {phone = sheet.getRow(i).getCell(1).getStringCellValue();} catch (IllegalStateException e) {phone = sheet.getRow(i).getCell(1).getNumericCellValue()+"";}user.setPhone(phone);//省份String province = sheet.getRow(i).getCell(2).getStringCellValue();//城市String city = sheet.getRow(i).getCell(3).getStringCellValue();user.setCity(city);// 因为在填写excel中的数据时就可以约定这个列只能填写数值,所以可以直接用getNumericCellValue方法//工资Integer salary = ((Double)sheet.getRow(i).getCell(4).getNumericCellValue()).intValue();user.setSalary(salary);//入职日期String hireDateStr = sheet.getRow(i).getCell(5).getStringCellValue();Date hireDate = sd.parse(hireDateStr);user.setHireDate(hireDate);//出生日期String birthdayStr = sheet.getRow(i).getCell(6).getStringCellValue();Date birthday = sd.parse(birthdayStr);user.setBirthday(birthday);//现住地址String address = sheet.getRow(i).getCell(7).getStringCellValue();user.setProvince(province);user.setAddress(address);userMapper.insert(user);}
}

3、数据导出

用户导出跟JXL导出差不多

/*** 用户导出* @param response* @throws IOException*/
public void exportUser(HttpServletResponse response) throws IOException {//        创建一个空的工作薄org.apache.poi.ss.usermodel.Workbook workbook = new XSSFWorkbook();//        在工作薄中创建一个工作表Sheet sheet = workbook.createSheet("测试");//        设置列宽sheet.setColumnWidth(0,5*256);sheet.setColumnWidth(1,12*256);sheet.setColumnWidth(2,15*256);sheet.setColumnWidth(3,15*256);sheet.setColumnWidth(4,30*256);//            处理标题String[] titles = new String[]{"编号","姓名","手机号","入职日期","现住址"};//        创建标题行Row titleRow = sheet.createRow(0);Cell cell = null;for (int i = 0; i < titles.length; i++) {cell = titleRow.createCell(i);cell.setCellValue(titles[i]);}//        处理内容List<User> userList = this.findAll();int rowIndex = 1;Row row = null;for (User user : userList) {row = sheet.createRow(rowIndex);cell = row.createCell(0);cell.setCellStyle(contentStyle);cell.setCellValue(user.getId());cell = row.createCell(1);cell.setCellStyle(contentStyle);cell.setCellValue(user.getUserName());cell = row.createCell(2);cell.setCellStyle(contentStyle);cell.setCellValue(user.getPhone());cell = row.createCell(3);cell.setCellStyle(contentStyle);cell.setCellValue(sd.format(user.getHireDate()));cell = row.createCell(4);cell.setCellStyle(contentStyle);cell.setCellValue(user.getAddress());rowIndex++;}//            导出的文件名称String filename="员工数据.xlsx";//            设置文件的打开方式和mime类型ServletOutputStream outputStream = response.getOutputStream();response.setHeader( "Content-Disposition", "attachment;filename="  + new String(filename.getBytes(),"ISO8859-1"));response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");workbook.write(outputStream);}

4、设置样式

注:所有样式需在单元格被创建之后才能设置,否则就会报空指针

1、设置边框

CellStyle contentStyle = workbook.createCellStyle();
contentStyle.setBorderBottom(BorderStyle.THIN);
contentStyle.setBorderTop(BorderStyle.THIN);
contentStyle.setBorderLeft(BorderStyle.THIN);
contentStyle.setBorderRight(BorderStyle.THIN);

2、对齐方式

//设置居中对齐
contentStyle.setAlignment(HorizontalAlignment.CENTER);
contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);

3、合并单元格

//合并单元格 起始行, 结束行, 起始列, 结束列
sheet.addMergedRegion(new CellRangeAddress(0,0,0,4));

4、设置行高

//设置行高
row1.setHeightInPoints((short) 52);

5、设置字体样式

//设置字体
CellStyle titleStyle = workbook.createCellStyle();
Font font = workbook.createFont();
font.setBold(true);
font.setFontName("黑体");
font.setFontHeightInPoints((short) 16);
titleStyle.setFont(font);

5、完整导出代码

/*** 用户导出* @param response* @throws IOException*/
public void exportUser(HttpServletResponse response) throws IOException {//        创建一个空的工作薄org.apache.poi.ss.usermodel.Workbook workbook = new XSSFWorkbook();//        在工作薄中创建一个工作表Sheet sheet = workbook.createSheet("测试");Row row1 = sheet.createRow(0);//设置行高row1.setHeightInPoints((short) 52);//合并单元格sheet.addMergedRegion(new CellRangeAddress(0,0,0,4));//        设置列宽sheet.setColumnWidth(0,5*256);sheet.setColumnWidth(1,12*256);sheet.setColumnWidth(2,15*256);sheet.setColumnWidth(3,15*256);sheet.setColumnWidth(4,30*256);/*** 设置框线*/CellStyle contentStyle = workbook.createCellStyle();contentStyle.setBorderBottom(BorderStyle.THIN);contentStyle.setBorderTop(BorderStyle.THIN);contentStyle.setBorderLeft(BorderStyle.THIN);contentStyle.setBorderRight(BorderStyle.THIN);//设置居中对齐contentStyle.setAlignment(HorizontalAlignment.CENTER);contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置字体CellStyle titleStyle = workbook.createCellStyle();Font font = workbook.createFont();font.setBold(true);font.setFontHeightInPoints((short) 16);titleStyle.setFont(font);titleStyle.setBorderBottom(BorderStyle.THIN);titleStyle.setBorderLeft(BorderStyle.THIN);titleStyle.setBorderRight(BorderStyle.THIN);titleStyle.setBorderTop(BorderStyle.THIN);//设置居中对齐titleStyle.setAlignment(HorizontalAlignment.CENTER);titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//合并样式for (int i = 0; i < 5; i++) {Cell cell = row1.createCell(i);cell.setCellStyle(titleStyle);}row1.getCell(0).setCellValue("用户测试数据");//            处理标题String[] titles = new String[]{"编号","姓名","手机号","入职日期","现住址"};//        创建标题行Row titleRow = sheet.createRow(1);Cell cell = null;for (int i = 0; i < titles.length; i++) {cell = titleRow.createCell(i);cell.setCellValue(titles[i]);cell.setCellStyle(titleStyle);}//        处理内容List<User> userList = this.findAll();int rowIndex = 2;Row row = null;for (User user : userList) {row = sheet.createRow(rowIndex);cell = row.createCell(0);cell.setCellStyle(contentStyle);cell.setCellValue(user.getId());cell = row.createCell(1);cell.setCellStyle(contentStyle);cell.setCellValue(user.getUserName());cell = row.createCell(2);cell.setCellStyle(contentStyle);cell.setCellValue(user.getPhone());cell = row.createCell(3);cell.setCellStyle(contentStyle);cell.setCellValue(sd.format(user.getHireDate()));cell = row.createCell(4);cell.setCellStyle(contentStyle);cell.setCellValue(user.getAddress());rowIndex++;}//            导出的文件名称String filename="员工数据.xlsx";//            设置文件的打开方式和mime类型ServletOutputStream outputStream = response.getOutputStream();response.setHeader( "Content-Disposition", "attachment;filename="  + new String(filename.getBytes(),"ISO8859-1"));response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");workbook.write(outputStream);}

下一篇:Java可视化报表设计,你必须学会的写入数据操作!

Java可视化数据报表,你还不知道的Excel基本操作吗?相关推荐

  1. 网络运维与安全岗位月薪2.5w,您还不知道的前景!

    网络运维与安全岗位月薪2.5w,您还不知道的前景! 一.为什么学网络安全?标重点 1..市场巨大 每年各安全厂商收入高达400亿左右,随着5G的发展,万物互联时代,市场将进一步扩大. 2..薪资高 网 ...

  2. 【Android】你可能还不知道的elevation、以及Z值等

    Android你可能还不知道的elevation以及Z值等 elevation以及Z值是什么 有什么用处呢 影响View的阴影 影响View相互阻挡顺序 还有CardView [Android]你可能 ...

  3. 校园论坛(Java)—— 数据报表模块

    校园论坛(Java)-- 数据报表模块 文章目录 校园论坛(Java)-- 数据报表模块 1.写在前面 2.系统结构设计 2.1 各个页面之间的调用关系 2.2. 代码实现 3.数据报表设计 3.1 ...

  4. android 签名包闪退,解决APP连续闪退的方案,你还不知道的签名方式

    原标题:解决APP连续闪退的方案,你还不知道的签名方式 用户在使用APP检测到连续闪退后,接下来要尝试对闪退进行修复,这里先分析可能的闪退原因: 闪退原因 连续闪退,可能是 App 启动关键路径中执行 ...

  5. 简单介绍下我使用了一年多还不知道的Sql server 2005 组件知识

    简介 Microsoft SQL Server 2005 是用于大规模联机事务处理 (OLTP).数据仓库和电子商务应用的数据库平台:也是用于数据集成.分析和报表解决方案的商业智能平台. SQL Se ...

  6. 【深入浅出Spring原理及实战】「开发实战系列」带你看看那些可能你还不知道的Spring特殊技巧和想不到的招数

    前提介绍 本文主要介绍相关Spring框架的一些新特性问题机制,包含了一些特定注解方面的认识. @Lazy可以延迟依赖注入 @Lazy注解修饰在类层面! @Lazy @Service public c ...

  7. html你可能还不知道的一些知识点

    一.标签语义化 html标签语义化是让大家直观的认识标签和属性的用途和作用,好处最主要的是对搜索引擎友好. Eg: 1.如果你想在页面中突出"奥巴马"这三个字,让搜索引擎重视它,如 ...

  8. iOS线程锁中你还不知道的内容

    iOS线程锁 一:十种线程锁 我们在使用多线程的时候多个线程可能会访问同一块资源,这样就很容易引发数据错乱和数据安全等问题,这时候就需要我们保证每次只有一个线程访问这一块资源,锁 应运而生. 这里顺便 ...

  9. 关于线程池,那些你还不知道的事

    本文转载于:https://www.cnblogs.com/hafiz/p/7589352.html#4010404 一.背景 最近在学习线程相关的知识,然后顺理成章少不了学习线程池,刚开始在没有深入 ...

最新文章

  1. excel 2010 学习笔记一 Vlookup 函数的使用
  2. CSP认证201709-2 公共钥匙盒[C++题解]:结构体、排序、枚举
  3. ios mdm更新应用_因使用MDM下架的家长控制应用OurPact重返App Store
  4. mybatis修改mysql变量_Java通过MyBatis框架对MySQL数据进行增删查改的基本方法
  5. 手写springiocxml方式注入对象
  6. Projection of Tuple DataSet具体用法
  7. 【干货】奢侈品线上消费圈层洞察-阿里妈妈.pdf(附下载链接)
  8. Building Apps for Windows Phone 8.1教程下载地址整理
  9. python当前日期时间_Python当前日期时间
  10. 《汉魏风云》1、速度与激情——无双吕布的悲喜人生
  11. 三子棋游戏的具体实现
  12. Linux C语言学习day11:递归与结构体
  13. win10需要修复计算机,超好用!Win10自带修复系统 隐藏太深
  14. sublime text3 英文版转为中文版
  15. 2018年,给自己加油!
  16. 【ROM制作工具】V1.0.0.23新版全新发布啦
  17. 不开方求两点距离的算法
  18. 怎样用C语言sinx的曲线长度,Javascript 绘制 sin 曲线过程附图
  19. 手推遗传算法(Genetic Algorithm,GA)的详细步骤图解
  20. break在java语言中什么意思_在Java语言的控制结构中,break语句是经常用到的语句。在switch语句中break语句的作用是( )_学小易找答案...

热门文章

  1. 佳能Canon iR-ADV C2230 打印机驱动
  2. 基于Matlab的脑功能网络工具箱 BCT FCLab
  3. 韩国NF 数字功放芯片 - NTP8808性能概述
  4. mac安装 Docker
  5. 25.(C语言)回文数判断万用公式
  6. 厚积方能薄发,通往Android封神之路的降龙十八掌
  7. 面向对象三大特征之继承
  8. 职称计算机word上机试题,2018职称计算机考试word操作练习及答案(4)
  9. 基于python编码实现多智能体进化算法求解带硬时间窗约束的VRP问题(适配版)
  10. 每日一个代码-第一天