1.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格式档案的功能。
类名 说明
HSSFWorkbook Excel的文档对象
HSSFSheet Excel的表单
HSSFRow Excel的行
HSSFCell Excel的格子单元
HSSFFont Excel字体
HSSFDataFormat 格子单元的日期格式
HSSFHeader Excel文档Sheet的页眉
HSSFFooter Excel文档Sheet的页脚
HSSFCellStyle 格子单元样式
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
2.Excel的基本操作
public class Test00{public static void main(String[] args) throws IOException{String filePath="d:\\users\\lizw\\桌面\\POI\\sample.xls";//文件路径HSSFWorkbook workbook = new HSSFWorkbook();//创建Excel文件(Workbook)HSSFSheet sheet = workbook.createSheet();//创建工作表(Sheet)sheet = workbook.createSheet("Test");//创建工作表(Sheet)FileOutputStream out = new FileOutputStream(filePath);workbook.write(out);//保存Excel文件out.close();//关闭文件流System.out.println("OK!");}}
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(0);// 创建行,从0开始HSSFCell cell = row.createCell(0);// 创建行的单元格,也是从0开始cell.setCellValue("李志伟");// 设置单元格内容row.createCell(1).setCellValue(false);// 设置单元格内容,重载row.createCell(2).setCellValue(new Date());// 设置单元格内容,重载row.createCell(3).setCellValue(12.345);// 设置单元格内容,重载

workbook.createInformationProperties();//创建文档信息DocumentSummaryInformation dsi= workbook.getDocumentSummaryInformation();//摘要信息dsi.setCategory("类别:Excel文件");//类别dsi.setManager("管理者:李志伟");//管理者dsi.setCompany("公司:--");//公司SummaryInformation si = workbook.getSummaryInformation();//摘要信息si.setSubject("主题:--");//主题si.setTitle("标题:测试文档");//标题si.setAuthor("作者:李志伟");//作者si.setComments("备注:POI测试文档");//备注

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFPatriarch patr = sheet.createDrawingPatriarch();HSSFClientAnchor anchor = patr.createAnchor(0, 0, 0, 0, 5, 1, 8, 3);//创建批注位置HSSFComment comment = patr.createCellComment(anchor);//创建批注comment.setString(new HSSFRichTextString("这是一个批注段落!"));//设置批注内容comment.setAuthor("李志伟");//设置批注作者comment.setVisible(true);//设置批注默认显示HSSFCell cell = sheet.createRow(2).createCell(1);cell.setCellValue("测试");cell.setCellComment(comment);//把批注赋值给单元格

dx1 第1个单元格中x轴的偏移量dy1 第1个单元格中y轴的偏移量dx2 第2个单元格中x轴的偏移量dy2 第2个单元格中y轴的偏移量col1 第1个单元格的列号row1 第1个单元格的行号col2 第2个单元格的列号row2 第2个单元格的行号
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFHeader header =sheet.getHeader();//得到页眉header.setLeft("页眉左边");header.setRight("页眉右边");header.setCenter("页眉中间");HSSFFooter footer =sheet.getFooter();//得到页脚footer.setLeft("页脚左边");footer.setRight("页脚右边");footer.setCenter("页脚中间");

HSSFHeader.tab &A 表名HSSFHeader.file &F 文件名HSSFHeader.startBold &B 粗体开始HSSFHeader.endBold &B 粗体结束HSSFHeader.startUnderline &U 下划线开始HSSFHeader.endUnderline &U 下划线结束HSSFHeader.startDoubleUnderline &E 双下划线开始HSSFHeader.endDoubleUnderline &E 双下划线结束HSSFHeader.time &T 时间HSSFHeader.date &D 日期HSSFHeader.numPages &N 总页面数HSSFHeader.page &P 当前页号
3.Excel的单元格操作
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row=sheet.createRow(0);//设置日期格式--使用Excel内嵌的格式HSSFCell cell=row.createCell(0);cell.setCellValue(new Date());HSSFCellStyle style=workbook.createCellStyle();style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));cell.setCellStyle(style);//设置保留2位小数--使用Excel内嵌的格式cell=row.createCell(1);cell.setCellValue(12.3456789);style=workbook.createCellStyle();style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));cell.setCellStyle(style);//设置货币格式--使用自定义的格式cell=row.createCell(2);cell.setCellValue(12345.6789);style=workbook.createCellStyle();style.setDataFormat(workbook.createDataFormat().getFormat("¥#,##0"));cell.setCellStyle(style);//设置百分比格式--使用自定义的格式cell=row.createCell(3);cell.setCellValue(0.123456789);style=workbook.createCellStyle();style.setDataFormat(workbook.createDataFormat().getFormat("0.00%"));cell.setCellStyle(style);//设置中文大写格式--使用自定义的格式cell=row.createCell(4);cell.setCellValue(12345);style=workbook.createCellStyle();style.setDataFormat(workbook.createDataFormat().getFormat("[DbNum2][$-804]0"));cell.setCellStyle(style);//设置科学计数法格式--使用自定义的格式cell=row.createCell(5);cell.setCellValue(12345);style=workbook.createCellStyle();style.setDataFormat(workbook.createDataFormat().getFormat("0.00E+00"));cell.setCellStyle(style);

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row=sheet.createRow(0);//合并列HSSFCell cell=row.createCell(0);cell.setCellValue("合并列");CellRangeAddress region=new CellRangeAddress(0, 0, 0, 5);sheet.addMergedRegion(region);//合并行cell=row.createCell(6);cell.setCellValue("合并行");region=new CellRangeAddress(0, 5, 6, 6);sheet.addMergedRegion(region);

firstRow 区域中第一个单元格的行号lastRow 区域中最后一个单元格的行号firstCol 区域中第一个单元格的列号lastCol 区域中最后一个单元格的列号
HSSFCell cell=row.createCell(0);cell.setCellValue("单元格对齐");HSSFCellStyle style=workbook.createCellStyle();style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中style.setWrapText(true);//自动换行style.setIndention((short)5);//缩进style.setRotation((short)60);//文本旋转,这里的取值是从-90到90,而不是0-180度。cell.setCellStyle(style);

如果是左侧对齐就是 HSSFCellStyle.ALIGN_FILL;如果是居中对齐就是 HSSFCellStyle.ALIGN_CENTER;如果是右侧对齐就是 HSSFCellStyle.ALIGN_RIGHT;如果是跨列举中就是 HSSFCellStyle.ALIGN_CENTER_SELECTION;如果是两端对齐就是 HSSFCellStyle.ALIGN_JUSTIFY;如果是填充就是 HSSFCellStyle.ALIGN_FILL;
如果是靠上就是 HSSFCellStyle.VERTICAL_TOP;如果是居中就是 HSSFCellStyle.VERTICAL_CENTER;如果是靠下就是 HSSFCellStyle.VERTICAL_BOTTOM;如果是两端对齐就是 HSSFCellStyle.VERTICAL_JUSTIFY;
| 边框相关属性 | 说明 | 范例 |
| Border+方向 | 边框类型 | BorderLeft, BorderRight等 |
| 方向+BorderColor | 边框颜色 | TopBorderColor,BottomBorderColor等 |
HSSFCell cell=row.createCell(1);cell.setCellValue("设置边框");HSSFCellStyle style=workbook.createCellStyle();style.setBorderTop(HSSFCellStyle.BORDER_DOTTED);//上边框style.setBorderBottom(HSSFCellStyle.BORDER_THICK);//下边框style.setBorderLeft(HSSFCellStyle.BORDER_DOUBLE);//左边框style.setBorderRight(HSSFCellStyle.BORDER_SLANTED_DASH_DOT);//右边框style.setTopBorderColor(HSSFColor.RED.index);//上边框颜色style.setBottomBorderColor(HSSFColor.BLUE.index);//下边框颜色style.setLeftBorderColor(HSSFColor.GREEN.index);//左边框颜色style.setRightBorderColor(HSSFColor.PINK.index);//右边框颜色cell.setCellStyle(style);

| 边框范例图 | 对应的静态值 |
|
| HSSFCellStyle.BORDER_DOTTED |
|
| HSSFCellStyle.BORDER_HAIR |
|
| HSSFCellStyle.BORDER_DASH_DOT_DOT |
|
| HSSFCellStyle.BORDER_DASH_DOT |
|
| HSSFCellStyle.BORDER_DASHED |
|
| HSSFCellStyle.BORDER_THIN |
|
| HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT |
|
| HSSFCellStyle.BORDER_SLANTED_DASH_DOT |
|
| HSSFCellStyle.BORDER_MEDIUM_DASH_DOT |
|
| HSSFCellStyle.BORDER_MEDIUM_DASHED |
|
| HSSFCellStyle.BORDER_MEDIUM |
|
| HSSFCellStyle.BORDER_THICK |
|
| HSSFCellStyle.BORDER_DOUBLE |
HSSFCell cell = row.createCell(1);cell.setCellValue("设置字体");HSSFCellStyle style = workbook.createCellStyle();HSSFFont font = workbook.createFont();font.setFontName("华文行楷");//设置字体名称font.setFontHeightInPoints((short)28);//设置字号font.setColor(HSSFColor.RED.index);//设置字体颜色font.setUnderline(FontFormatting.U_SINGLE);//设置下划线font.setTypeOffset(FontFormatting.SS_SUPER);//设置上标下标font.setStrikeout(true);//设置删除线style.setFont(font);cell.setCellStyle(style);

HSSFCellStyle style = workbook.createCellStyle();style.setFillForegroundColor(HSSFColor.GREEN.index);//设置图案颜色style.setFillBackgroundColor(HSSFColor.RED.index);//设置图案背景色style.setFillPattern(HSSFCellStyle.SQUARES);//设置图案样式cell.setCellStyle(style);

| 图案样式 | 常量 |
|
| HSSFCellStyle.NO_FILL |
|
| HSSFCellStyle.ALT_BARS |
|
| HSSFCellStyle.FINE_DOTS |
|
| HSSFCellStyle.SPARSE_DOTS |
|
| HSSFCellStyle.LESS_DOTS |
|
| HSSFCellStyle.LEAST_DOTS |
|
| HSSFCellStyle.BRICKS |
|
| HSSFCellStyle.BIG_SPOTS |
|
| HSSFCellStyle.THICK_FORWARD_DIAG |
|
| HSSFCellStyle.THICK_BACKWARD_DIAG |
|
| HSSFCellStyle.THICK_VERT_BANDS |
|
| HSSFCellStyle.THICK_HORZ_BANDS |
|
| HSSFCellStyle.THIN_HORZ_BANDS |
|
| HSSFCellStyle.THIN_VERT_BANDS |
|
| HSSFCellStyle.THIN_BACKWARD_DIAG |
|
| HSSFCellStyle.THIN_FORWARD_DIAG |
|
| HSSFCellStyle.SQUARES |
|
| HSSFCellStyle.DIAMONDS |
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(1);HSSFCell cell = row.createCell(1);cell.setCellValue("123456789012345678901234567890");sheet.setColumnWidth(1, 31 * 256);//设置第一列的宽度是31个字符宽度row.setHeightInPoints(50);//设置行的高度是50个点

HSSFCell cell = row.createCell(1);cell.setCellValue(new Date());//设置日期数据System.out.println(DateUtil.isCellDateFormatted(cell));//输出:falseHSSFCellStyle style =workbook.createCellStyle();style.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));cell.setCellStyle(style);//设置日期样式System.out.println(DateUtil.isCellDateFormatted(cell));//输出:true
4.使用Excel公式
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(0);HSSFCell cell = row.createCell(0);cell.setCellFormula("2+3*4");//设置公式cell = row.createCell(1);cell.setCellValue(10);cell = row.createCell(2);cell.setCellFormula("A1*B1");//设置公式

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue(1);row.createCell(1).setCellValue(2);row.createCell(2).setCellValue(3);row.createCell(3).setCellValue(4);row.createCell(4).setCellValue(5);row = sheet.createRow(1);row.createCell(0).setCellFormula("sum(A1,C1)");//等价于"A1+C1"row.createCell(1).setCellFormula("sum(B1:D1)");//等价于"B1+C1+D1"

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFCellStyle style=workbook.createCellStyle();style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-mm-dd"));HSSFRow row = sheet.createRow(0);Calendar date=Calendar.getInstance();//日历对象HSSFCell cell=row.createCell(0);date.set(2011,2, 7);cell.setCellValue(date.getTime());cell.setCellStyle(style);//第一个单元格开始时间设置完成cell=row.createCell(1);date.set(2014,4, 25);cell.setCellValue(date.getTime());cell.setCellStyle(style);//第一个单元格结束时间设置完成cell=row.createCell(3);cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"y\"),\"年\")");cell=row.createCell(4);cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"m\"),\"月\")");cell=row.createCell(5);cell.setCellFormula("CONCATENATE(DATEDIF(A1,B1,\"d\"),\"日\")");

DATEDIF(A1,B1,\"y\"):取得A1单元格的日期与B1单元格的日期的时间间隔。(“y”:表示以年为单位,”m”表示以月为单位;”d”表示以天为单位)。
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue("abcdefg");row.createCell(1).setCellValue("aa bb cc dd ee fF GG");row.createCell(3).setCellFormula("UPPER(A1)");row.createCell(4).setCellFormula("PROPER(B1)");

UPPER(String):将文本转换成大写形式。
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue(12);row.createCell(1).setCellValue(23);row.createCell(3).setCellFormula("IF(A1>B1,\"A1大于B1\",\"A1小于等于B1\")");

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue(57);row.createCell(1).setCellValue(89);row.createCell(2).setCellValue(56);row.createCell(3).setCellValue(67);row.createCell(4).setCellValue(60);row.createCell(5).setCellValue(73);row.createCell(7).setCellFormula("COUNTIF(A1:F1,\">=60\")");row.createCell(8).setCellFormula("SUMIF(A1:F1,\">=60\",A1:F1)");

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue(0);row.createCell(1).setCellValue(59);row.createCell(2).setCellValue("不及格");row = sheet.createRow(1);row.createCell(0).setCellValue(60);row.createCell(1).setCellValue(69);row.createCell(2).setCellValue("及格");row = sheet.createRow(2);row.createCell(0).setCellValue(70);row.createCell(1).setCellValue(79);row.createCell(2).setCellValue("良好");row = sheet.createRow(3);row.createCell(0).setCellValue(80);row.createCell(1).setCellValue(100);row.createCell(2).setCellValue("优秀");row = sheet.createRow(4);row.createCell(0).setCellValue(75);row.createCell(1).setCellFormula("LOOKUP(A5,$A$1:$A$4,$C$1:$C$4)");row.createCell(2).setCellFormula("VLOOKUP(A5,$A$1:$C$4,3,true)");

LOOKUP(lookup_value,lookup_vector,result_vector),第一个参数:需要查找的内容,本例中指向A5单元格,也就是75;第二个参数:比较对象区域,本例中的成绩需要与$A$1:$A$4中的各单元格中的值进行比较;第三个参数:查找结果区域,如果匹配到会将此区域中对应的数据返回。如本例中返回$C$1:$C$4中对应的值。
VLOOKUP(lookup_value,lookup_area,result_col,is_fuzzy ),第一个参数:需要查找的内容,这里是A5单元格;第二个参数:需要比较的表,这里是$A$1:$C$4,注意VLOOKUP匹配时只与表中的第一列进行匹配。第三个参数:匹配结果对应的列序号。这里要对应的是成绩列,所以为3。第四个参数:指明是否模糊匹配。例子中的TRUE表示模糊匹配,与上例中一样。匹配到的是第三行。如果将此参数改为FALSE,因为在表中的第1列中找不到75,所以会报“#N/A”的计算错误。
HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(0);row.createCell(0).setCellFormula("RAND()");//取0-1之间的随机数row.createCell(1).setCellFormula("int(RAND()*100)");//取0-100之间的随机整数row.createCell(2).setCellFormula("rand()*10+10");//取10-20之间的随机实数row.createCell(3).setCellFormula("CHAR(INT(RAND()*26)+97)");//随机小写字母row.createCell(4).setCellFormula("CHAR(INT(RAND()*26)+65)");//随机大写字母//随机大小写字母row.createCell(5).setCellFormula("CHAR(INT(RAND()*26)+if(INT(RAND()*2)=0,97,65))");

HSSFSheet sheet = workbook.createSheet("Test");// 创建工作表(Sheet)HSSFRow row = sheet.createRow(0);row.createCell(0).setCellValue(7);//A1row.createCell(1).setCellValue(8);//B1HSSFCell cell=row.createCell(2);cell.setCellFormula("A1*B1+14");HSSFFormulaEvaluator e = new HSSFFormulaEvaluator(workbook);cell = e.evaluateInCell(cell);//若Excel文件不是POI创建的,则不必调用此方法System.out.println("公式计算结果:"+cell.getNumericCellValue());

5.使用图形
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粗的线条。


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);//设置边框颜色


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;}
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();//自动调节图片大小,图片位置信息可能丢失

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表操作
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);//设置默认工作表
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");//重命名工作表
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%显示比例



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

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行列操作
HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)sheet.groupRow(1, 3);//组合行sheet.groupRow(2, 4);//组合行sheet.groupColumn(2, 7);//组合列

HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)sheet.createFreezePane(2, 3, 15, 25);//冻结行列

FileInputStream stream = new FileInputStream(filePath);HSSFWorkbook workbook = new HSSFWorkbook(stream);HSSFSheet sheet = workbook.getSheet("Test0");sheet.shiftRows(2, 4, 2);//把第3行到第4行向下移动两行


8.Excel的其他功能
HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)HSSFRow row=sheet.createRow(1);HSSFCell cell=row.createCell(1);cell.setCellValue("已锁定");HSSFCellStyle locked = workbook.createCellStyle();locked.setLocked(true);//设置锁定cell.setCellStyle(locked);cell=row.createCell(2);cell.setCellValue("未锁定");HSSFCellStyle unlocked = workbook.createCellStyle();unlocked.setLocked(false);//设置不锁定cell.setCellStyle(unlocked);sheet.protectSheet("password");//设置保护密码

HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)HSSFRow row=sheet.createRow(0);HSSFCell cell=row.createCell(0);cell.setCellValue("日期列");CellRangeAddressList regions = new CellRangeAddressList(1, 65535, 0, 0);//选定一个区域DVConstraint constraint = DVConstraint.createDateConstraint(DVConstraint.OperatorType.BETWEEN, "1993-01-01", "2014-12-31", "yyyy-MM-dd");HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);dataValidate.createErrorBox("错误", "你必须输入一个时间!");sheet.addValidationData(dataValidate);



