poi 操作excel 常用操作

jopen 9年前發布 | 5K 次閱讀 Java POI

之前寫過一篇類似的文章 這次重新寫一下 添加了一些關于樣式的代碼

    package excel;  

    import java.io.File;  
    import java.io.FileInputStream;  
    import java.io.FileNotFoundException;  
    import java.io.FileOutputStream;  
    import java.io.IOException;  
    import java.lang.reflect.Method;  
    import java.util.List;  

    import org.apache.poi.hssf.usermodel.HSSFFont;  
    import org.apache.poi.hssf.usermodel.HSSFPalette;  
    import org.apache.poi.hssf.usermodel.HSSFRow;  
    import org.apache.poi.hssf.usermodel.HSSFSheet;  
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
    import org.apache.poi.hssf.util.CellRangeAddress;  
    import org.apache.poi.ss.usermodel.Cell;  
    import org.apache.poi.ss.usermodel.CellStyle;  
    import org.apache.poi.ss.usermodel.Row;  
    import org.apache.poi.ss.usermodel.Sheet;  

    /** 
     * 從excel讀取數據/往excel中寫入 excel有表頭,表頭每列的內容對應實體類的屬性 
     *  
     * @author nagsh 
     *  
     */  
    public class ExcelManage {  
        private HSSFWorkbook workbook = null;  

        /** 
         * 判斷文件是否存在. 
         * @param fileDir  文件路徑 
         * @return 
         */  
        public boolean fileExist(String fileDir){  
             boolean flag = false;  
             File file = new File(fileDir);  
             flag = file.exists();  
             return flag;  
        }  
        /** 
         * 判斷文件的sheet是否存在. 
         * @param fileDir   文件路徑 
         * @param sheetName  表格索引名 
         * @return 
         */  
        public boolean sheetExist(String fileDir,String sheetName){  
             boolean flag = false;  
             File file = new File(fileDir);  
             if(file.exists()){    //文件存在  
                //創建workbook  
                 try {  
                    workbook = new HSSFWorkbook(new FileInputStream(file));  
                    //添加Worksheet(不添加sheet時生成的xls文件打開時會報錯)  
                    HSSFSheet sheet = workbook.getSheet(sheetName);    
                    if(sheet!=null)  
                        flag = true;  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }   

             }else{    //文件不存在  
                 flag = false;  
             }  

             return flag;  
        }  
        /** 
         * 創建新excel. 
         * @param fileDir  excel的路徑 
         * @param sheetName 要創建的表格索引 
         * @param titleRow excel的第一行即表格頭 
         */  
        public void createExcel(String fileDir,String sheetName,String titleRow[]){  
            //創建workbook  
            workbook = new HSSFWorkbook();  
            //添加Worksheet(不添加sheet時生成的xls文件打開時會報錯)  
            Sheet sheet1 = workbook.createSheet(sheetName);    
            //新建文件  
            FileOutputStream out = null;  
            try {  
                //添加表頭  
                Row row = workbook.getSheet(sheetName).createRow(0);    //創建第一行    
                for(int i = 0;i < titleRow.length;i++){  
                    Cell cell = row.createCell(i);  
                    cell.setCellValue(titleRow[i]);  
                }  

                out = new FileOutputStream(fileDir);  
                workbook.write(out);  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {    
                try {    
                    out.close();    
                } catch (IOException e) {    
                    e.printStackTrace();  
                }    
            }    


        }  
        /** 
         * 刪除文件. 
         * @param fileDir  文件路徑 
         */  
        public boolean deleteExcel(String fileDir){  
            boolean flag = false;  
            File file = new File(fileDir);  
            // 判斷目錄或文件是否存在    
            if (!file.exists()) {  // 不存在返回 false    
                return flag;    
            } else {    
                // 判斷是否為文件    
                if (file.isFile()) {  // 為文件時調用刪除文件方法    
                    file.delete();  
                    flag = true;  
                }   
            }  
            return flag;  
        }  

        /** 
         * 合并單元格 
         * @param workbook 
         * @param fileDir 
         * @param sheetName 
         * @param rowStart    合并單元格開始行行號 從1開始數 
         *  @param rowEnd     合并單元格結束行行號 從1開始數 
         * @param ColumnStart  合并單元格開始列列號  從1數 
         * @param ColumnEnd   合并單元格結束列列號  從1數 
         */  
        public void mergedCell(HSSFWorkbook workbook,String fileDir,String sheetName,int rowStart,int rowEnd,int ColumnStart,int ColumnEnd){  

            try {  
                FileOutputStream out = null;  
                HSSFSheet sheet = workbook.getSheet(sheetName);  
                sheet.addMergedRegion(new CellRangeAddress((short)rowStart-1,(short)rowEnd-1,(short)ColumnStart-1,(short)ColumnEnd-1));  
                out = new FileOutputStream(fileDir);  
                workbook.write(out);  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            }catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        /** 
         * 刪除行【徹底刪除】 
         * @param workbook 
         * @param fileDir 
         * @param sheetName 
         * @param rowNum  行號 
         */  
        public void removeRow(HSSFWorkbook workbook,String fileDir,String sheetName,int rowNum){  
            try {  
                //流  
                FileOutputStream out = null;  
                HSSFSheet sheet = workbook.getSheet(sheetName);  
                int rowCount = sheet.getLastRowNum();  
                sheet.shiftRows(rowNum, rowCount, -1); //上移  
                out = new FileOutputStream(fileDir);  
                workbook.write(out);  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            }catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        /** 
         * 刪除行【刪除數據】 
         * @param workbook 
         * @param fileDir 
         * @param sheetName 
         * @param rowNum  行號 
         */  
        public void removeRowData(HSSFWorkbook workbook,String fileDir,String sheetName,int rowNum){  
            try {  
                //流  
                FileOutputStream out = null;  
                HSSFSheet sheet = workbook.getSheet(sheetName);  
                Row row = sheet.getRow(rowNum-1);  
                sheet.removeRow(row);  
                out = new FileOutputStream(fileDir);  
                workbook.write(out);  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            }catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        /** 
         * 往excel中寫入 
         * @param fileDir    文件路徑 
         * @param sheetName  表格索引 
         * @param object 
         */  
        public void writeToExcel(String fileDir,String sheetName, Object object){  
            //創建workbook  
            File file = new File(fileDir);  
            try {  
                workbook = new HSSFWorkbook(new FileInputStream(file));  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            //流  
            FileOutputStream out = null;  
            HSSFSheet sheet = workbook.getSheet(sheetName);  
            // 獲取表格的總行數  
            int rowCount = sheet.getLastRowNum() + 1; // 需要加一  
            // 獲取表頭的列數  
            int columnCount = sheet.getRow(0).getLastCellNum();  
            try {  
                Row row = sheet.createRow(rowCount);     //最新要添加的一行  
                //通過反射獲得object的字段,對應表頭插入  
                // 獲取該對象的class對象  
                Class class_ = object.getClass();  
                // 獲得表頭行對象  
                HSSFRow titleRow = sheet.getRow(0);  
                if(titleRow!=null){  
                    for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) {  //遍歷表頭  
                        String title = titleRow.getCell(columnIndex).toString().trim().toString().trim();  
                        String UTitle = Character.toUpperCase(title.charAt(0))+ title.substring(1, title.length()); // 使其首字母大寫;  
                        String methodName  = "get"+UTitle;  
                        Method method = class_.getDeclaredMethod(methodName); // 設置要執行的方法  
                        String data = method.invoke(object).toString(); // 執行該get方法,即要插入的數據  
                        Cell cell = row.createCell(columnIndex);  
                        cell.setCellValue(data);  
                    }  
                }  

                out = new FileOutputStream(fileDir);  
                workbook.write(out);  
            } catch (Exception e) {  
                e.printStackTrace();  
            } finally {    
                try {    
                    out.close();    
                } catch (IOException e) {    
                    e.printStackTrace();  
                }    
            }    
        }  

        /** 
         * 向某一行添加數據 
         * @param workbook  使用該參數是為了在傳遞樣式是保證workbook一致 
         * @param fileDir  文件路徑 
         * @param sheetName  索引 
         * @param rowNumber  要添加到哪行 
         * @param datas  添加的數據 【column,data】列號-數據 
         * @param style 樣式 
         */  
        public void writeOneRow(HSSFWorkbook workbook,String fileDir,String sheetName,int rowNumber,List<PoiCell> datas){  
            try {  
                //流  
                FileOutputStream out = null;  
                HSSFSheet sheet = workbook.getSheet(sheetName);  
                sheet.autoSizeColumn(1,true);  //設置自適應寬度  
                //最新要添加的一行  
                Row row =  sheet.getRow(rowNumber-1);  
                if(row==null){  
                    row = sheet.createRow(rowNumber-1);                   
                }  
                //寫入數據  
                for(PoiCell data:datas){  
                    Cell cell = row.createCell(data.getColumn()-1);  
                    //設置樣式  
                    cell.setCellStyle(data.getStyle());  
                    //設置數據  
                    cell.setCellValue(data.getData());    
                }  
                out = new FileOutputStream(fileDir);  
                workbook.write(out);  
            } catch (FileNotFoundException e) {  
                e.printStackTrace();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  

        }  
        /** 
         * 將16進制的顏色代碼寫入樣式中來設置顏色 
         * @param style  保證style統一 
         * @param color 顏色:66FFDD 
         * @param index 索引 1-48 使用時不可重復 
         * @return 
         */  
        public CellStyle getColorStyle(CellStyle style,String color,short index){  
            if(color!=""&&color!=null){  
                //轉為RGB碼  
                int r = Integer.parseInt((color.substring(0,2)),16);   //轉為16進制  
                int g = Integer.parseInt((color.substring(2,4)),16);  
                int b = Integer.parseInt((color.substring(4,6)),16);  
                //自定義cell顏色  
                HSSFPalette palette = workbook.getCustomPalette();   
                palette.setColorAtIndex((short)index, (byte) r, (byte) g, (byte) b);  

                style.setFillPattern(CellStyle.SOLID_FOREGROUND);   
                style.setFillForegroundColor(index);  
            }  
            return style;     
        }  
        /** 
         * 設置邊框 
         * @param style 
         * @return 
         */  
        public CellStyle setBorder(CellStyle style){  
             style.setBorderBottom(CellStyle.BORDER_THIN); //下邊框      
             style.setBorderLeft(CellStyle.BORDER_THIN);//左邊框      
             style.setBorderTop(CellStyle.BORDER_THIN);//上邊框      
             style.setBorderRight(CellStyle.BORDER_THIN);//右邊框     
             return style;    
        }  
        /** 
         * 設置字體 
         * @param style 
         * @return 
         */  
        public CellStyle setFont(CellStyle style){  
            HSSFFont font = workbook.createFont();    
            font.setFontHeightInPoints((short) 12);      
            font.setFontName("仿宋");   
            font.setBold(true);  
            style.setFont(font);  
            return style;  
        }  



    }  

在附上一個設置自動篩選的代碼:

CellRangeAddress c = (CellRangeAddress) CellRangeAddress.valueOf(“A2:L2”);
sheet.setAutoFilter(c);

這個不止使用了HSSF的包 還使用了這個

import org.apache.poi.ss.util.CellRangeAddress;

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!