使用 poi 导入execl模版文件添加数据制作报表

突然发现好久没写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) */@Overridepublic 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) */@Overridepublic 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);

两种方法的区别是 所创建的单元格的样式的来源

第一种是 复制styleCopayRowstyleCopyCol 对应的单元格的样式

第二种是 设置新的样式

,即使是不成熟的尝试,也胜于胎死腹中的策略。

使用 poi 导入execl模版文件添加数据制作报表

相关文章:

你感兴趣的文章:

标签云: