POI的学习笔记
一 创建Excel单元格并且设置数据
1 具体步骤
(1)创建工作簿workbook
(2)创建表单sheet
(3)创建行对象,参数:索引从0开始
(4)创建单元对象,参数:索引从0开始
(5)向单元中写入内容
(6)创建文件流
(7)写入文件
2 代码具体实现
public class CreateExcelTest {
public static void main(String[] args) throws Exception {
//(1)创建工作簿workbook
XSSFWorkbook workbook = new XSSFWorkbook();
//(2)创建表单sheet
XSSFSheet sheet = workbook.createSheet("test");
//(3)创建行对象,参数:索引从0开始
XSSFRow row = sheet.createRow(2);
//(4)创建单元对象,参数:索引从0开始
XSSFCell cell = row.createCell(2);
//(5)向单元中写入内容
cell.setCellValue("老司机,快上车");
//(6)创建文件流
FileOutputStream fos = new FileOutputStream("D:\\excel\\poi\\test.xlsx");
//(7)写入文件
workbook.write(fos);
fos.close();
}
}
二 单元格样式处理
1 具体步骤
(1)创建工作簿workbook
(2)创建表单sheet
(3)创建行对象,参数:索引从0开始
(4)创建单元对象,参数:索引从0开始
(5)向单元中写入内容
(6)创建样式对象
(7)创建字体对象
(8)设置行高和列宽以及居中显示
(9)向单元格设置样式
(10)创建文件流
(11)写入文件
2 代码具体实现
public class CreateExcelStyleTest {
public static void main(String[] args) throws Exception {
//(1)创建工作簿workbook
XSSFWorkbook workbook = new XSSFWorkbook();
//(2)创建表单sheet
XSSFSheet sheet = workbook.createSheet("test");
//(3)创建行对象,参数:索引从0开始
XSSFRow row = sheet.createRow(2);
//(4)创建单元对象,参数:索引从0开始
XSSFCell cell = row.createCell(2);
//(5)向单元中写入内容
cell.setCellValue("老司机,快上车");
//(6)创建样式对象
XSSFCellStyle style = workbook.createCellStyle();
style.setBorderTop(BorderStyle.THIN);//上边框
style.setBorderBottom(BorderStyle.THIN);//下边框
style.setBorderLeft(BorderStyle.THIN);//左边框
style.setBorderRight(BorderStyle.THIN);//右边框
//(7)创建字体对象
XSSFFont font = workbook.createFont();
font.setFontName("华文行楷");//设置字体
font.setFontHeightInPoints((short) 28);//设置字号
font.setColor((short) 12);//设置颜色
style.setFont(font);
//(8)设置行高和列宽
row.setHeightInPoints(50);//行高
sheet.setColumnWidth(2,31*256);//列宽
//居中显示
style.setAlignment(HorizontalAlignment.CENTER);//水平居中
style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
//向单元格设置样式
cell.setCellStyle(style);
//(9)创建文件流
FileOutputStream fos = new FileOutputStream("D:\\excel\\poi\\style.xlsx");
//(10)写入文件
workbook.write(fos);
fos.close();
}
}
三 绘制图形
1 具体步骤
(1)创建工作簿workbook
(2)创建表单sheet
(3)读取图片流
(4)转换为二进制数组
(5)向POI内存中添加一种图片,返回图片在图片集合中的索引
(6)绘制图片工具类
(7)创建一个绘图对象
(8)创建描点,设置图片坐标
(9)绘制图片
(10)创建文件流
(11)写入文件
2 代码具体实现
public class CreatePictureTest {
public static void main(String[] args) throws Exception {
//(1)创建工作簿workbook
XSSFWorkbook workbook = new XSSFWorkbook();
//(2)创建表单sheet
XSSFSheet sheet = workbook.createSheet("创建picture");
//(3)读取图片流
FileInputStream fis = new FileInputStream("D:\\excel\\poi\\picture.jpg");
//(4)转换为二进制数组
byte[] bytes = IOUtils.toByteArray(fis);
fis.read(bytes);
//(5)向POI内存中添加一种图片,返回图片在图片集合中的索引
int index = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
//(6)绘制图片工具类
XSSFCreationHelper helper = workbook.getCreationHelper();
//(7)创建一个绘图对象
XSSFDrawing patriarch = sheet.createDrawingPatriarch();
//(8)创建描点,设置图片坐标
XSSFClientAnchor anchor = helper.createClientAnchor();
anchor.setRow1(0);
anchor.setCol1(0);
//(9)绘制图片
XSSFPicture picture = patriarch.createPicture(anchor, index);
picture.resize();//图片自适应
//(10)创建文件流
FileOutputStream fos = new FileOutputStream("D:\\excel\\poi\\picture.xlsx");
//(11)写入文件
workbook.write(fos);
fos.close();
}
}
四 加载解析Excel
1 具体步骤
(1)根据Excell文件创建工作簿
(2)获取sheet
(3)获取sheet中的每一行,和每一个单元格
(4)获取单元格的属性类型
2 代码具体实现
public class ParseExcelTest {
//sheet.getLastRowNum() 返回最后一行的下标
//row.getLastCellNum() 返回单元格的列号
public static void main(String[] args) throws Exception {
//(1)创建工作簿workbook
XSSFWorkbook workbook = new XSSFWorkbook("D:\\excel\\poi\\test.xlsx");
//(2)获取表单sheet
XSSFSheet sheet = workbook.getSheetAt(0);
//(3)获取sheet中的每一行和每一个单元格
for (int rowNum=0; rowNum <= sheet.getLastRowNum(); rowNum++ ){
StringBuilder sb = new StringBuilder();
//获取每一行
XSSFRow row = sheet.getRow(rowNum);
for (int cellNum=0; cellNum < row.getLastCellNum(); cellNum++){
XSSFCell cell = row.getCell(cellNum);//获取列
Object value = getCellValue(cell);
sb.append(value).append("-");
}
System.out.println(sb.toString());
}
}
public static Object getCellValue(Cell cell){
//获取单元格的属性类型
CellType cellType = cell.getCellType();
//根据单元格数据类型获取数据
Object value = null;
switch (cellType){
case STRING://字符串
value = cell.getStringCellValue();
break;
case BOOLEAN://布尔
value = cell.getBooleanCellValue();
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell))//日期
value = cell.getDateCellValue();
else //数字
value = cell.getNumericCellValue();
break;
case FORMULA://公式
value = cell.getCellFormula();
break;
default:
break;
}
return value;
}
}