经常会碰到把数据存到excel的需求,虽然使用POI写起来确实不算复杂,但每次都写近乎一样的代码有点烦躁,下面是我经常用到的代码,满足一般的要求,高级的excel操作没有用到,不过应该已经满足了大部分的要求。
需引入的jar包如下,
poi-2.5.1-final-20040804.jar
poi-contrib-2.5.1-final-20040804.jar
poi-scratchpad-2.5.1-final-20040804.jar
1. Excel类,代表一个Excel对象,里面可以包含很多sheet, 已经相关必要方法,
package stony.zhang.excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class Excel {
private boolean override;
private String file;
HSSFWorkbook wb = new HSSFWorkbook();
List<ExcelSheet> sheets = new ArrayList<ExcelSheet>();
private HSSFCellStyle titleStyle;
/**
* file, the file with the full path, If can't find,then new one.
*
* @param file
*/
public Excel(String file) {
this(file, false);
}
public Excel(String file, boolean override) {
this.file = file;
this.override = override;
File f=new File(file);
if (override) {
// delete the exsited one
}
try {
if(f.exists()){
wb= new HSSFWorkbook(new FileInputStream(file));
}else{
wb= new HSSFWorkbook();
}
titleStyle = wb.createCellStyle();
HSSFFont titleFont = wb.createFont();
// titleFont.setColor(HSSFFont.COLOR_RED);
titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
titleStyle.setFont(titleFont);
// create the Excel file.
int num=wb.getNumberOfSheets();
for (int i = 0; i < num; i++) {
HSSFSheet sheet = wb.getSheetAt(i);
String name=wb.getSheetName(i);
sheets.add(new ExcelSheet(name,sheet,titleStyle));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* @author Stony Zhang
* @date Feb 23, 2009
* @param sheetName
* If can't find the sheet, new one.
* @return
*/
public ExcelSheet getSheet(String sheetName) {
for (ExcelSheet esh : this.sheets) {
if (esh.getName().equalsIgnoreCase(sheetName)) {
return esh;
}
}
HSSFSheet sheet = wb.createSheet(sheetName);
return new ExcelSheet(sheetName, sheet,titleStyle);
}
public void save() {
try {
FileOutputStream fileOut = new FileOutputStream(file);
wb.write(fileOut);
fileOut.close();
} catch (Exception e) {
// TODO: handle exception
}
}
public static void main(String[] argv){
Excel ex=new Excel("E:/test.xls");
ExcelSheet esh=ex.getSheet("log");
esh.setHeader(new String[]{"User","Table Name","Database","Action Type","Opration Time"});
esh.addRecord(new String[]{"aa","bb","cc","dd","ee"});
ex.save();
}
}
2.ExcelSheet类,代表一个具体sheet.
package stony.zhang.excel;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
/**
* @author Stony Zhang
* @date Feb 23, 2009
* @return
*/
public class ExcelSheet {
private HSSFSheet sheet;
private String name;
private String[] header;
private HSSFCellStyle titleStyle;
public ExcelSheet(String sheetName, HSSFSheet sh) {
this.name = sheetName;
this.sheet = sh;
sheet.setDisplayGridlines(true);
}
public ExcelSheet(String sheetName, HSSFSheet sh,HSSFCellStyle titleStyle) {
this.name = sheetName;
this.sheet = sh;
this.titleStyle=titleStyle;
}
// public ExcelSheet(){
// this(name);
// }
public void addRecord(String[] record) {
if(header!=null){
if(header.length!=record.length){
return;
}
}
fillContent(record,sheet.getLastRowNum()+1,null);
}
public String[] getHeader() {
return this.header;
}
public void setHeader(String[] header) {
this.header=header;
fillContent(header,0,this.titleStyle);
}
private void fillContent(String[] crow, int rowNum, HSSFCellStyle style) {
HSSFRow row = sheet.createRow((short) rowNum);
for (int i = 0; i < crow.length; i++) {
String s = crow[i];
HSSFCell cell = row.createCell((short) i);
if(style!=null){
cell.setCellStyle(style);
}
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(s);
}
}
public void setValue(int rowNum,int colNum,String value){
HSSFRow row=this.sheet.getRow(rowNum);
HSSFCell cell=row.getCell((short)colNum);
if (cell==null){
cell = row.createCell((short) colNum);
}
cell.setEncoding(HSSFCell.ENCODING_UTF_16);
cell.setCellValue(value);
}
public String getName() {
// TODO Auto-generated method stub
return this.name;
}
public void addRecord(ArrayList<String[]> arr) {
for (String[] row : arr) {
this.addRecord(row);
}
}
public List<String[]> getRecords(){
ArrayList<String[]> vs=new ArrayList<String[]>();
for (int j = 0; j < this.sheet.getLastRowNum(); j++) {
HSSFRow row=this.sheet.getRow(j);
ArrayList<String> cellsStr = new ArrayList<String>();
for (short k = 0; k < row.getLastCellNum(); k++) {
HSSFCell cell=row.getCell(k);
if(cell!=null){
cellsStr.add(cell.getStringCellValue());
}
}
System.out.println("row=" + j + " values=" + cellsStr.toArray(new String[0]));
vs.add(cellsStr.toArray(new String[0]));
}
return vs;
}
public List<String> getAllValuesOfColum(short i) {
ArrayList<String> vs=new ArrayList<String>();
for (int j = 1; j <= this.sheet.getLastRowNum(); j++) {
HSSFRow row=this.sheet.getRow(j);
HSSFCell cell=row.getCell(i);
vs.add(cell.getStringCellValue());
}
return vs;
}
}
使用Excel类中Main方法可以测试一下,各个方法就不介绍了,都很简单。欢迎各位提出改进意见。