POI操作Excel(批量导出数据/下载excel)
目录
1、第一个demo:创建工作簿,创建sheet页,创建单元格
2、创建一个时间格式的单元格
3、遍历工作簿的行和列并获取单元格内容
4、文本提取
5、单元格对齐方式
6、单元格边框处理
7、单元格填充色和颜色操作
8、单元格合并
9、字体处理
10、读取和重写工作簿
11、单元格中使用换行
12、创建用户自定义数据格式
13、批量导出数据
14、demo: 利用 poi 实现数据的批量导出
15、demo: 利用 poi 技术实现使用模版批量导出数据
1、第一个demo:创建工作簿,创建sheet页,创建单元格 <--返回目录
导包:poi-3.9-20121203.jar
public static void main(String[] args) throws Exception {
Workbook wb = new HSSFWorkbook(); // 定义一个新的工作簿
Sheet sheet = wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页
Row row = sheet.createRow(0); // 创建一个行
Cell cell = row.createCell(0); // 创建一个单元格 第1列
cell.setCellValue(1); // 给单元格设置值 row.createCell(1).setCellValue(1.2); // 创建一个单元格 第2列 值是1.2 row.createCell(2).setCellValue("这是一个字符串类型"); // 创建一个单元格 第3列 值为一个字符串 row.createCell(3).setCellValue(false); // 创建一个单元格 第4列 值为布尔类型 FileOutputStream fileOut = new FileOutputStream("d:\\Poi生成的excel.xls");
wb.write(fileOut);
fileOut.close();
}
2、创建一个时间格式的单元格 <--返回目录
public static void main(String[] args) throws Exception {
Workbook wb = new HSSFWorkbook(); // 定义一个新的工作簿
Sheet sheet = wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页
Row row = sheet.createRow(0); // 创建一个行
Cell cell = row.createCell(0); // 创建一个单元格 第1列
cell.setCellValue(new Date()); // 给单元格设置值 // 单元格样式类
CellStyle cellStyle = wb.createCellStyle();
CreationHelper createHelper = wb.getCreationHelper();
cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyy-mm-dd hh:mm:ss")); cell = row.createCell(1); // 第二列
cell.setCellValue(new Date());
cell.setCellStyle(cellStyle); cell = row.createCell(2); // 第三列
cell.setCellValue(Calendar.getInstance());
cell.setCellStyle(cellStyle); FileOutputStream fileOut = new FileOutputStream("d:\\工作簿.xls");
wb.write(fileOut);
fileOut.close();
}
3、遍历工作簿的行和列并获取单元格内容 <--返回目录
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream("d:\\工作簿1.xls");
POIFSFileSystem fs = new POIFSFileSystem(is);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet hssfSheet = wb.getSheetAt(0); // 获取第一个Sheet页
if (hssfSheet == null) return; // 遍历行Row
for (int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow == null) {
continue;
}
// 遍历列Cell
for (int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++) {
HSSFCell hssfCell = hssfRow.getCell(cellNum);
if (hssfCell == null) {
continue;
}
System.out.print(" " + getValue(hssfCell));
}
System.out.println();
}
} private static String getValue(HSSFCell hssfCell) {
if (hssfCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {
return String.valueOf(hssfCell.getBooleanCellValue());
} else if (hssfCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
return String.valueOf(hssfCell.getNumericCellValue());
} else {
return String.valueOf(hssfCell.getStringCellValue());
}
}
4、文本提取 <--返回目录
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream("d:\\工作簿1.xls");
POIFSFileSystem fs = new POIFSFileSystem(is);
HSSFWorkbook wb = new HSSFWorkbook(fs); ExcelExtractor excelExtractor = new ExcelExtractor(wb);
// false:不打印Sheet页的名字
excelExtractor.setIncludeSheetNames(true);
System.out.println(excelExtractor.getText());
}
5、单元格对齐方式 <--返回目录
public static void main(String[] args) throws Exception {
Workbook wb = new HSSFWorkbook(); // 定义一个新的工作簿
Sheet sheet = wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页
Row row = sheet.createRow(2); // 创建一个行
row.setHeightInPoints(30); // 设置行高 createCell(wb, row, (short) 0, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_BOTTOM);
createCell(wb, row, (short) 1, HSSFCellStyle.ALIGN_FILL, HSSFCellStyle.VERTICAL_CENTER);
createCell(wb, row, (short) 2, HSSFCellStyle.ALIGN_LEFT, HSSFCellStyle.VERTICAL_TOP);
createCell(wb, row, (short) 3, HSSFCellStyle.ALIGN_RIGHT, HSSFCellStyle.VERTICAL_TOP);
createCell(wb, row, (short) 4, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_CENTER); FileOutputStream fileOut = new FileOutputStream("d:\\工作簿.xls");
wb.write(fileOut);
fileOut.close();
} /**
* 创建一个单元格并为其设定指定的对齐方式
*
* @param wb 工作簿
* @param row 行
* @param column 列
* @param halign 水平方向对齐方式
* @param valign 垂直方向对齐方式
*/
private static void createCell(Workbook wb, Row row, short column, short halign, short valign) {
CellStyle cellStyle = wb.createCellStyle(); // 创建单元格样式
cellStyle.setAlignment(halign); // 设置单元格水平方向对齐方式
cellStyle.setVerticalAlignment(valign); // 设置单元格垂直方向对齐方式 Cell cell = row.createCell(column); // 创建单元格
cell.setCellValue(new HSSFRichTextString("Align It")); // 设置值
cell.setCellStyle(cellStyle); // 设置单元格样式
}
6、单元格边框处理 <--返回目录
public static void main(String[] args) throws Exception {
Workbook wb = new HSSFWorkbook(); // 定义一个新的工作簿
Sheet sheet = wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页
Row row = sheet.createRow(1); // 创建一个行 Cell cell = row.createCell(1); // 创建一个单元格
cell.setCellValue(4); CellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderBottom(CellStyle.BORDER_THIN); // 底部边框
cellStyle.setBottomBorderColor(IndexedColors.RED.getIndex()); // 底部边框颜色 cellStyle.setBorderLeft(CellStyle.BORDER_THIN); // 左边边框
cellStyle.setLeftBorderColor(IndexedColors.GREEN.getIndex()); // 左边边框颜色 cellStyle.setBorderRight(CellStyle.BORDER_THIN); // 右边边框
cellStyle.setRightBorderColor(IndexedColors.BLUE.getIndex()); // 右边边框颜色 cellStyle.setBorderTop(CellStyle.BORDER_MEDIUM_DASHED); // 上边边框
cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 上边边框颜色 cell.setCellStyle(cellStyle);
FileOutputStream fileOut = new FileOutputStream("d:\\工作簿.xls");
wb.write(fileOut);
fileOut.close();
}
7、单元格填充色和颜色操作 <--返回目录
public static void main(String[] args) throws Exception {
Workbook wb = new HSSFWorkbook(); // 定义一个新的工作簿
Sheet sheet = wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页
Row row = sheet.createRow(1); // 创建一个行 Cell cell = row.createCell(1);
cell.setCellValue("abc");
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setFillBackgroundColor(IndexedColors.AQUA.getIndex()); // 背景色
cellStyle.setFillPattern(CellStyle.BIG_SPOTS); // 填充方式
cell.setCellStyle(cellStyle); Cell cell2 = row.createCell(2);
cell2.setCellValue("ABC");
CellStyle cellStyle2 = wb.createCellStyle();
cellStyle2.setFillForegroundColor(IndexedColors.RED.getIndex()); // 前景色
cellStyle2.setFillPattern(CellStyle.SOLID_FOREGROUND); // 填充方式
cell2.setCellStyle(cellStyle2); FileOutputStream fileOut = new FileOutputStream("d:\\工作簿.xls");
wb.write(fileOut);
fileOut.close();
}
8、单元格合并 <--返回目录
public static void main(String[] args) throws Exception {
Workbook wb = new HSSFWorkbook(); // 定义一个新的工作簿
Sheet sheet = wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页
Row row = sheet.createRow(1); // 创建一个行 Cell cell = row.createCell(1);
cell.setCellValue("单元格合并测试"); sheet.addMergedRegion(new CellRangeAddress(1, // 起始行
2, // 结束行
1, // 其实列
2 // 结束列
)); FileOutputStream fileOut = new FileOutputStream("d:\\工作簿.xls");
wb.write(fileOut);
fileOut.close();
}
結果:
9、字体处理 <--返回目录
public static void main(String[] args) throws Exception {
Workbook wb = new HSSFWorkbook(); // 定义一个新的工作簿
Sheet sheet = wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页
Row row = sheet.createRow(1); // 创建一个行 // 创建一个字体处理类
Font font = wb.createFont();
font.setFontHeightInPoints((short) 24);
font.setFontName("Courier New");
font.setItalic(true);
font.setStrikeout(true); CellStyle style = wb.createCellStyle();
style.setFont(font); Cell cell = row.createCell((short) 1);
cell.setCellValue("This is test of fonts");
cell.setCellStyle(style); FileOutputStream fileOut = new FileOutputStream("d:\\工作簿.xls");
wb.write(fileOut);
fileOut.close();
}
10、读取和重写工作簿 <--返回目录
public static void main(String[] args) throws Exception {
InputStream inp = new FileInputStream("d:\\工作簿.xls");
POIFSFileSystem fs = new POIFSFileSystem(inp);
Workbook wb = new HSSFWorkbook(fs);
Sheet sheet = wb.getSheetAt(0); // 获取第一个Sheet页
Row row = sheet.getRow(0); // 获取第一行
Cell cell = row.getCell(0); // 获取第一个单元格
if (cell == null) {
cell = row.createCell(3);
}
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("测试单元格"); FileOutputStream fileOut = new FileOutputStream("d:\\工作簿.xls");
wb.write(fileOut);
fileOut.close();
}
11、单元格中使用换行 <--返回目录
public static void main(String[] args) throws Exception {
Workbook wb = new HSSFWorkbook(); // 定义一个新的工作簿
Sheet sheet = wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页
Row row = sheet.createRow(2); // 创建一个行
Cell cell = row.createCell(2);
cell.setCellValue("我要换行 \n 成功了吗?"); CellStyle cs = wb.createCellStyle();
// 设置可以换行
cs.setWrapText(true);
cell.setCellStyle(cs); // 调整下行的高度
row.setHeightInPoints(2 * sheet.getDefaultRowHeightInPoints());
// 调整单元格宽度
sheet.autoSizeColumn(2); FileOutputStream fileOut = new FileOutputStream("d:\\工作簿.xls");
wb.write(fileOut);
fileOut.close();
}
12、创建用户自定义数据格式 <--返回目录
public static void main(String[] args) throws Exception {
Workbook wb = new HSSFWorkbook(); // 定义一个新的工作簿
Sheet sheet = wb.createSheet("第一个Sheet页"); // 创建第一个Sheet页
CellStyle style;
DataFormat format = wb.createDataFormat();
Row row;
Cell cell;
short rowNum = 0;
short colNum = 0; row = sheet.createRow(rowNum++);
cell = row.createCell(colNum);
cell.setCellValue(111111.25); style = wb.createCellStyle();
style.setDataFormat(format.getFormat("0.0")); // 设置数据格式
cell.setCellStyle(style); row = sheet.createRow(rowNum++);
cell = row.createCell(colNum);
cell.setCellValue(1111111.25);
style = wb.createCellStyle();
style.setDataFormat(format.getFormat("#,##0.000"));
cell.setCellStyle(style); FileOutputStream fileOut = new FileOutputStream("d:\\工作簿.xls");
wb.write(fileOut);
fileOut.close();
}
13、批量导出数据 <--返回目录
public String export()throws Exception{
Connection con=null;
try {
con=dbUtil.getCon();
Workbook wb=new HSSFWorkbook();
String headers[]={"编号","姓名","电话","Email","QQ"};
ResultSet rs=userDao.userList(con, null);
ExcelUtil.fillExcelData(rs, wb, headers);
ResponseUtil.export(ServletActionContext.getResponse(), wb, "导出excel.xls");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
dbUtil.closeCon(con);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
ExcelUtil
package com.oy; import java.sql.ResultSet; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; public class ExcelUtil { public static void fillExcelData(ResultSet rs, Workbook wb, String[] headers) throws Exception {
int rowIndex = 0;
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(rowIndex++);
for (int i = 0; i < headers.length; i++) {
row.createCell(i).setCellValue(headers[i]);
}
while (rs.next()) {
row = sheet.createRow(rowIndex++);
for (int i = 0; i < headers.length; i++) {
row.createCell(i).setCellValue(rs.getObject(i + 1).toString());
}
}
}
}
ResponseUtil
package com.oy; import java.io.OutputStream;
import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse; import org.apache.poi.ss.usermodel.Workbook; public class ResponseUtil { public static void write(HttpServletResponse response, Object o) throws Exception {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print(o.toString());
out.flush();
out.close();
} public static void export(HttpServletResponse response, Workbook wb, String fileName) throws Exception {
response.setHeader("Content-Disposition",
"attachment;filename=" + new String(fileName.getBytes("utf-8"), "iso8859-1"));
response.setContentType("application/ynd.ms-excel;charset=UTF-8");
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
out.close();
}
}
14、demo: 利用 poi 实现数据的批量导出 <--返回目录
依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
PoiController
@Controller
public class PoiController {
@RequestMapping("/poi/export")
public void get(HttpServletResponse response) throws Exception {
Workbook wb = new HSSFWorkbook();
String headers[] = { "id", "name", "mobileNum", "email" };
List<User> userList = new ArrayList<>();
User user1 = new User(1, "张三", "13512345678", "123@163.com");
User user2 = new User(1, "张三", "13512345678", "123@163.com");
User user3 = new User(1, "张三", "13512345678", "123@163.com");
userList.add(user1);
userList.add(user2);
userList.add(user3); ExcelUtil.fillExcelData(userList, wb, headers);
ResponseUtil.export(response, wb, "导出excel.xls"); }
}
User
public class User {
private Integer id;
private String name;
private String mobileNum;
private String email;
public User() {
}
public User(Integer id, String name, String mobileNum, String email) {
this.id = id;
this.name = name;
this.mobileNum = mobileNum;
this.email = email;
}
// getter和setter方法省略
public Integer getId() {
return id;
}
}
ExcelUtil
public class ExcelUtil { public static void fillExcelData(List<User> userList, Workbook wb, String[] headers) throws Exception {
int rowIndex = 0;
Sheet sheet = wb.createSheet();
Row row = sheet.createRow(rowIndex++);
for (int i = 0; i < headers.length; i++) {
row.createCell(i).setCellValue(headers[i]);
} if (userList != null && userList.size() > 0) {
for (User user : userList) {
row = sheet.createRow(rowIndex++);
for (int i = 0; i < headers.length; i++) {
String field = headers[i];
field = field.substring(0, 1).toUpperCase() + field.substring(1);
Object val = user.getClass().getMethod("get" + field).invoke(user);
row.createCell(i).setCellValue(val.toString());
}
}
} }
}
ResponseUtil
public class ResponseUtil { public static void export(HttpServletResponse response, Workbook wb, String fileName) throws Exception {
response.setHeader("Content-Disposition","attachment;filename="
+ new String(fileName.getBytes("utf-8"), "iso8859-1"));
response.setContentType("application/ynd.ms-excel;charset=UTF-8");
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
out.close();
}
}
15、demo: 利用 poi 技术实现使用模版批量导出数据 <--返回目录
demo结构:
PoiController
@Controller
public class PoiController { @RequestMapping("/poi/export2")
public void get2(HttpServletResponse response) throws Exception {
List<User> userList = new ArrayList<>();
User user1 = new User(1, "张三", "13512345678", "123@163.com");
User user2 = new User(1, "张三", "13512345678", "123@163.com");
User user3 = new User(1, "张三", "13512345678", "123@163.com");
userList.add(user1);
userList.add(user2);
userList.add(user3); String headers[] = { "id", "name", "mobileNum", "email" };
Workbook wb=ExcelUtil.fillExcelDataWithTemplate(userList, headers, "userExporTemplate.xls");
ResponseUtil.export(response, wb, "利用模版导出excel.xls");
}
}
ExcelUtil
public class ExcelUtil { public static Workbook fillExcelDataWithTemplate(List<User> userList, String[] headers, String templateFileName) throws Exception {
InputStream in = ExcelUtil.class.getResourceAsStream("/static/template/" + templateFileName);
POIFSFileSystem fs = new POIFSFileSystem(in);
Workbook wb = new HSSFWorkbook(fs);
Sheet sheet = wb.getSheetAt(0);
// 获取列数
int cellNums = sheet.getRow(0).getLastCellNum();
int rowIndex = 1;
Row row = null;
if (userList != null && userList.size() > 0) {
for (User user : userList) {
row = sheet.createRow(rowIndex++);
for (int i = 0; i < cellNums; i++) {
String field = headers[i];
field = field.substring(0, 1).toUpperCase() + field.substring(1);
Object val = user.getClass().getMethod("get" + field).invoke(user);
row.createCell(i).setCellValue(val.toString());
}
}
}
return wb;
}
}
User类和ResponseUtil类与上一个demo相同。
POI操作Excel(批量导出数据/下载excel)的更多相关文章
- Java操作Jxl实现导出数据生成Excel表格数据文件
实现:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js.Css文件.页面:Jsp.拦截请求:Servlet.逻辑处理:ClassBean.数据库:SQLserver. 注意: ...
- PHP批量导出数据为excel表格
之前用插件phoexcel写过批量导入数据,现在用到了批量导出,就记录一下,这次批量导出没用插件,是写出一个表格,直接输出 //$teacherList 是从数据库查出来的二维数组 $execlnam ...
- 使用PHP导入Excel和导出数据为Excel文件
有时需要将Excel表格的数据导入到mysql数据库中,我们使用PHP的一个开源项目PHP-ExcelReader可以轻松实现Excel的导入.另外将mysql数据导出为Excel与本站上篇文章中导出 ...
- js操作table表格导出数据到excel方法
js导出excel资料很少,网上也找了很多,基本都不能用,要么只能是IE用,还必须要权限,这是非常不好的.后来到github上找到table2excel.js,虽然可以用,但仍然对IE支持不够,也算不 ...
- java操作Excel之POI(5)利用POI实现使用模板批量导出数据
后台导出方法: 在源文件夹src下面放个准备好的模板:/com/cy/template/userExportTemplate.xls,这个模板有头部一行: /** * 后台导出方法 * 利用POI实现 ...
- 从数据库导出数据到excel之POI操作
项目说明: 1:数据库中有两张表,主键关联 2:根据条件查询数据 3:处理为需要的数据封装类型,然后传到导出excel的方法中 <--框架部署就不详谈了,用的spring框架--> 补充: ...
- 使用Open xml 操作Excel系列之二--从data table导出数据到Excel
由于Excel中提供了透视表PivotTable,许多项目都使用它来作为数据分析报表. 在有些情况下,我们需要在Excel中设计好模板,包括数据源表,透视表等, 当数据导入到数据源表时,自动更新透视表 ...
- 一个方便且通用的导出数据到 Excel 的类库
一个方便且通用的导出数据到 Excel 的类库 起源: 之前在做一个项目时,客户提出了许多的导出数据的需求: 导出用户信息 导出业务实体信息 各种查询都要能导出 导出的数据要和界面上看到的一致 可以分 ...
- 手把手教你springboot中导出数据到excel中
手把手教你springboot中导出数据到excel中 问题来源: 前一段时间公司的项目有个导出数据的需求,要求能够实现全部导出也可以多选批量导出(虽然不是我负责的,我自己研究了研究),我们的项目是x ...
随机推荐
- 最大公约数与最小公倍数C++实现
最大公约数为辗转相除法求得, 最小公倍数为两数之积与最大公约数的比值 #include<iostream> using namespace std; int gcd(int, int); ...
- AGC035 B - Even Degrees【思维·树形结构的妙用】
题目传送门 一句话题意: 首先,每一条边会产生1个入度,1个出度,因此,如果边的数量是奇数的话,图的所有节点的总出度就是奇数,不可能每个节点的出度都是偶数,因此无解. 有解时,我们先找出原图中的一棵生 ...
- Maven从入门到精通(一)
maven是一个项目管理工具,我的后续将会根据这个思维导图给大家由浅到深讲解Maven是如何管理我们的项目,以及我们如何更好的使用Maven maven在开发过程中功能主要有三个方面: 管理依赖 ...
- Spring数据库主从分离
1.spring+spring mvc +mybatis+druid 实现数据库主从分离 2.Spring+MyBatis主从读写分离 3.MyCat痛点 4.Spring+MyBatis实现数据库读 ...
- 一些常用的字符串函数(CLR函数)
原代码来自:东莞--小小大神 使用 --聚合函数 SELECT father_key,dbo.String_Agg(department_name) FROM dbo.b_department GRO ...
- MySql 面试开发技术点汇总
表结构设计 1.为什么一定要设一个主键? 答:因为你不设主键的情况下,innodb也会帮你生成一个隐藏列,作为自增主键.所以啦,反正都要生成一个主键,那你还不如自己指定一个主键,在有些情况下,就能显 ...
- 常用的PHP函数封装,有排序和数据库操作函数
//二分查找 function bin_sch($array, $low, $high, $k) { if ($low <= $high) { $mid = intval(($low + $hi ...
- css中新增的属性calc()可以计算使用
什么是calc: calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能,用来指定元素的长度.可以使用calc()给元素的border.margin.pading.font-s ...
- 判断浏览器类型JS
// 判断浏览器类型 getExplorer() { var explorer = window.navigator.userAgent, compare = function (s) { retur ...
- JSON.parse()与JSON.stringify()和eval()使用方法详解
在和后端对接口的时候,遇到了一个问题 就是series里面数据变量进行拼接的时候,data数据里面全部是数值int类型的 但是因为某些需求需要让他进行某个数据之前的数据都为空 我试过用空字符串和und ...