Apache poi简介
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式档案读和写的功能
Apache poi常用的类
HSSF - 提供读写Microsoft Excel格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
HWPF - 提供读写Microsoft Word格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读写Microsoft Visio格式档案的功能。
3个不同的工具类
HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;
XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx;
当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:Javaheap space;内存溢出错误。这时应该用SXSSFworkbook。
操作步骤
创建一个excel需要八步
a) 创建一个工作簿 workbook
b 创建一个工作表 sheet
c) 创建一个行对象 row(下标起始值为0)
d) 创建一个单元格对象cell(下标起始值为0)
e) 给单元格设置内容
f) 设置单元格的样式,设置字体和字体的大小
g) 保存,关闭流对象
h) 下载
进入编写代码阶段
第一个demo
// a) 创建一个工作簿 workbook
Workbook book = new HSSFWorkbook();
// b 创建一个工作表 sheet
Sheet sheet = book.createSheet();
// c) 创建一个行对象 row(下标起始值为0)
Row row = sheet.createRow(0);
// d) 创建一个单元格对象cell(下标起始值为0)
Cell cell = row.createCell(0);
// e) 给单元格设置内容
cell.setCellValue("2018年货运清单");
// f) 设置单元格的样式,设置字体和字体的大小
// g) 保存,关闭流对象
book.write(new FileOutputStream("F:/货运单.xls"));// 将文件命名并保存在f盘下
System.out.println("成功");
book.close();
刷新之后F盘出现文件
文件内容
设置样式
// a) 创建一个工作簿 workbook
Workbook book = new HSSFWorkbook();
// b 创建一个工作表 sheet
Sheet sheet = book.createSheet();
// 合并单元格 (CellRangeAddress类中的参数指的是地址--将第一行的8个单元格合并)
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));
// c) 创建一个行对象 row(下标起始值为0)
Row row = sheet.createRow(0);
// 将这一行设置行高为50
row.setHeightInPoints(50);
// d) 创建一个单元格对象cell(下标起始值为0)
Cell cell = row.createCell(0);
// e) 给单元格设置内容
cell.setCellValue("2018年货运清单");
// f) 设置单元格的样式,设置字体和字体的大小
CellStyle style = book.createCellStyle();
// 创建字体样式
Font font = book.createFont();
font.setBold(true);// 加粗
font.setFontName("宋体");//字体设置为宋体
font.setFontHeightInPoints((short) 20);//20号字体
style.setAlignment(CellStyle.ALIGN_CENTER); // 纵向居中
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
style.setFont(font);
cell.setCellStyle(style);
// g) 保存,关闭流对象
book.write(new FileOutputStream("F:/货运单.xls"));// 将文件命名并保存在f盘下
System.out.println("成功");
book.close();
// h) 下载
导入模板
//获取webapp下的模板文件
String filePath = ServletActionContext.getServletContext().getRealPath("/make/xlsprint/tOUTPRODUCT.xlsx");
FileInputStream is = new FileInputStream(filePath);
Workbook book = new XSSFWorkbook(is);
//从sheet的第一行
Sheet sheet = book.getSheetAt(0);
int rowIndex = 0;
// 大标题
Row bigTitleRow = sheet.getRow(rowIndex++);
Cell bigCell = bigTitleRow.getCell(1);
// 标题内容
String titleStr = inputDate.replace("-0", "-").replaceAll("-", "年") + "月份出货表";
bigCell.setCellValue(titleStr);
// 小标题
rowIndex++;
// 内容
// 保存样式
//获取内容每一个单元格的样式
CellStyle cs01 = sheet.getRow(rowIndex).getCell(1).getCellStyle();
String stringCellValue = sheet.getRow(rowIndex).getCell(1).getStringCellValue();
System.out.println("获取的第一列信息" + stringCellValue);
CellStyle cs02 = sheet.getRow(rowIndex).getCell(2).getCellStyle();
CellStyle cs03 = sheet.getRow(rowIndex).getCell(3).getCellStyle();
CellStyle cs04 = sheet.getRow(rowIndex).getCell(4).getCellStyle();
CellStyle cs05 = sheet.getRow(rowIndex).getCell(5).getCellStyle();
CellStyle cs06 = sheet.getRow(rowIndex).getCell(6).getCellStyle();
CellStyle cs07 = sheet.getRow(rowIndex).getCell(7).getCellStyle();
CellStyle cs08 = sheet.getRow(rowIndex).getCell(8).getCellStyle();
// 写出excel
ByteArrayOutputStream os = new ByteArrayOutputStream();
HttpServletResponse response = ServletActionContext.getResponse();
DownloadUtil util = new DownloadUtil();
book.write(os);
util.download(os, response, titleStr + ".xlsx");
return NONE;
首先查看一下我们的模板文件,在webapp下
接着是我们添加的内容
操作百万级数据
Workbook book = new SXSSFWorkbook();
Sheet sheet = book.createSheet();
// 设置列宽
sheet.setColumnWidth(1, 25 * 256);
sheet.setColumnWidth(2, 10 * 256);
sheet.setColumnWidth(3, 25 * 256);
sheet.setColumnWidth(4, 10 * 256);
sheet.setColumnWidth(5, 10 * 256);
sheet.setColumnWidth(6, 10 * 256);
sheet.setColumnWidth(7, 10 * 256);
sheet.setColumnWidth(8, 10 * 256);
int rowIndex = 0;
// 大标题
Row bigTitleRow = sheet.createRow(rowIndex++);
bigTitleRow.setHeightInPoints(36);
Cell bigCell = bigTitleRow.createCell(1);
bigCell.setCellStyle(bigTitle(book));
// 合并单元格
sheet.addMergedRegion(new CellRangeAddress(0,0,1,8));
// 标题内容 inputDate 2015年7月份出货表
String titleStr = inputDate.replace("-0", "-").replace("-", "年")+"月份出货表";
bigCell.setCellValue(titleStr);
// 小标题
String[] smartStrs = {"客户","订单号","货号","数量","工厂","工厂交期","船期","贸易条款"};
Row smartRow = sheet.createRow(rowIndex++);
smartRow.setHeightInPoints(26);
for (int i=0; i < smartStrs.length ; i++) {
Cell smartCell = smartRow.createCell(i+1);
smartCell.setCellValue(smartStrs[i]); //设置内容
}
// 内容
for (int i = 0; i < 800000; i++) {
Row contentRow = sheet.createRow(rowIndex++);
contentRow.setHeightInPoints(26);
Cell cell01 = contentRow.createCell(1);
cell01.setCellValue(i);
Cell cell02 = contentRow.createCell(2);
cell02.setCellValue(i+1);
Cell cell03 = contentRow.createCell(3);
cell03.setCellValue(i+2);
Cell cell04 = contentRow.createCell(4);
cell04.setCellValue(i+3);
Cell cell05 = contentRow.createCell(5);
cell05.setCellValue(i*+4);
}
// 写出excel
ByteArrayOutputStream os = new ByteArrayOutputStream();
HttpServletResponse response = ServletActionContext.getResponse();
String returnName = titleStr + ".xls";
response.setContentType("application/octet-stream;charset=utf-8");
returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1"));
response.addHeader("Content-Disposition", "attachment;filename=" + returnName);
ServletOutputStream outputStream2 = response.getOutputStream();
book.write(outputStream2);
book.close();
return NONE;
整整80万条数据哦
因为小编数据库没什么数据,所以暂时用for循环来凑数哈哈
补充
由于大家并没有全部使用mavne来构建项目,但小编是用maven来构建项目的,所以大家可以根据上面的代码来自己导入jar包