突然发现好久没写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 对应的单元格的样式
第二种是 设置新的样式
时间: 2024-09-29 00:11:10