`
xiaoxin5230
  • 浏览: 88731 次
  • 性别: 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) ,然后导入时报错~  是包的问题 还是?

相关推荐

    Java操作Excel之Poi视频教程 java1234出品

    本教程“Java操作Excel之Poi视频教程”由java1234出品,旨在深入讲解如何使用Java POI进行Excel处理。 1. **什么是Apache POI?** Apache POI 是一个开源项目,它提供了API,使得Java程序能够处理Microsoft Office...

    Java操作Excel之Poi模板导入导出

    在"Java操作Excel之Poi模板导入导出"这个主题中,我们将深入探讨如何使用POI库来处理Excel模板,并进行数据的导入和导出。 首先,了解Excel模板的基本概念。模板通常包含预定义的样式、格式和计算,开发人员可以...

    Java操作Excel之Poi视频源码

    通过上述的Java操作Excel之Poi视频教程源码,我们可以逐步学习和实践这些概念,从基础到高级,从而熟练掌握Java中使用Apache POI处理Excel文件的技巧。每个视频源码对应一个特定的主题,例如第一讲可能是介绍基础...

    poi excel poi excel poi excel

    ### POI Excel知识点详解 #### 一、Jakarta POI简介与Apache POI的作用 Jakarta POI 是 Apache POI 的早期项目名称,它提供了一组 API 来处理 Microsoft Office 文件格式,特别是针对 Excel(`.xls` 和 `.xlsx`)...

    poi读写excel+poi总结

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel、Word和PowerPoint等。在本文中,我们将深入探讨如何使用POI进行Excel的读写操作,并进行总结。 1. POI基本概念 Apache POI 提供了...

    读取Excel的poi包

    读取Excel的poi包,,读取Excel的poi包,,读取Excel的poi包,读取Excel的poi包读

    java excel操作 poi-3.17 可用于jdk1.70

    附件是java poi 3.17的lib库及其依赖库,全部下载引用后,可以进行excel的读写操作,无需引用其他lib库。poi-3.17适用于jdk1.7。 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft ...

    POI生成Excel POI操作Excel POI读取Excel POI类库

    Apache POI是一个强大的Java库,专门用于处理Microsoft Office格式的文件,尤其是Excel。在这个场景中,我们关注的是如何使用POI来创建、读取和操作Excel文档。在Web项目中,这种功能通常用于数据导入导出,报表生成...

    java导出excel及POI3.10jar包

    Apache POI是一个流行的开源库,允许Java程序读取和写入Microsoft Office格式的文件,包括Excel(.xls和.xlsx)。在本场景中,提到的是POI 3.10版本,这是一个稳定且广泛使用的版本。 **Apache POI简介** Apache ...

    POI导出Excel文件

    Apache POI是一个流行的Java库,用于读取和写入Microsoft Office格式的文件,尤其是Excel(.xlsx和.xls)文件。这个实例提供了两种方法来导出Excel文件:通过Servlet和通过main方法。这两种方法都是在Java环境中操作...

    poi读写excel

    poi读写excelpoi读写excelpoi读写excelpoi读写excelpoi读写excelpoi读写excelpoi读写excelpoi读写excelpoi读写excel

    java读写Excel,POI.JAR,Word内容读取

    java读写Excel,POI.JAR,Word内容读取

    java_poi实现excel导入导出

    Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...

    读写Excel2007 POI3.8

    标题“读写Excel2007 POI3.8”涉及的是使用Apache POI库的3.8版本处理Microsoft Excel 2007文件的方法。Apache POI是Java的一个开源项目,专门用于读取、创建和修改Microsoft Office格式的文件,特别是Excel文件。在...

    poi log4j excel poi log4j excel poi log4j excel

    poi log4j excel poi log4j excel poi log4j excel poi log4j excel poi log4j excel poi log4j excel poi log4j excel

    Excel POI 工具类

    在Java开发中,Apache POI 是一个非常流行的库,它允许程序员创建、修改和显示Microsoft Office格式的文件,特别是Excel工作簿(.xlsx 和 .xls 文件)。本篇将深入探讨"Excel POI 工具类",这个工具类旨在简化日常的...

    Apache poi 操作 excel 文件压缩包

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,包括Excel。在Java环境中,Apache POI 提供了一套API,使得开发者能够创建、修改和读取Excel文件。这个压缩包包含了Apache POI库的多个版本...

    poi导出根据模板导出excel和简单列表导出excel源码

    Apache POI 是一个开源项目,专门用于处理 Microsoft Office 格式的文件,如 Word、Excel 和 PowerPoint。在本案例中,我们关注的是如何使用 Apache POI 库来导出 Excel 文件,特别是根据模板导出和简单列表导出。...

    excel poi3.6

    excel poi3.6 excel poi3.6 excel poi3.6

    java导出excel POI jar包

    Apache POI库是Java领域中广泛使用的工具,它允许开发者读写Microsoft Office格式的文件,包括Excel(.xlsx和.xls)。本篇文章将深入讲解如何使用POI库在Java中实现Excel的导出功能,以及涉及到的相关jar包及其作用...

Global site tag (gtag.js) - Google Analytics