POI报表
POI入门操作
1.导入依赖
<dependencies>
<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>
</dependencies>
2.poi结构说明
HSSF提供读写Microsoft Excel XLS格式档案的功能。
XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF提供读写Microsoft Word DOC格式档案的功能。
HSLF提供读写Microsoft PowerPoint格式档案的功能。
HDGF提供读Microsoft Visio格式档案的功能。
HPBF提供读Microsoft Publisher格式档案的功能。
HSMF提供读Microsoft Outlook格式档案的功能。
3.API介绍
API名称 | |
---|---|
Workbook | Excel的文档对象,针对不同的Excel类型分为:HSSFWorkbook(2003)和 XSSFWorkbool(2007) |
Sheet | Excel的表单 |
Row | Excel的行 |
Cell | Excel的格子单元 |
Font | Excel字体 |
CellStyle | 格子单元样式 |
4.基本操作
/**
* 使用POI创建excel
* @author hsh
*
*/
public class PoiTest01
{
public static void main(String[] args) throws IOException
{
//1.创建工作簿 HSSFWorkbook--2007版本
Workbook wb=new XSSFWorkbook();
//2.创建表单sheet
Sheet sheet = wb.createSheet("text");
//3.获取文件流
FileOutputStream pis=new FileOutputStream("E:\\poi\\test.xlsx");
//4.写入文件
wb.write(pis);
pis.close();
}
}
5.创建单元格
/**
* 创建单元格写入内容
* @author Wye
*
*/
public class PoiTest02
{
public static void main(String[] args) throws IOException
{
//创建工作簿 HSSFWorkbook--2007版本
Workbook wb=new XSSFWorkbook();
//创建表单sheet
Sheet sheet = wb.createSheet("text");
//创建行对象,参数索引从0开始
Row row = sheet.createRow(2);
//创建单元格对象,参数索引从0开始
Cell cell = row.createCell(3);
//向单元格写入内容
cell.setCellValue("宝哥生日快乐");
//获取文件流
FileOutputStream pis=new FileOutputStream("E:\\poi\\test1.xlsx");
//写入文件
wb.write(pis);
pis.close();
}
}
6.设置单元格样式
/**
* 单元格样式处理
* @author Wye
*
*/
public class PoiTest02
{
public static void main(String[] args) throws IOException
{
//创建工作簿 HSSFWorkbook--2007版本
Workbook wb=new XSSFWorkbook();
//创建表单sheet
Sheet sheet = wb.createSheet("text");
//创建行对象,参数索引从0开始
Row row = sheet.createRow(2);
//创建单元格对象,参数索引从0开始
Cell cell = row.createCell(3);
//向单元格写入内容
cell.setCellValue("阿里嘎多妈妈哈哈");
//样式处理
//创建样式对象
CellStyle style = wb.createCellStyle();
style.setBorderTop(BorderStyle.THIN);//上边框
style.setBorderBottom(BorderStyle.THIN);//下边框
style.setBorderLeft(BorderStyle.THIN);//左边框
style.setBorderRight(BorderStyle.THIN);//右边框
//创建字体对象
Font font = wb.createFont();
font.setFontName("华文琥珀");//字体
font.setFontHeightInPoints((short)28);//字号
style.setFont(font);//将字体放入样式对象
//行高和列宽
row.setHeightInPoints(50);//行高
//列宽的宽度 字符的宽度
sheet.setColumnWidth(2, 31*256); //列宽
//居中显示
style.setAlignment(HorizontalAlignment.CENTER);//水平居中
style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中
//像单元格设置样式
cell.setCellStyle(style);
//获取文件流
FileOutputStream pis=new FileOutputStream("E:\\poi\\test2.xlsx");
//写入文件
wb.write(pis);
pis.close();
}
}
7.绘制图形
/**
* 像单元格中插入图片
* @author Wye
*
*/
public class PoiTest05
{
public static void main(String[] args) throws IOException
{
//创建工作簿 HSSFWorkbook--2007版本
Workbook wb=new XSSFWorkbook();
//创建表单sheet
Sheet sheet = wb.createSheet("text");
//读取图片流
FileInputStream stream=new FileInputStream("E:\\poi\\logo.jpg");
//转换成二进制数组(Poi提供的工具类)
byte[] byteArray = IOUtils.toByteArray(stream);
stream.read(byteArray);
//向poi内存中添加一张图片(参数一,图片的二进制数据,参数二,当前图片的类型)
int picture = wb.addPicture(byteArray, Workbook.PICTURE_TYPE_JPEG);
//绘制图片的工具类
CreationHelper helper = wb.getCreationHelper();
//创建一个绘图对象
Drawing<?> patriarch = sheet.createDrawingPatriarch();
//创建锚点,设置图片坐标
ClientAnchor anchor = helper.createClientAnchor();//通过工具类创建锚点对象
anchor.setRow1(0);//从0开始
anchor.setCol1(0);
//绘制图片
Picture createPicture = patriarch.createPicture(anchor,picture);//图片位置,图片索引
createPicture.resize();//自适应渲染图片
//获取文件流
FileOutputStream pis=new FileOutputStream("E:\\poi\\test3.xlsx");
//写入文件
wb.write(pis);
stream.close();
pis.close();
}
}
8.加载Excel
/**
*
* 读取excel并且解析
*/
public class PoiTest06
{
public static void main(String[] args) throws IOException
{
// 1.根据excel文件创建工作簿
@SuppressWarnings("resource")
Workbook wb = new XSSFWorkbook("E:\\poi\\化塑汇工服规格表.xlsx");// xssf是excel2007
// 2.获取sheet
Sheet sheet = wb.getSheetAt(0);// 参数,索引从0开始
// 3.获取sheet中的每一行和每一个单元格
for (int rowNum = 3; rowNum < sheet.getLastRowNum(); rowNum++)
{
Row row = sheet.getRow(rowNum);// 根据索引获取每一行
StringBuilder builder = new StringBuilder();
for (int cellNum = 0; cellNum < row.getLastCellNum(); cellNum++)
{
// 根据索引获取每一个单元的单元格
Cell cell = row.getCell(cellNum);
// 获取每一个单元格的内容
Object value = getCellValue(cell);
builder.append(value).append("-");
}
System.out.println(builder.toString());
}
}
/**
* 工具类判断单元格内容的类型
*
* @param cell
* @return
*/
public static Object getCellValue(Cell cell)
{
// 1.获取单元格数据类型
CellType cellType = cell.getCellType();
// 2.根据单元格数据类型获取数据
Object value = null;
switch (cellType)
{
case STRING:// 字符串类型
value = cell.getStringCellValue();
break;
case BOOLEAN:// 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;
}
}