突然发现好久没写blog了,上一篇还是14年10月更新的,不是这段时间没编码,而是恰恰相反,这段时间实在太忙了,所以没有时间更新
项目中经常要制作报表而完全自己用poi生成报表太繁杂了,于是想用制作好的execl 替换数据实现报表的生成.
我对这各功能做好了封装,请看代码:
package com.newnewbank.utils.doc;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
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;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* @author 刘夏楠
* 用于按照xls模版生成xls
* 适用于仅有一个sheet的xls
*/
public class TempleteXlsCreator implements XlsCreator {
private SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
private File file;
private String dir;
{
dir=this.getClass().getClassLoader().getResource("/").getPath();
dir=dir.replace("classes", "xlsTemp");
///F:/workspace_v1.5/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/newnewbank-finance/WEB-INF/xlsTemp/
//dir="D:\\xls\\";
}
public TempleteXlsCreator(String tempName) throws IOException{
String fileAbsolutePath=dir+tempName+".xls";
file=new File(fileAbsolutePath);
load();
}
private HSSFWorkbook wb;
private HSSFSheet sheet;
public void load() throws IOException{
InputStream is = new FileInputStream(file);
this.wb= new HSSFWorkbook(is);
this.sheet = wb.getSheetAt(0);
}
private void setValue(HSSFCell cell,Object value){
if(value instanceof Integer){
cell.setCellValue((Integer)value);
}
if(value instanceof Double){
cell.setCellValue((Double)value);
}
if(value instanceof String){
cell.setCellValue((String)value);
}
if(value instanceof Date){
cell.setCellValue(sdf.format((Date)value));
}
}
public void replace(int row,int col,Object value){
HSSFRow hssfRow=sheet.getRow(row);
HSSFCell cell=hssfRow.getCell(col);
setValue(cell, value);
}
/**
* @param row 创建的行下标
* @param values 本行的所有值
* @param styleCopayRow 复制样式的行(创建本行前)
* @param styleCopyCol 复制样式的列(创建本行前)
* 本行的所有列都 套用 styleCopayRow 和 styleCopyCol 指定的单元格的样式
*/
public void createRow(int row,Object[] values,int styleCopayRow,int styleCopyCol){
HSSFRow styleHssfRow=sheet.getRow(styleCopayRow);
HSSFCell styleCell=styleHssfRow.getCell(styleCopyCol);
HSSFCellStyle cellStyle=styleCell.getCellStyle();
createRow(row, values, cellStyle);
}
/**
* @param row 创建的行下标
* @param values 本行的所有值
* @param cellStyle 单元格的样式
*/
public void createRow(int row,Object[] values,HSSFCellStyle cellStyle){
sheet.shiftRows(row, sheet.getLastRowNum(), 1,true,false);
HSSFRow hssfRow=sheet.createRow(row);
for (int i = 0; i < values.length; i++) {
HSSFCell cell=hssfRow.createCell(i);
setValue(cell, values[i]);
cell.setCellStyle(cellStyle);
}
}
/* (non-Javadoc)
* @see com.newnewbank.utils.doc.xlsCreator#write(java.lang.String)
*/
@Override
public void write(String path) throws IOException{
File outPutFile=new File(path);
if(!outPutFile.exists()){
outPutFile.createNewFile();
}
FileOutputStream os = new FileOutputStream(outPutFile);
wb.write(os);
os.close();
}
/* (non-Javadoc)
* @see com.newnewbank.utils.doc.xlsCreator#write(java.io.OutputStream)
*/
@Override
public void write(OutputStream outputStream) throws IOException{
wb.write(outputStream);
outputStream.close();
}
public static void main(String[] args) throws IOException {
TempleteXlsCreator creator=new TempleteXlsCreator("(3)newnewbank");
// creator.replace(1, 2, "标的名称");
creator.createRow(5, new Object[]{"1","2",3,4,5,6,7,8},5,2);
creator.write("D:\\xls\\abc123.xls");
}
}
只有两个功能
1)使用 replace 替换 对应坐标的 cell的值(样式不变)
2)使用 createRow 创建一行并填值
public void createRow(int row,Object[] values,int styleCopayRow,int styleCopyCol);
public void createRow(int row,Object[] values,HSSFCellStyle cellStyle);
两种方法的区别是 所创建的单元格的样式的来源
第一种是 复制 styleCopayRow styleCopyCol 对应的单元格的样式
第二种是 设置新的样式