引入jar包
首先,在maven中pom.xml添加
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency>
要用XSSFWorkbook和SXSSHWorkbook(處理大量數據用)還需引入
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency>
代碼
新建Excel文件,並制定Excel版本,表單名稱,表頭,數據及Excel文件路徑
/** * 新建Excel文件,New Workbook * @param excelType 可為null,Excel版本,可為2003(.xls)或者2007(.xlsx),默認為2003版本 * @param sheetName 新建表單名稱 * @param headList 表頭List集合 * @param dataList 數據List<List<集合>>(行<列>) * @param path 新建excel路徑 * @return */ public static boolean createWorkBook(String excelType, String sheetName, List<String> headList,List<List<String>> dataList,String path){ Workbook wb = null; /*創建文件*/ if (excelType == null || excelType.endsWith("2003")) { /*操作Excel2003以前(包括2003)的版本,擴展名是.xls */ wb = new HSSFWorkbook(); }else if (excelType.endsWith("2007")){ /*XSSFWorkbook:是操作Excel2007的版本,擴展名是.xlsx */ wb = new XSSFWorkbook(); }else { //默認為2003版本 /*操作Excel2003以前(包括2003)的版本,擴展名是.xls */ wb = new HSSFWorkbook(); } /*Excel文件創建完畢*/ CreationHelper createHelper = wb.getCreationHelper(); //創建幫助工具 /*創建表單*/ Sheet sheet = wb.createSheet(sheetName!=null?sheetName:"new sheet"); // Note that sheet name is Excel must not exceed 31 characters(注意sheet的名字的長度不能超過31個字符,若是超過的話,會自動截取前31個字符) // and must not contain any of the any of the following characters:(不能包含下列字符) // 0x0000 0x0003 colon (:) backslash (\) asterisk (*) question mark (?) forward slash (/) opening square bracket ([) closing square bracket (]) /*若是包含的話,會報錯。但有一個解決此問題的方法, 就是調用WorkbookUtil的createSafeSheetName(String nameProposal)方法來創建sheet name, 若是有如上特殊字符,它會自動用空字符來替換掉,自動過濾。*/ /*String safeName = WorkbookUtil.createSafeSheetName("[O'Brien's sales*?]"); // returns " O'Brien's sales "過濾掉上面出現的不合法字符 Sheet sheet3 = workbook.createSheet(safeName); //然后就創建成功了*/ /*表單創建完畢*/ //設置字體 Font headFont = wb.createFont(); headFont.setFontHeightInPoints((short)14); headFont.setFontName("Courier New"); headFont.setItalic(false); headFont.setStrikeout(false); //設置頭部單元格樣式 CellStyle headStyle = wb.createCellStyle(); headStyle.setBorderBottom(BorderStyle.THICK); //設置單元格線條 headStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); //設置單元格顏色 headStyle.setBorderLeft(BorderStyle.THICK); headStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); headStyle.setBorderRight(BorderStyle.THICK); headStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); headStyle.setBorderTop(BorderStyle.THICK); headStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); headStyle.setAlignment(HorizontalAlignment.CENTER); //設置水平對齊方式 headStyle.setVerticalAlignment(VerticalAlignment.CENTER); //設置垂直對齊方式 //headStyle.setShrinkToFit(true); //自動伸縮 headStyle.setFont(headFont); //設置字體 /*設置數據單元格格式*/ CellStyle dataStyle = wb.createCellStyle(); dataStyle.setBorderBottom(BorderStyle.THIN); //設置單元格線條 dataStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); //設置單元格顏色 dataStyle.setBorderLeft(BorderStyle.THIN); dataStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); dataStyle.setBorderRight(BorderStyle.THIN); dataStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); dataStyle.setBorderTop(BorderStyle.THIN); dataStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); dataStyle.setAlignment(HorizontalAlignment.LEFT); //設置水平對齊方式 dataStyle.setVerticalAlignment(VerticalAlignment.CENTER); //設置垂直對齊方式 //dataStyle.setShrinkToFit(true); //自動伸縮 /*創建行Rows及單元格Cells*/ Row headRow = sheet.createRow(0); //第一行為頭 for (int i=0;i<headList.size();i++){ //遍歷表頭數據 Cell cell = headRow.createCell(i); //創建單元格 cell.setCellValue(createHelper.createRichTextString(headList.get(i))); //設置值 cell.setCellStyle(headStyle); //設置樣式 } int rowIndex = 1; //當前行索引 //創建Rows for (List<String> rowdata : dataList){ //遍歷所有數據 Row row = sheet.createRow(rowIndex++); //第一行為頭 for (int j = 0;j< rowdata.size();j++){ //編譯每一行 Cell cell = row.createCell(j); cell.setCellStyle(dataStyle); cell.setCellValue(createHelper.createRichTextString(rowdata.get(j))); } } /*創建rows和cells完畢*/ /*設置列自動對齊*/ for (int i =0;i<headList.size();i++){ sheet.autoSizeColumn(i); } try (OutputStream fileOut = new FileOutputStream(path)) { //獲取文件流 wb.write(fileOut); //將workbook寫入文件流 } catch (FileNotFoundException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } return true; }
工具類其他方法
public static Workbook getWorkBook(String path) throws IOException, InvalidFormatException { File file = new File(path); //目標Excel文件 File parent = new File(file.getParent()); //Excel的父文件夾 if (!parent.exists()){ //判斷父文件夾是否存在 parent.mkdirs(); //建立父文件夾 } Workbook wb = null; if(file.exists()){ //如果文件存在 wb = WorkbookFactory.create(file); //打開文件 }else { //如果目標文件不存在 if (path.endsWith(".xls")) { /*操作Excel2003以前(包括2003)的版本,擴展名是.xls */ wb = new HSSFWorkbook(); } else if (path.endsWith(".xlsx")) { /*XSSFWorkbook:是操作Excel2007的版本,擴展名是.xlsx */ wb = new XSSFWorkbook(); } else { new Exception(path + "后綴名錯誤!"); } } /*獲取表單總數*/ int sheetCount = wb.getNumberOfSheets(); /*獲取某一表單總行數*/ Sheet sheet = wb.createSheet(); //Sheet sheet = wb.getSheetAt(0); System.out.println("表單數:"+sheetCount); System.out.println("第一行索引:"+sheet.getFirstRowNum()); System.out.println("最后一行索引"+sheet.getLastRowNum()); int rowIndex = sheet.getLastRowNum()+1; for (int i=0;i<=3;i++) { Row row = sheet.createRow(rowIndex++); for (int j = 0; j < 10; j++) { Cell cell = row.createCell(j); cell.setCellValue("格"+i + j); } } try (OutputStream fileOut = new FileOutputStream(file)) { //獲取文件流 fileOut.flush(); wb.write(fileOut); //將workbook寫入文件流 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return wb; } //創建一個不存在的excel文件 private static Workbook createNewWorkbookIfNotExist(String fileName) throws Exception { Workbook wb = null; if(fileName.endsWith(".xls")) { wb = new HSSFWorkbook(); } else if(fileName.endsWith(".xlsx")) { wb = new XSSFWorkbook(); } else { throw new Exception("文件類型錯誤!既不是.xls也不是.xlsx"); } try{ OutputStream output = new FileOutputStream(fileName); wb.write(output); }catch(FileNotFoundException e) { System.out.println("文件創建失敗,失敗原因為:" + e.getMessage()); throw new FileNotFoundException(); } System.out.println(fileName + "文件創建成功!"); return wb; } //創建一個新的或者已存在的Excel文檔的Workbook public static Workbook createWorkbook(String fileName) throws Exception { InputStream input = null; Workbook wb = null; try{ input = new FileInputStream(fileName); wb = WorkbookFactory.create(input); if (!new File(fileName).exists()){ //如果不存在 wb = createNewWorkbookIfNotExist(fileName); //創建新的 } } catch(OldExcelFormatException e) { System.out.println("文件打開失敗,原因:要打開的Excel文件版本過低!"); throw new OldExcelFormatException("文件版本過低"); } finally { if(input != null) { input.close(); } } return wb; } //創建sheet public static Sheet createSheet(Workbook wb , String sheetName) { Sheet sheet = wb.getSheet(sheetName); if(sheet == null) { System.out.println("表單" + sheetName + "不存在,試圖創建該sheet,請稍后……"); sheet = wb.createSheet(sheetName); System.out.println("名為" + sheetName +"的sheet創建成功!"); } return sheet; } //創建行row public static Row createRow(Sheet sheet , int rowNum) { Row row = sheet.getRow(rowNum); if(row == null) { System.out.println("行號為:" + rowNum + "的行不存在,正試圖創建該行,請稍后……"); row = sheet.createRow(rowNum); System.out.println("行號為:" + rowNum + "的行創建成功!"); } return row; } //創建單元格cell public static Cell createCell(Row row , int cellNum) { Cell cell = row.getCell(cellNum); if(cell == null) { System.out.println("該單元格不存在,正在試圖創建該單元格,請稍后……"); cell = row.createCell(cellNum); System.out.println("該單元格創建成功!"); } return cell; } /** * 追加到已有excel * @param dataList 數據 * @param name 文件名 */ public static void addExcel(List<LinkedHashMap<String,Object>> dataList, String name) throws IOException { FileInputStream fileInputStream=new FileInputStream("d://"+name+".xls"); //獲取d://test.xls,建立數據的輸入通道 POIFSFileSystem poifsFileSystem=new POIFSFileSystem(fileInputStream); //使用POI提供的方法得到excel的信息 HSSFWorkbook Workbook=new HSSFWorkbook(poifsFileSystem);//得到文檔對象 HSSFSheet sheet=Workbook.getSheet(name); //根據name獲取sheet表 HSSFCellStyle cellStyle = Workbook.createCellStyle(); /*cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下邊框 cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左邊框 cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框 cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中*/ // HSSFRow row=sheet.getRow(0); //獲取第一行 System.out.println("最后一行的行號 :"+sheet.getLastRowNum() + 1); //分別得到最后一行的行號,和第3條記錄的最后一個單元格 //System.out.println("最后一個單元格 :"+row.getLastCellNum()); //分別得到最后一行的行號,和第3條記錄的最后一個單元格 // HSSFRow startRow=sheet.createRow((short)(sheet.getLastRowNum()+1)); // 追加開始行 // -----------------追加數據------------------- int start = sheet.getLastRowNum() + 1; //插入數據開始行 for (int i = 0; i < dataList.size(); i++){ HSSFRow startRow = sheet.createRow(i+start); AtomicInteger j = new AtomicInteger(); LinkedHashMap<String ,Object> ltem = dataList.get(i); } // 輸出Excel文件 FileOutputStream out=new FileOutputStream("d://"+name+".xls"); //向d://test.xls中寫數據 out.flush(); Workbook.write(out); out.close(); } public static void readExcel(String name) throws IOException { FileInputStream fileInputStream=new FileInputStream("d:\\"+name+".xls"); //獲取d://test.xls,建立數據的輸入通道 POIFSFileSystem poifsFileSystem=new POIFSFileSystem(fileInputStream); //使用POI提供的方法得到excel的信息 HSSFWorkbook Workbook=new HSSFWorkbook(poifsFileSystem);//得到文檔對象 HSSFSheet sheet=Workbook.getSheet(name); //根據name獲取sheet表 HSSFRow row=sheet.getRow(1); //獲取第二行(第一行一般是標題) int lastRow = sheet.getLastRowNum(); // 返回的是值從0開始的 System.out.println("總行數:" + (lastRow + 1)); int lastCell = row.getLastCellNum(); // 返回的值是從1開始的..... System.out.println("總列數:" + lastCell); for (int i = 0; i <= lastRow; i++){ row=sheet.getRow(i); if (row != null){ for (int j = 0; j < lastCell; j++){ HSSFCell cell = row.getCell(j); if (cell != null) System.out.println(cell.getStringCellValue()); } } } }