1.POI
1.1 excel概述
excel2003 xls 二进制符合文档 65535行
excel2007及以上 xlsx xml 1048576行
市面上,通过java代码操作exlce的途径 : POI
1.2 POI概述
apache提供的一套操作office组件的工具类
使用场景 : 生成excel报表, 使用poi解析excel报表
2.入门案例
2.1 生成excel
public static void main(String[] args) throws Exception {
//1.创建工作簿
//Workbook wb = new HSSFWorkbook(); //2003版本
Workbook wb = new XSSFWorkbook(); //2007版本
//Workbook wb = new SXSSFWorkbook();//处理百万数据的
//2.创建sheet
Sheet sheet = wb.createSheet("abc");
//3.创建行
Row row = sheet.createRow(2);//下标,从0开始
//4.创建单元格
Cell cell = row.createCell(2);//下标,从0开始
//5.输入单元格内容
cell.setCellValue("****");
//6.设置样式
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setBorderTop(BorderStyle.THIN); //上边框
cellStyle.setBorderBottom(BorderStyle.THIN);//下边框
cellStyle.setBorderLeft(BorderStyle.THIN);//左边框
cellStyle.setBorderRight(BorderStyle.THIN);//右边框
Font font = wb.createFont();
font.setFontName("方正舒体");
font.setFontHeightInPoints((short)18);
cellStyle.setFont(font);
cell.setCellStyle(cellStyle); //设置样式
//7.生成文件
FileOutputStream fos = new FileOutputStream("E:\\abc.xlsx");
wb.write(fos);
fos.close();
}
2.2 解析excel
/**
* 解析excel
*/
public class PoiTest02 {
public static void main(String[] args) throws Exception {
//1.加载excel工作簿
Workbook wb = new XSSFWorkbook("E:\\");
//2.获取工作簿的sheet
Sheet sheet = wb.getSheetAt(0);//从0开始
//3.循环所有行
for (int i=0; i<=sheet.getLastRowNum();i++) { // getLastRowNum : 获取最后一行的索引
//获取每一行
Row row = sheet.getRow(i);
for(int j=2; j< row.getLastCellNum() ; j++) { //getLastCellNum : 获取最后一列的列号
Cell cell = row.getCell(j);
Object obj = getCellValue(cell);
System.out.print(obj +" ");
}
System.out.println("----------");
}
//4.获取每一个行中的每一个单元格,以及单元格中的内容
}
//解析每个单元格的数据
public static Object getCellValue(Cell cell) {
Object obj = null;
//单元格类型
CellType cellType = cell.getCellType();
switch (cellType) {
case STRING: { //字符串单元
obj = cell.getStringCellValue();
break;
}
//excel默认将日志也理解为数字
case NUMERIC:{ //数字单元格
if(DateUtil.isCellDateFormatted(cell)) { //日期
obj = cell.getDateCellValue();
}else {
obj = cell.getNumericCellValue();
}
break;
}
case BOOLEAN:{ //boolean
obj = cell.getBooleanCellValue();
break;
}
default:{
break;
}
}
return obj;
}
}
3.模板打印
4.百万数据打印
/**
* 自定义的行解析器
*/
public class SheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler{
private ContractProductVo vo;
//开始解析每一行的时候调用
//参数 : 行索引
public void startRow(int i) {
if( i >1) {
vo = new ContractProductVo();
}
}
/**
* 解析完成每一行的时候调用 :
* 参数 : 行索引
*/
public void endRow(int i) {
if( i >1) {
System.out.println(vo);
}
}
/**
* 当解析此行中每个单元格所调用的方法
* @param cellName
* 单元格名称
* @param cellValue
* 单元格内容
* @param xssfComment
* 注释
*
* b3 , xxx ,""
*/
public void cell(String cellName, String cellValue, XSSFComment xssfComment) {
String name = cellName.substring(0,1); //B,C,D
if(vo != null) {
switch (name) {
case "B" : {
vo.setCustomName(cellValue);
break;
}
case "C" : {
vo.setContractNo(cellValue);
break;
}
default:{
break;
}
}
}
}
}