Excel之POI

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


}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值