使用 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)
	 */
	@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 對應的單元格的樣式

第二種是 設置新的樣式



發佈了56 篇原創文章 · 獲贊 6 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章