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

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

时间: 2024-10-05 16:09:04

poi 操作excel 常用操作的相关文章

ubuntu命令行操作mysql常用操作

登陆mysql [email protected]:~/ruby/mydiary$ mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. 查看所有的数据库 mysql> show databases; --注意必须要用;结尾否则不会立即执行代码 +--------------------+ | Database | +--------------------+ | inf

java导入导出excel常用操作小结及简单示例

POI中常用设置EXCEL的操作小结: 操作excel如下 HSSFWorkbook wb = new HSSFWorkbook();  //创建一个webbook,对应一个Excel文件 HSSFSheet sheet = wb.createSheet();    //添加一个sheet,对应Excel文件中的sheet 构造方法可以有参也可以无参wb.createSheet("学生表一") HSSFRow row = sheet.createRow((int) 0);  //she

【转】.NET NPOI操作Excel常用函数

最近因项目接触了NPOI,感觉还是蛮不错的,网络上的教程普遍版本较老,本篇记录所常用操作,采用NPOI 2.0版本. 推荐: NPOI官方网站 NPOI 1.2.4/1.2.5 官方教程 新建Excel HSSFWorkbook hssfworkbook =newHSSFWorkbook(); ISheet sheet1 = hssfworkbook.CreateSheet("sheet1");//建立Sheet1 保存(导出)Excel FileStream file =newFil

POI对EXCEL的操作【重点:如何设置CELL格式为文本格式】

实际开发过程中通常用到的就是从数据库导出EXCEL表格了,JXL可以这样做,其实POI也可以(关于JXL与POI的异同可访问我之前总结的文章),之前写过POI对七种文档(当然也包括EXCEL)的内容读取操作的文章,这次要写的就非常重要了,就是开发中经常会用到的POI读取数据库导出EXCEL的操作,所谓导出EXCEL也就是生成带数据内容的新的EXCEL文件 目前的POI版本是3.7 下载地址:http://poi.apache.org/download.html#POI-3.7 必须包只有一个:p

33. Python redis的 hash类型操作 其他常用操作

1.hash 类型操作 import redis pool = redis.ConnectionPool(host="192.168.48.131", port=6379, db=0) r = redis.Redis(connection_pool=pool) #hash类型操作:是一个name对应一个字典 #语法 hset(name, key, value) #name 对应的hash中设置一个键值对(不存在,则创建键值对:否则,修改键值对) # 语法参数解释: name: redi

poi excel 常用操作 [冻结、合并、链接]

基本 Workbook wb= new HSSFWorkbook(); Sheet sheet = wb.createSheet("sheetName"); Row row = sheet.createRow(0); //第一行 Cell cell = row.createCell(0);//第一个单元格 cell.setCellValue("企业名称");//单元格赋值 cell.setCellStyle(cellStyle);//设置样式 FileOutputS

python openpyxl 2.5.4 版本 excel常用操作封装

最近搭框架用的openpyxl 2.5.4版本,之前封装的函数有些提示不推荐使用了,我做了一些更新: 代码: # encoding=utf-8 from openpyxl import load_workbookfrom openpyxl.styles import Border, Side, Fontimport time class parseExcel(object):    def __init__(self, excelPath):        self.excelPath = ex

Excel常用操作,求和等

今天用Excel写了一个加班统计表格,在统计加班时长时,竟然不会使用Excel自动求和,看来拳不离手曲不离口,一个工具一段时间不用,就可能生疏.现在记录在这里,做个备忘. 求和很简单,使用"=SUM(D2:D18)"类似的函数即可,见图:

使用POI对excel进行操作生成二维数组

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.poi.hssf.usermodel.HSSF