码迷,mamicode.com
首页 > 其他好文 > 详细

poi 操作excel 常用操作

时间:2015-11-01 15:20:47      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

之前写过一篇类似的文章 这次重新写一下 添加了一些关于样式的代码

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;


版权声明:本文为博主原创文章,未经博主允许不得转载。

poi 操作excel 常用操作

标签:

原文地址:http://blog.csdn.net/u012116457/article/details/49532011

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!