一、POI概述
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
结构:
-
- HSSF - 提供读写Microsoft Excel格式档案的功能。
- XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。
- HWPF - 提供读写Microsoft Word格式档案的功能。
- HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
- HDGF - 提供读写Microsoft Visio格式档案的功能。
使用必须引入依赖
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency>
注:3.17版本是支持jdk6的最后版本
二、HSSF概况
HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。
三、 POI EXCEL文档结构类
- HSSFWorkbook excel文档对象
- HSSFSheet excel的sheet
- HSSFRow excel的行
- HSSFCell excel的单元格
- HSSFFont excel字体
- HSSFName 名称
- HSSFDataFormat 日期格式
- HSSFHeader sheet头
- HSSFFooter sheet尾
- HSSFCellStyle cell样式
- HSSFDateUtil 日期
- HSSFPrintSetup 打印
- HSSFErrorConstants 错误信息表
四、EXCEL的读写操作
1、读取“区域数据.xls”并储存于list集合中,“区域数据.xls”如下图
1 public List<Area> importXLS(){ 2 3 ArrayList<Area> list = new ArrayList<>(); 4 try { 5 //1、获取文件输入流 6 InputStream inputStream = new FileInputStream("/Users/Shared/区域数据.xls"); 7 //2、获取Excel工作簿对象 8 HSSFWorkbook workbook = new HSSFWorkbook(inputStream); 9 //3、得到Excel工作表对象 10 HSSFSheet sheetAt = workbook.getSheetAt(0); 11 //4、循环读取表格数据 12 for (Row row : sheetAt) { 13 //首行(即表头)不读取 14 if (row.getRowNum() == 0) { 15 continue; 16 } 17 //读取当前行中单元格数据,索引从0开始 18 String areaNum = row.getCell(0).getStringCellValue(); 19 String province = row.getCell(1).getStringCellValue(); 20 String city = row.getCell(2).getStringCellValue(); 21 String district = row.getCell(3).getStringCellValue(); 22 String postcode = row.getCell(4).getStringCellValue(); 23 24 Area area = new Area(); 25 area.setCity(city); 26 area.setDistrict(district); 27 area.setProvince(province); 28 area.setPostCode(postcode); 29 list.add(area); 30 } 31 //5、关闭流 32 workbook.close(); 33 } catch (IOException e) { 34 e.printStackTrace(); 35 } 36 return list; 37 }
2、导出数据到“区域数据.xls”文件中,页面数据如下图:
1 public void exportExcel() throws IOException { 2 3 Page<Area> page = areaService.pageQuery(null); 4 List<Area> list = page.getContent(); 5 6 //1.在内存中创建一个excel文件 7 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); 8 //2.创建工作簿 9 HSSFSheet sheet = hssfWorkbook.createSheet(); 10 //3.创建标题行 11 HSSFRow titlerRow = sheet.createRow(0); 12 titlerRow.createCell(0).setCellValue("省"); 13 titlerRow.createCell(1).setCellValue("市"); 14 titlerRow.createCell(2).setCellValue("区"); 15 titlerRow.createCell(3).setCellValue("邮编"); 16 titlerRow.createCell(4).setCellValue("简码"); 17 titlerRow.createCell(5).setCellValue("城市编码"); 18 19 //4.遍历数据,创建数据行 20 for (Area area : list) { 21 //获取最后一行的行号 22 int lastRowNum = sheet.getLastRowNum(); 23 HSSFRow dataRow = sheet.createRow(lastRowNum + 1); 24 dataRow.createCell(0).setCellValue(area.getProvince()); 25 dataRow.createCell(1).setCellValue(area.getCity()); 26 dataRow.createCell(2).setCellValue(area.getDistrict()); 27 dataRow.createCell(3).setCellValue(area.getPostcode()); 28 dataRow.createCell(4).setCellValue(area.getShortcode()); 29 dataRow.createCell(5).setCellValue(area.getCitycode()); 30 } 31 //5.创建文件名 32 String fileName = "区域数据统计.xls"; 33 //6.获取输出流对象 34 HttpServletResponse response = ServletActionContext.getResponse(); 35 ServletOutputStream outputStream = response.getOutputStream(); 36 37 //7.获取mimeType 38 ServletContext servletContext = ServletActionContext.getServletContext(); 39 String mimeType = servletContext.getMimeType(fileName); 40 //8.获取浏览器信息,对文件名进行重新编码 41 HttpServletRequest request = ServletActionContext.getRequest(); 42 fileName = FileUtils.filenameEncoding(fileName, request); 43 44 //9.设置信息头 45 response.setContentType(mimeType); 46 response.setHeader("Content-Disposition","attachment;filename="+fileName); 47 //10.写出文件,关闭流 48 hssfWorkbook.write(outputStream); 49 hssfWorkbook.close(); 50 }
工具类
1 public class FileUtils { 2 3 public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException { 4 String agent = request.getHeader("User-Agent"); //获取浏览器 5 if (agent.contains("Firefox")) { 6 BASE64Encoder base64Encoder = new BASE64Encoder(); 7 filename = "=?utf-8?B?" 8 + base64Encoder.encode(filename.getBytes("utf-8")) 9 + "?="; 10 } else if(agent.contains("MSIE")) { 11 filename = URLEncoder.encode(filename, "utf-8"); 12 } else if(agent.contains ("Safari")) { 13 filename = new String (filename.getBytes ("utf-8"),"ISO8859-1"); 14 } else { 15 filename = URLEncoder.encode(filename, "utf-8"); 16 } 17 return filename; 18 } 19 }
写出xls文件:
五、 EXCEL常用操作方法
1、 得到Excel常用对象
1 POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls")); 2 //得到Excel工作簿对象 3 HSSFWorkbook wb = new HSSFWorkbook(fs); 4 //得到Excel工作表对象 5 HSSFSheet sheet = wb.getSheetAt(0); 6 //得到Excel工作表的行 7 HSSFRow row = sheet.getRow(i); 8 //得到Excel工作表指定行的单元格 9 HSSFCell cell = row.getCell((short) j); 10 cellStyle = cell.getCellStyle();//得到单元格样式
2、建立Excel常用对象
1 HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象 2 HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象 3 HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行 4 cellStyle = wb.createCellStyle();//创建单元格样式 5 row.createCell((short)0).setCellStyle(cellStyle); //创建Excel工作表指定行的单元格 6 row.createCell((short)0).setCellValue(1); //设置Excel工作表的值
3、设置sheet名称和单元格内容
1 wb.setSheetName(1, "第一张工作表",HSSFCell.ENCODING_UTF_16); 2 cell.setEncoding((short) 1); 3 cell.setCellValue("单元格内容");
4、取得sheet的数目
1 wb.getNumberOfSheets()
5、 根据index取得sheet对象
1 HSSFSheet sheet = wb.getSheetAt(0);
6、取得有效的行数
1 int rowcount = sheet.getLastRowNum();
7、取得一行的有效单元格个数
1 row.getLastCellNum();
8、单元格值类型读写
1 cell.setCellType(HSSFCell.CELL_TYPE_STRING); //设置单元格为STRING类型 2 cell.getNumericCellValue();//读取为数值类型的单元格内容
9、设置列宽、行高
1 sheet.setColumnWidth((short)column,(short)width); 2 row.setHeight((short)height);
10、添加区域,合并单元格
1 Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo 2 ,(short)columnTo);//合并从第rowFrom行columnFrom列 3 sheet.addMergedRegion(region);// 到rowTo行columnTo的区域 4 //得到所有区域 5 sheet.getNumMergedRegions()
11、保存Excel文件
1 FileOutputStream fileOut = new FileOutputStream(path); 2 wb.write(fileOut);
12、根据单元格不同属性返回字符串数值
1 public String getCellStringValue(HSSFCell cell) { 2 String cellValue = ""; 3 switch (cell.getCellType()) { 4 case HSSFCell.CELL_TYPE_STRING://字符串类型 5 cellValue = cell.getStringCellValue(); 6 if(cellValue.trim().equals("")||cellValue.trim().length()<=0) 7 cellValue=" "; 8 break; 9 case HSSFCell.CELL_TYPE_NUMERIC: //数值类型 10 cellValue = String.valueOf(cell.getNumericCellValue()); 11 break; 12 case HSSFCell.CELL_TYPE_FORMULA: //公式 13 cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); 14 cellValue = String.valueOf(cell.getNumericCellValue()); 15 break; 16 case HSSFCell.CELL_TYPE_BLANK: 17 cellValue=" "; 18 break; 19 case HSSFCell.CELL_TYPE_BOOLEAN: 20 break; 21 case HSSFCell.CELL_TYPE_ERROR: 22 break; 23 default: 24 break; 25 } 26 return cellValue; 27 }
13、常用单元格边框格式
1 HSSFCellStyle style = wb.createCellStyle(); 2 style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下边框 3 style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左边框 4 style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框 5 style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
14、设置字体和内容位置
1 HSSFFont f = wb.createFont(); 2 f.setFontHeightInPoints((short) 11);//字号 3 f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗 4 style.setFont(f); 5 style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中 6 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中 7 style.setRotation(short rotation);//单元格内容的旋转的角度 8 HSSFDataFormat df = wb.createDataFormat(); 9 style1.setDataFormat(df.getFormat("0.00%"));//设置单元格数据格式 10 cell.setCellFormula(string);//给单元格设公式 11 style.setRotation(short rotation);//单元格内容的旋转的角度
15、插入图片
1 //先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray 2 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); 3 BufferedImage bufferImg = ImageIO.read(new File("ok.jpg")); 4 ImageIO.write(bufferImg,"jpg",byteArrayOut); 5 //读进一个excel模版 6 FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt"); 7 fs = new POIFSFileSystem(fos); 8 //创建一个工作薄 9 HSSFWorkbook wb = new HSSFWorkbook(fs); 10 HSSFSheet sheet = wb.getSheetAt(0); 11 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); 12 HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10); 13 patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));
16、调整工作表位置
1 HSSFWorkbook wb = new HSSFWorkbook(); 2 HSSFSheet sheet = wb.createSheet("format sheet"); 3 HSSFPrintSetup ps = sheet.getPrintSetup(); 4 sheet.setAutobreaks(true); 5 ps.setFitHeight((short)1); 6 ps.setFitWidth((short)1);