5.使用图形
(1)画线
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFPatriarch patriarch=sheet.createDrawingPatriarch();HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short)1, 0,(short)4, 4);HSSFSimpleShape line = patriarch.createSimpleShape(anchor);line.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);//设置图形类型line.setLineStyle(HSSFShape.LINESTYLE_SOLID);//设置图形样式line.setLineWidth(6350);//在POI中线的宽度12700表示1pt,所以这里是0.5pt粗的线条。
通常,利用POI画图主要有以下几个步骤:
1. 创建一个Patriarch(注意,一个sheet中通常只创建一个Patriarch对象);
2. 创建一个Anchor,以确定图形的位置;
3. 调用Patriarch创建图形;
4. 设置图形类型(直线,矩形,圆形等)及样式(颜色,粗细等)。
关于HSSFClientAnchor(dx1,dy1,dx2,dy2,col1,row1,col2,row2)的参数,有必要在这里说明一下:
dx1:起始单元格的x偏移量,如例子中的0表示直线起始位置距B1单元格左侧的距离;
dy1:起始单元格的y偏移量,如例子中的0表示直线起始位置距B1单元格上侧的距离;
dx2:终止单元格的x偏移量,如例子中的0表示直线起始位置距E5单元格左侧的距离;
dy2:终止单元格的y偏移量,如例子中的0表示直线起始位置距E5单元格上侧的距离;
col1:起始单元格列序号,从0开始计算;
row1:起始单元格行序号,从0开始计算,如例子中col1=1,row1=0就表示起始单元格为B1;
col2:终止单元格列序号,从0开始计算;
row2:终止单元格行序号,从0开始计算,如例子中col2=4,row2=4就表示起始单元格为E5;
最后,关于LineStyle属性,有如下一些可选值,对应的效果分别如图所示:
(2)画矩形
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFPatriarch patriarch=sheet.createDrawingPatriarch();HSSFClientAnchor anchor = new HSSFClientAnchor(255,122, 255, 122, (short)1, 0,(short)4, 3);HSSFSimpleShape rec = patriarch.createSimpleShape(anchor);rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE);rec.setLineStyle(HSSFShape.LINESTYLE_DASHGEL);//设置边框样式rec.setFillColor(255, 0, 0);//设置填充色rec.setLineWidth(25400);//设置边框宽度rec.setLineStyleColor(0, 0, 255);//设置边框颜色
(3)画圆形
更改上例的代码如下:
rec.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);//设置图片类型
(4)画Grid
在POI中,本身没有画Grid(网格)的方法。但我们知道Grid其实就是由横线和竖线构成的,所在我们可以通过画线的方式来模拟画Grid。代码如下:
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(2);row.createCell(1);row.setHeightInPoints(240);sheet
.setColumnWidth(2, 9000);int linesCount = 20;HSSFPatriarch patriarch = sheet.createDrawingPatriarch();//因为HSSFClientAnchor中dx只能在0-1023之间,dy只能在0-255之间,这里采用比例的方式double xRatio = 1023.0 / (linesCount * 10);double yRatio = 255.0 / (linesCount * 10);// 画竖线int x1 = 0;int y1 = 0;int x2 = 0;int y2 = 200;for (int i = 0; i < linesCount; i++){ HSSFClientAnchor a2 = new HSSFClientAnchor(); a2.setAnchor((short) 2, 2, (int) (x1 * xRatio), (int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio), (int) (y2 * yRatio)); HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2); shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); x1 += 10; x2 += 10;}// 画横线x1 = 0;y1 = 0;x2 = 200;y2 = 0;for (int i = 0; i < linesCount; i++){ HSSFClientAnchor a2 = new HSSFClientAnchor(); a2.setAnchor((short) 2, 2, (int) (x1 * xRatio), (int) (y1 * yRatio), (short) 2, 2, (int) (x2 * xRatio), (int) (y2 * yRatio)); HSSFSimpleShape shape2 = patriarch.createSimpleShape(a2); shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE); y1 += 10; y2 += 10;}
(5)插入图片
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)FileInputStream stream=new FileInputStream("d:\\POI\\Apache.gif");byte[] bytes=new byte[(int)stream.getChannel().size()];stream.read(bytes);//读取图片到二进制数组int pictureIdx = workbook.addPicture(bytes, HSSFWorkbook.PICTURE_TYPE_JPEG);HSSFPatriarch patriarch = sheet.createDrawingPatriarch();HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short)0, 0, (short
)5, 5);HSSFPicture pict = patriarch.createPicture(anchor, pictureIdx);//pict.resize();//自动调节图片大小,图片位置信息可能丢失
(6)从Excel文件提取图片
InputStream inp = new FileInputStream(filePath);HSSFWorkbook workbook = new HSSFWorkbook(inp);//读取现有的Excel文件List<HSSFPictureData> pictures = workbook.getAllPictures();for(int i=0;i<pictures.size();i++){ HSSFPictureData pic=pictures.get(i); String ext = pic.suggestFileExtension(); if (ext.equals("png"))//判断文件格式 { FileOutputStream png=new FileOutputStream("d:\\POI\\Apache.png"); png.write(pic.getData()); png.close();//保存图片 }}
6.Excel表操作
(1)设置默认工作表
HSSFWorkbook workbook = new HSSFWorkbook();// 创建Excel文件(Workbook)workbook.createSheet("Test0");// 创建工作表(Sheet)workbook.createSheet("Test1");// 创建工作表(Sheet)workbook.createSheet("Test2");// 创建工作表(Sheet)workbook.createSheet("Test3");// 创建工作表(Sheet)workbook.setActiveSheet(2);//设置默认工作表
(2)重命名工作表
HSSFWorkbook workbook = new HSSFWorkbook();// 创建Excel文件(Workbook)workbook.createSheet("Test0");// 创建工作表(Sheet)workbook.createSheet("Test1");// 创建工作表(Sheet)workbook.createSheet("Test2");// 创建工作表(Sheet)workbook.createSheet("Test3");// 创建工作表(Sheet)workbook.setSheetName(2, "1234");//重命名工作表
(3)调整表单显示比例
HSSFWorkbook workbook = new HSSFWorkbook();// 创建Excel文件(Workbook)HSSFSheet sheet1= workbook.createSheet("Test0");// 创建工作表(Sheet)HSSFSheet sheet2=workbook.createSheet("Test1");// 创建工作表(Sheet)HSSFSheet sheet3=workbook.createSheet("Test2");// 创建工作表(Sheet)sheet1.setZoom(1,2);//50%显示比例sheet2.setZoom(2,1);//200%显示比例sheet3.setZoom(1,10);//10%显示比例
(4)显示/隐藏网格线
HSSFWorkbook workbook = new HSSFWorkbook();// 创建Excel文件(Workbook)HSSFSheet sheet1= workbook.createSheet("Test0");// 创建工作表(Sheet)HSSFSheet sheet2=workbook.createSheet("Test1");// 创建工作表(Sheet)sheet1.setDisplayGridlines(false);//隐藏Excel网格线,默认值为truesheet2.setGridsPrinted(true);//打印时显示网格线,默认值为false
(5)遍历Sheet
String
filePath = "d:\\users\\lizw\\桌面\\POI\\sample.xls";FileInputStream stream = new FileInputStream(filePath);HSSFWorkbook workbook = new HSSFWorkbook(stream);//读取现有的ExcelHSSFSheet sheet= workbook.getSheet("Test0");//得到指定名称的Sheetfor (Row row : sheet){ for (Cell cell : row) { System.out.print(cell + "\t"); } System.out.println();}
7.Excel行列操作
(1)组合行、列
HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)sheet.groupRow(1, 3);//组合行sheet.groupRow(2, 4);//组合行sheet.groupColumn(2, 7);//组合列
这里简单的介绍一下什么叫做组合:组合分为行组合和列组合,所谓行组合,就是让n行组合成一个集合,能够进行展开和合拢操作。
使用POI也可以取消组合,例如:sheet.ungroupColumn(1, 3);//取消列组合
(2)锁定列
在Excel中,有时可能会出现列数太多或是行数太多的情况,这时可以通过锁定列来冻结部分列,不随滚动条滑动,方便查看。
HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)sheet.createFreezePane(2, 3, 15, 25);//冻结行列
下面对CreateFreezePane的参数作一下说明:
第一个参数表示要冻结的列数;
第二个参数表示要冻结的行数,这里只冻结列所以为0;
第三个参数表示右边区域可见的首列序号,从1开始计算;
第四个参数表示下边区域可见的首行序号,也是从1开始计算,这里是冻结列,所以为0;
(3)上下移动行
FileInputStream stream = new FileInputStream(filePath);HSSFWorkbook workbook = new HSSFWorkbook(stream);HSSFSheet sheet = workbook.getSheet("Test0");sheet.shiftRows(2, 4, 2);//把第3行到第4行向下移动两行
HSSFSheet.shiftRows(startRow, endRow, n)参数说明
startRow:需要移动的起始行;
endRow:需要移动的结束行;
n:移动的位置,正数表示向下移动,负数表示向上移动;