CellRangeAddressList regions = new CellRangeAddressList(0, 65535, 0, 0);DVConstraint constraint = DVConstraint.createExplicitListConstraint(new String[] { "C++", "Java", "C#" });HSSFDataValidation dataValidate = new HSSFDataValidation(regions, constraint);sheet.addValidationData(dataValidate);

HSSFSheet sheet= workbook.createSheet("Test0");// 创建工作表(Sheet)HSSFPrintSetup print = sheet.getPrintSetup();//得到打印对象print.setLandscape(false);//true,则表示页面方向为横向;否则为纵向print.setScale((short)80);//缩放比例80%(设置为0-100之间的值)print.setFitWidth((short)2);//设置页宽print.setFitHeight((short)4);//设置页高print.setPaperSize(HSSFPrintSetup.A4_PAPERSIZE);//纸张设置print.setUsePage(true);//设置打印起始页码不使用"自动"print.setPageStart((short)6);//设置打印起始页码sheet.setPrintGridlines(true);//设置打印网格线print.setNoColor(true);//值为true时,表示单色打印print.setDraft(true);//值为true时,表示用草稿品质打印print.setLeftToRight(true);//true表示“先行后列”;false表示“先列后行”print.setNotes(true);//设置打印批注sheet.setAutobreaks(false);//Sheet页自适应页面大小
HSSFSheet sheet = workbook.createSheet("Test0");CreationHelper createHelper = workbook.getCreationHelper();// 关联到网站Hyperlink link = createHelper.createHyperlink(Hyperlink.LINK_URL);link.setAddress("http://poi.apache.org/");sheet.createRow(0).createCell(0).setHyperlink(link);// 关联到当前目录的文件link = createHelper.createHyperlink(Hyperlink.LINK_FILE);link.setAddress("sample.xls");sheet.createRow(0).createCell(1).setHyperlink(link);// e-mail 关联link = createHelper.createHyperlink(Hyperlink.LINK_EMAIL);link.setAddress("mailto:poi@apache.org?subject=Hyperlinks");sheet.createRow(0).createCell(2).setHyperlink(link);//关联到工作簿中的位置link = createHelper.createHyperlink(Hyperlink.LINK_DOCUMENT);link.setAddress("'Test0'!C3");//Sheet名为Test0的C3位置sheet.createRow(0).createCell(3).setHyperlink(link);

9.POI对Word的基本操作
XWPFDocument doc = new XWPFDocument();// 创建Word文件XWPFParagraph p = doc.createParagraph();// 新建一个段落p.setAlignment(ParagraphAlignment.CENTER);// 设置段落的对齐方式p.setBorderBottom(Borders.DOUBLE);//设置下边框p.setBorderTop(Borders.DOUBLE);//设置上边框p.setBorderRight(Borders.DOUBLE);//设置右边框p.setBorderLeft(Borders.DOUBLE);//设置左边框XWPFRun r = p.createRun();//创建段落文本r.setText("POI创建的Word段落文本");r.setBold(true);//设置为粗体r.setColor("FF0000");//设置颜色p = doc.createParagraph();// 新建一个段落r = p.createRun();r.setText("POI读写Excel功能强大、操作简单。");XWPFTable table= doc.createTable(3, 3);//创建一个表格table.getRow(0).getCell(0).setText("表格1");table.getRow(1).getCell(1).setText("表格2");table.getRow(2).getCell(2).setText("表格3");FileOutputStream out = new FileOutputStream("d:\\POI\\sample.doc");doc.write(out);out.close();

FileInputStream stream = new FileInputStream("d:\\POI\\sample.doc");XWPFDocument doc = new XWPFDocument(stream);// 创建Word文件for(XWPFParagraph p : doc.getParagraphs())//遍历段落{System.out.print(p.getParagraphText());}for(XWPFTable table : doc.getTables())//遍历表格{for(XWPFTableRow row : table.getRows()){for(XWPFTableCell cell : row.getTableCells()){System.out.print(cell.getText());}}}
