程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poi 操作excel 常用操作

poi 操作excel 常用操作

編輯:C++入門知識

poi 操作excel 常用操作


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

 

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 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;

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved