一、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格式檔案的功能。
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 錯誤信息表

poi讀excel public List<Area> importXLS(){ ArrayList<Area> list = new ArrayList<>(); try { //1、獲取文件輸入流 InputStream inputStream = new FileInputStream("/Users/Shared/數據.xls"); //2、獲取Excel工作簿對象 HSSFWorkbook workbook = new HSSFWorkbook(inputStream); //3、得到Excel工作表對象 HSSFSheet sheetAt = workbook.getSheetAt(0); //4、循環讀取表格數據 for (Row row : sheetAt) { //首行(即表頭)不讀取 if (row.getRowNum() == 0) { continue; } //讀取當前行中單元格數據,索引從0開始 String areaNum = row.getCell(0).getStringCellValue(); String province = row.getCell(1).getStringCellValue(); String city = row.getCell(2).getStringCellValue(); String district = row.getCell(3).getStringCellValue(); String postcode = row.getCell(4).getStringCellValue(); Area area = new Area(); area.setCity(city); area.setDistrict(district); area.setProvince(province); area.setPostCode(postcode); list.add(area); } //5、關閉流 workbook.close(); } catch (IOException e) { e.printStackTrace(); } return list; }
poi XSSFWorkbook讀取.xlsx
文件
// 打開指定位置的Excel文件 FileInputStream file = new FileInputStream(new File(fileLocation)); Workbook workbook = new XSSFWorkbook(file); // 打開Excel中的第一個Sheet Sheet sheet = workbook.getSheetAt(0); // 讀取Sheet中的數據 Map<Integer, List<String>> data = new HashMap<>(); int i = 0; for (Row row : sheet) { // 行 data.put(i, new ArrayList<String>()); for (Cell cell : row) { // 單元格 switch (cell.getCellType()) { // 不同的數據類型 case STRING: ... break; // 字符串類型 case NUMERIC: ... break; // 數值類型 case BOOLEAN: ... break; // 布爾類型 case FORMULA: ... break; // 公式類型 case BLANK: ... break; // 空白類型 } } i++; }

//poi讀excel POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls")); //得到Excel工作簿對象 HSSFWorkbook wb = new HSSFWorkbook(fs); //得到Excel工作表對象 HSSFSheet sheet = wb.getSheetAt(0); //得到Excel工作表的行 HSSFRow row = sheet.getRow(i); //得到Excel工作表指定行的單元格 HSSFCell cell = row.getCell((short) j); cellStyle = cell.getCellStyle();//得到單元格樣式 //poi寫excel HSSFWorkbook wb = new HSSFWorkbook();//創建Excel工作簿對象 HSSFSheet sheet = wb.createSheet("new sheet");//創建Excel工作表對象 HSSFRow row = sheet.createRow((short)0); //創建Excel工作表的行 cellStyle = wb.createCellStyle();//創建單元格樣式 row.createCell((short)0).setCellStyle(cellStyle); //創建Excel工作表指定行的單元格 row.createCell((short)0).setCellValue(1); //設置Excel工作表的值

poi寫excel public void exportExcel() throws IOException { Page<Area> page = areaService.pageQuery(null); List<Area> list = page.getContent(); //1.在內存中創建一個excel文件 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); //2.創建工作簿 HSSFSheet sheet = hssfWorkbook.createSheet(); //3.創建標題行 HSSFRow titlerRow = sheet.createRow(0); titlerRow.createCell(0).setCellValue("標題1"); titlerRow.createCell(1).setCellValue("標題2"); titlerRow.createCell(2).setCellValue("標題3"); titlerRow.createCell(3).setCellValue("標題4"); titlerRow.createCell(4).setCellValue("標題5"); titlerRow.createCell(5).setCellValue("標題6"); //4.遍歷數據,創建數據行 for (Area area : list) { //獲取最后一行的行號 int lastRowNum = sheet.getLastRowNum(); HSSFRow dataRow = sheet.createRow(lastRowNum + 1); dataRow.createCell(0).setCellValue(area.getProvince()); dataRow.createCell(1).setCellValue(area.getCity()); dataRow.createCell(2).setCellValue(area.getDistrict()); dataRow.createCell(3).setCellValue(area.getPostcode()); dataRow.createCell(4).setCellValue(area.getShortcode()); dataRow.createCell(5).setCellValue(area.getCitycode()); } //5.創建文件名 String fileName = "數據統計.xls"; //6.獲取輸出流對象 HttpServletResponse response = ServletActionContext.getResponse(); ServletOutputStream outputStream = response.getOutputStream(); //7.獲取mimeType ServletContext servletContext = ServletActionContext.getServletContext(); String mimeType = servletContext.getMimeType(fileName); //8.獲取瀏覽器信息,對文件名進行重新編碼 HttpServletRequest request = ServletActionContext.getRequest(); fileName = FileUtils.filenameEncoding(fileName, request); //9.設置信息頭 response.setContentType(mimeType); response.setHeader("Content-Disposition","attachment;filename="+fileName); //10.寫出文件,關閉流 hssfWorkbook.write(outputStream); hssfWorkbook.close(); } public class FileUtils { public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException { String agent = request.getHeader("User-Agent"); //獲取瀏覽器 if (agent.contains("Firefox")) { BASE64Encoder base64Encoder = new BASE64Encoder(); filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?="; } else if(agent.contains("MSIE")) { filename = URLEncoder.encode(filename, "utf-8"); } else if(agent.contains ("Safari")) { filename = new String (filename.getBytes ("utf-8"),"ISO8859-1"); } else { filename = URLEncoder.encode(filename, "utf-8"); } return filename; } }
根據index取得sheet對象 HSSFSheet sheet = wb.getSheetAt(0); 取得有效的行數 int rowcount = sheet.getLastRowNum(); 取得一行的有效單元格個數 row.getLastCellNum(); 單元格值類型讀寫 cell.setCellType(HSSFCell.CELL_TYPE_STRING); //設置單元格為STRING類型 cell.getNumericCellValue();//讀取為數值類型的單元格內容 設置列寬、行高 sheet.setColumnWidth((short)column,(short)width); row.setHeight((short)height);
HSSFSheet有個方法叫SetColumnWidth,共有兩個參數:一個是列的索引(從0開始),一個是寬度
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
HSSFSheet sheet1 = hssfworkbook.CreateSheet(“Sheet1″);
sheet1.SetColumnWidth(1, 100 * 256);
讀取一個列的寬度呢
int col1width = sheet1.GetColumnWidth(1);
要設置第一行的高度
sheet1.CreateRow(0).Height = 200*20;或sheet1.CreateRow(0).HeightInPoints = 200;
獲得某一行的行高,可以直接拿HSSFRow.Height屬性的返回值
使用HSSFSheet.DefaultColumnWidth、HSSFSheet.DefaultRowHeight和HSSFSheet.DefaultRowHeightInPoints屬性。
一旦設置了這些屬性,如果某一行或者某一列沒有設置寬度,就會使用默認寬度或高度
sheet1.DefaultColumnWidth=100*256;
sheet1.DefaultRowHeight=30*20;
// 設置字體
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 20); //字體高度
font.setColor(HSSFFont.COLOR_RED); //字體顏色
font.setFontName("黑體"); //字體
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //寬度
font.setItalic(true); //是否使用斜體
// font.setStrikeout(true); //是否使用划線
// 設置單元格類型
HSSFCellStyle cellStyle = workbook.createCellStyle();
cellStyle.setFont(font);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //水平布局:居中
cellStyle.setWrapText(true);
// 添加單元格注釋
// 創建HSSFPatriarch對象,HSSFPatriarch是所有注釋的容器.
HSSFPatriarch patr = sheet.createDrawingPatriarch();
// 定義注釋的大小和位置,詳見文檔
HSSFComment comment = patr.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short)4, 2, (short) 6, 5));
// 設置注釋內容
comment.setString(new HSSFRichTextString("可以在POI中添加注釋!"));
// 設置注釋作者. 當鼠標移動到單元格上是可以在狀態欄中看到該內容.
comment.setAuthor("Xuys.");
// 創建單元格
HSSFCell cell = row.createCell((short) 1);
HSSFRichTextString hssfString = new HSSFRichTextString("Hello World!");
cell.setCellValue(hssfString);//設置單元格內容
cell.setCellStyle(cellStyle);//設置單元格樣式
cell.setCellType(HSSFCell.CELL_TYPE_STRING);//指定單元格格式:數值、公式或字符串
cell.setCellComment(comment);//添加注釋
添加區域,合並單元格
Region region = new Region((short)rowFrom,(short)columnFrom,(short)rowTo
(short)columnTo);//合並從第rowFrom行columnFrom列 sheet.addMergedRegion(region);// 到rowTo行columnTo的區域 //得到所有區域 sheet.getNumMergedRegions()
合並單元格及添加超鏈接
//合並單元格,合並參數依次為--->行開始位置,行結束位置,列開始位置,列結束位置
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 5));
XSSFRow row = sheet.createRow(1);
XSSFCell cell = row.createCell(0);
//設置單元格函數,此處功能為添加超鏈接與其他sheet關聯,如果需要其他功能請參考excel函數自行修改
cell.setCellFormula("HYPERLINK(\"#TestSheet2!A1\",\"TestSheet2\")");
保存Excel文件 FileOutputStream fileOut = new FileOutputStream(path); wb.write(fileOut);
常用單元格邊框格式 HSSFCellStyle style = wb.createCellStyle(); style.setBorderBottom(HSSFCellStyle.BORDER_DOTTED);//下邊框 style.setBorderLeft(HSSFCellStyle.BORDER_DOTTED);//左邊框 style.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框 style.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框 設置字體和內容位置 HSSFFont f = wb.createFont(); f.setFontHeightInPoints((short) 11);//字號 f.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);//加粗 style.setFont(f); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//左右居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//上下居中 style.setRotation(short rotation);//單元格內容的旋轉的角度 HSSFDataFormat df = wb.createDataFormat(); style1.setDataFormat(df.getFormat("0.00%"));//設置單元格數據格式 cell.setCellFormula(string);//給單元格設公式 style.setRotation(short rotation);//單元格內容的旋轉的角度 插入圖片 //先把讀進來的圖片放到一個ByteArrayOutputStream中,以便產生ByteArray ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); BufferedImage bufferImg = ImageIO.read(new File("ok.jpg")); ImageIO.write(bufferImg,"jpg",byteArrayOut); //讀進一個excel模版 FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt"); fs = new POIFSFileSystem(fos); //創建一個工作薄 HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFSheet sheet = wb.getSheetAt(0); HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10); patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG)); 調整工作表位置 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet("format sheet"); HSSFPrintSetup ps = sheet.getPrintSetup(); sheet.setAutobreaks(true); ps.setFitHeight((short)1); ps.setFitWidth((short)1);

public String getCellStringValue(HSSFCell cell) { String cellValue = ""; switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING://字符串類型 cellValue = cell.getStringCellValue(); if(cellValue.trim().equals("")||cellValue.trim().length()<=0) cellValue=" "; break; case HSSFCell.CELL_TYPE_NUMERIC: //數值類型 cellValue = String.valueOf(cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_FORMULA: //公式 cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC); cellValue = String.valueOf(cell.getNumericCellValue()); break; case HSSFCell.CELL_TYPE_BLANK: cellValue=" "; break; case HSSFCell.CELL_TYPE_BOOLEAN: break; case HSSFCell.CELL_TYPE_ERROR: break; default: break; } return cellValue; }