POI生成Excel


引入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());
                }
            }

        }
    }

代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM