`
xiaoxin5230
  • 浏览: 87625 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Excel之POI

    博客分类:
  • j2ee
阅读更多
java操作Excel最常用的开源组件有poi与jxl。jxl是韩国人开发的,发行较早,但是更新的很慢,目前似乎还不支持excel2007。poi是apache下的一个子项目,poi应该是处理ms的office系列文档最好的组件了。poi3.7版本已经开始支持excel2007了。但是由于excel2007底层的实现似乎变成xml与excel2003底层存储发生了本质的变化,因此poi解析excel的类就存在差异了。
      现在简单的介绍下poi常用的接口。
      经常用的类一般都在org.apache.poi.hssf.usermodel(excel2003)或org.apache.poi.xssf.usermodel
(excel2007)。
工作薄:  WorkBook是操作Excel的入口,HSSFWorkbook, XSSFWorkbook实现了该接口。
页:Sheet表示工作薄的分页。HSSFSheet, XSSFChartSheet, XSSFDialogsheet, XSSFSheet实现了该接口。
Row:表示页中的一行。HSSFRow, XSSFRow实现了该接口。
Cell:行中的一个单元格。HSSFCell, XSSFCell实现了该接口

下面是个人写的一个通用类 使用的是POI3.7

package com.xyj.com.tool.util;

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 java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.io.IOUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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.HSSFColor;
import org.apache.poi.ss.extractor.ExcelExtractor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Footer;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.util.CellReference;
import org.apache.poi.xssf.extractor.XSSFExcelExtractor;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * @className:POIExcelUtil.java
 * @classDescription:POI操作类
 * @author:xiayingjie
 * @createTime:2010-10-29
 */

public class POIExcelUtil {

	// ------------------------写Excel-----------------------------------
	/**
	 * 创建workBook对象 xlsx(2007以上版本)
	 * 
	 * @return
	 */
	public static Workbook createWorkbook() {
		return createWorkbook(true);
	}

	/**
	 * 创建WorkBook对象
	 * 
	 * @param flag
	 *            true:xlsx(1997-2007) false:xls(2007以上)
	 * @return
	 */
	public static Workbook createWorkbook(boolean flag) {
		Workbook wb;
		if (flag) {
			wb = new XSSFWorkbook();
		} else {
			wb = new HSSFWorkbook();
		}
		return wb;
	}

	/**
	 * 添加图片
	 * 
	 * @param wb
	 *            workBook对象
	 * @param sheet
	 *            sheet对象
	 * @param picFileName
	 *            图片文件名称(全路径)
	 * @param picType
	 *            图片类型
	 * @param row
	 *            图片所在的行
	 * @param col
	 *            图片所在的列
	 */
	public static void addPicture(Workbook wb, Sheet sheet, String picFileName,
			int picType, int row, int col) {
		InputStream is = null;
		try {
			// 读取图片
			is = new FileInputStream(picFileName);
			byte[] bytes = IOUtils.toByteArray(is);
			int pictureIdx = wb.addPicture(bytes, picType);
			is.close();
			// 写图片
			CreationHelper helper = wb.getCreationHelper();
			Drawing drawing = sheet.createDrawingPatriarch();
			ClientAnchor anchor = helper.createClientAnchor();
			// 设置图片的位置
			anchor.setCol1(col);
			anchor.setRow1(row);
			Picture pict = drawing.createPicture(anchor, pictureIdx);

			pict.resize();
		} catch (Exception e) {
			try {
				if (is != null) {
					is.close();
				}
			} catch (IOException e1) {
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
	}

	/**
	 * 创建Cell 默认为水平和垂直方式都是居中
	 * 
	 * @param style
	 *            CellStyle对象
	 * @param row
	 *            Row对象
	 * @param column
	 *            单元格所在的列
	 * @return
	 */
	public static Cell createCell(CellStyle style, Row row, short column) {
		return createCell(style, row,  column,
				XSSFCellStyle.ALIGN_CENTER, XSSFCellStyle.ALIGN_CENTER);
	}

	/**
	 * 创建Cell并设置水平和垂直方式
	 * 
	 * @param style
	 *            CellStyle对象
	 * @param row
	 *            Row对象
	 * @param column
	 *            单元格所在的列
	 * @param halign
	 *            水平对齐方式:XSSFCellStyle.VERTICAL_CENTER.
	 * @param valign
	 *            垂直对齐方式:XSSFCellStyle.ALIGN_LEFT
	 */
	public static Cell createCell(CellStyle style, Row row, 
			short column, short halign, short valign) {
		Cell cell = row.createCell(column);
		setAlign(style,halign,valign);
		cell.setCellStyle(style);
		return cell;
	}
	
	/**
	 * 合并单元格
	 * @param sheet
	 * @param firstRow 开始行
	 * @param lastRow 最后行
	 * @param firstCol 开始列
	 * @param lastCol 最后列
	 */
	public static void mergeCell(Sheet sheet,int firstRow,int lastRow,int firstCol,int lastCol){
		 sheet.addMergedRegion(new CellRangeAddress(firstRow,lastRow,firstCol,lastCol));
	}
	
	//---------------------------------设置样式-----------------------
	
	/**
	 * 设置单元格对齐方式
	 * @param style
	 * @param halign
	 * @param valign
	 * @return
	 */
	public static CellStyle setAlign(CellStyle style,short halign, short valign) {
		style.setAlignment(halign);
		style.setVerticalAlignment(valign);
		return style;
	}
	
	/**
	 * 设置单元格边框(四个方向的颜色一样)
	 * @param style style对象
	 * @param borderStyle 边框类型 :dished-虚线 thick-加粗 double-双重 dotted-有点的 CellStyle.BORDER_THICK
	 * @param borderColor 颜色 IndexedColors.GREEN.getIndex()
	 * @return
	 */
	public static CellStyle setBorder(CellStyle style,short borderStyle,short borderColor){
		
		//设置底部格式(样式+颜色)
	    style.setBorderBottom(borderStyle);
	    style.setBottomBorderColor(borderColor);
	    //设置左边格式
	    style.setBorderLeft(borderStyle);
	    style.setLeftBorderColor(borderColor);
	    //设置右边格式
	    style.setBorderRight(borderStyle);
	    style.setRightBorderColor(borderColor);
	    //设置顶部格式
	    style.setBorderTop(borderStyle);
	    style.setTopBorderColor(borderColor);
	    
	    return style;
	}
	
	
	/**
	 * 自定义颜色(xssf)
	 * @param style  xssfStyle
	 * @param red RGB red (0-255)
	 * @param green RGB green (0-255)
	 * @param blue RGB blue (0-255)
	 */
	public static CellStyle setBackColorByCustom(XSSFCellStyle style,int red ,int green,int blue){	   	 
		    //设置前端颜色
		    style.setFillForegroundColor(new XSSFColor(new java.awt.Color(red, green, blue)));
		    //设置填充模式
		    style.setFillPattern(CellStyle.SOLID_FOREGROUND);
		    
		    return style;
	}
	/**
	 * 设置前景颜色
	 * @param style style对象
	 * @param color :IndexedColors.YELLOW.getIndex()
	 * @return
	 */
	public static CellStyle setBackColor(CellStyle style,short color){

	   //设置前端颜色
	    style.setFillForegroundColor(color);
	    //设置填充模式
	    style.setFillPattern(CellStyle.SOLID_FOREGROUND);

	    return style;
	}
	
	
	
	/**
	 * 设置背景颜色
	 * @param style style对象
	 * @param color :IndexedColors.YELLOW.getIndex()
	 * @param fillPattern :CellStyle.SPARSE_DOTS
	 * @return
	 */
	public static CellStyle setBackColor(CellStyle style,short backColor,short fillPattern){

		//设置背景颜色
	    style.setFillBackgroundColor(backColor);
	   
	    //设置填充模式
	    style.setFillPattern(fillPattern);
	    
	    return style;
	}
	
	/**
	 * 
	 * 设置字体(简单的需求实现,如果复杂的字体,需要自己去实现)尽量重用
	 * @param style style对象
	 * @param fontSize 字体大小 shot(24)
	 * @param color 字体颜色  IndexedColors.YELLOW.getIndex()
	 * @param fontName 字体名称 "Courier New"
	 * @param 
	 */
	public static CellStyle setFont(Font font, CellStyle style,short fontSize,short color,String fontName){
		    font.setFontHeightInPoints(color);
		    font.setFontName(fontName);
		    
		    //font.setItalic(true);// 斜体
		    //font.setStrikeout(true);//加干扰线
		    
		    font.setColor(color);//设置颜色
		    // Fonts are set into a style so create a new one to use.
		    style.setFont(font);
		    		    
		    return style;

	}


	/**
	 * 
	 * @param createHelper
	 *            createHelper对象
	 * @param style
	 *            CellStyle对象
	 * @param formartData
	 *            date:"m/d/yy h:mm"; int:"#,###.0000" ,"0.0"
	 */
	public static CellStyle setDataFormat(CreationHelper createHelper, CellStyle style, String formartData) {
		
		style.setDataFormat(createHelper.createDataFormat().getFormat(
				formartData));
	
		return style;
	}

	/**
	 * 将Workbook写入文件
	 * 
	 * @param wb
	 *            workbook对象
	 * @param fileName
	 *            文件的全路径
	 * @return
	 */
	public static boolean createExcel(Workbook wb, String fileName) {
		boolean flag = true;
		FileOutputStream fileOut = null;
		try {
			fileOut = new FileOutputStream(fileName);
			wb.write(fileOut);
			fileOut.close();

		} catch (Exception e) {
			flag = false;
			if (fileOut != null) {
				try {
					fileOut.close();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
			e.printStackTrace();
		}
		return flag;
	}
	

	//--------------------读取Excel-----------------------
	/**
	 * 读取Excel
	 * @param filePathName
	 * @return
	 */
	public  static Workbook readExcel(String filePathName){
		InputStream inp = null;
		Workbook wb=null;
		 try {
			inp = new FileInputStream(filePathName);
			wb = WorkbookFactory.create(inp);
		    inp.close();
		   
		} catch (Exception e) {
			try {
				if(null!=inp){
					inp.close();
				}
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
		 return wb;
	}
	

	
	/**
	 * 读取Cell的值
	 * @param sheet
	 * @return
	 */
	public static Map readCell(Sheet sheet){
		Map map=new HashMap();
		//遍历所有行
		 for (Row row : sheet) {   
			    //便利所有列
	            for (Cell cell : row) { 
	            	//获取单元格的类型
	                CellReference cellRef = new CellReference(row.getRowNum(), cell   
	                        .getColumnIndex());   
	             //   System.out.print(cellRef.formatAsString());   
	                String key=cellRef.formatAsString();
	             //   System.out.print(" - ");   
	  
	                switch (cell.getCellType()) {  
	                //字符串
	                case Cell.CELL_TYPE_STRING:   
	                	 map.put(key, cell.getRichStringCellValue()   
	       	                          .getString());	
	                  //  System.out.println(cell.getRichStringCellValue()   
		                  //         .getString());   
	                    break;
	                //数字
	                case Cell.CELL_TYPE_NUMERIC:   
	                    if (DateUtil.isCellDateFormatted(cell)) {   
	                      //  System.out.println(cell.getDateCellValue()); 
	                        map.put(key, cell.getDateCellValue());
	                    } else {   
	                      //  System.out.println(cell.getNumericCellValue());  
	                        map.put(key, cell.getNumericCellValue());
	                    }   
	                    break;   
	                //boolean
	                case Cell.CELL_TYPE_BOOLEAN:   
	                   // System.out.println(cell.getBooleanCellValue());   
	                    map.put(key, cell.getBooleanCellValue());
	                    break;  
	                //方程式
	                case Cell.CELL_TYPE_FORMULA:   
	                  // System.out.println(cell.getCellFormula());
	                    map.put(key, cell.getCellFormula());
	                    break;   
	                //空值
	                default:   
	                    System.out.println();  
	                    map.put(key,"");
	                }  
	               
	            } 
		 }
		 return map;
		
	}
	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		
//		在需要换行的地方加上\n   cell.setCellValue("Use \n with word wrap on to create a new line");
//		设置行高 row.setHeightInPoints((2*sheet.getDefaultRowHeightInPoints()));
//		设置列只适应宽度 sheet.autoSizeColumn((short)2);
		
//		
//		// -------------插入---------------------
//		Workbook wb = POIUtil.createWorkbook();
//		//创建Sheet
//		Sheet s = wb.createSheet();
//		s.autoSizeColumn(1);
//		s.autoSizeColumn(0);
//		s.autoSizeColumn(2);
//		//创建样式(真实项目中-所有样式都写在这里)
//		CellStyle style1=wb.createCellStyle();
//		CellStyle style2=wb.createCellStyle();
//		CellStyle style3=wb.createCellStyle();
//		//字体
//		//设置字体
//		Font font=wb.createFont();
//		CellStyle fontStyle =setFont(font,style3,(short)30,IndexedColors.RED.getIndex() , "Courier New");
//		//合并单元格
//		//mergeCell(s,2,2,1,2);
//		//创建行
//		Row row1 = s.createRow(0);
//		row1.setHeightInPoints((2*s.getDefaultRowHeightInPoints()));
//		//-----------数字-----------
//		Cell c1=createCell(style1, row1, (short) 0);
//		c1.setCellValue(3.138);
//		//设置边框
//		setBorder(style1,CellStyle.BORDER_THIN,IndexedColors.GREEN.getIndex());
//	
//	
//		//-------------日期----------------
//		Cell c2=createCell(style2, row1, (short) 1);
//		c2.setCellValue(Calendar.getInstance());
//		CreationHelper ch=wb.getCreationHelper();
//		setDataFormat(ch,style2,"m/d/yy h:mm");
//		setBackColor(style2,IndexedColors.YELLOW.getIndex());
//
//		
//		
//		Cell c4=createCell(style2, row1, (short) 2);
//		
//		//----------------字符串------------------
//		
//		//Cell c3=createCell(style3, row1, (short) 2);
//		Cell c3=row1.createCell((short) 3);
//		c3.setCellValue("我和你dfgd、\nfged二个如果");
//		CellStyle cs=wb.createCellStyle();
//		
//		setBackColor(style3,IndexedColors.ORANGE.getIndex());	
//	
//		
//		c3.setCellStyle(style3);
		//c3.setCellStyle(cs);
		//写入图片
		// POIUtil.addPicture(wb, s,"F://aa.gif", Workbook.PICTURE_TYPE_JPEG,5,6);

//		 Footer footer = s.getFooter();   //页脚
//		  
//		footer.setRight( "Page " + footer.getLeft() + " of " + footer.getRight()); 
		 
// 		s.shiftRows(5, 10,-5); //把第6-11行向上移动5行   
//		s.setSelected(true);  //选中sheet
//		
		 //打印
//		PrintSetup ps = s.getPrintSetup();   
//		  
//	    sheet.setAutobreaks(true);   
//	  
//	    ps.setFitHeight((short)1);   
//	    ps.setFitWidth((short)1); 
		
//		POIUtil.createExcel(wb, "F://text.xlsx");
		
		//=====================读================
		Workbook wb=readExcel("F://text.xlsx");
		Map<String,Object> map=readCell(wb.getSheetAt(0));
	    for(String key:map.keySet()){
	    	System.out.println(key+"-"+map.get(key));
	    }
		

	}

}
分享到:
评论
1 楼 shenwei83 2012-06-10  
wb = new HSSFWorkbook();    还是要强转 (Workbook) ,然后导入时报错~  是包的问题 还是?

相关推荐

Global site tag (gtag.js) - Google Analytics