POI报表

我们一般都用POI来做这个
首先 针对要导出的表 做excel的模板
然后 自己写一个工具类 来根据不同的表使用不同模板导出数据
前不久在一个项目中也有这种要求,写了一个类来处理
补充:
第168行至169行之间(即writeSheet(HSSFSheet sheet, ResultSet resultSet)方法第一句)加
resultSet.beforeFirst();
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.model.Workbook;

/**
 * Microsoft Excel 写入器。
 *
 * @author HeDYn
 * @version 0.1.2009-03-01
 */
public class ExcelWriter {
	
	private File xlsFile = null;
	private String dateFormat = null;
	
	private HSSFWorkbook workbook = null;
	private SimpleDateFormat dateFormatter = null;
	
	/**
	 * 创建一个Excel文件写入器,所有数据将写入到指定的xls文件中
	 *
	 * @param xlsFile 指定目标文件位置,原位置已存在同名文件将被覆盖
	 */
	public ExcelWriter(File xlsFile) {
		this(xlsFile, null);
	}
	
	/**
	 * 创建一个Excel文件写入器,所有数据将写入到指定的xls文件中;
	 * 写入日期时以指定格式形式写入
	 *
	 * @param xlsFile 指定目标文件位置,原位置已存在同名文件将被覆盖
	 * @param dateFormat 日期格式,如果为null则按本地日期格式
	 */
	public ExcelWriter(File xlsFile, String dateFormat) {
		this.xlsFile = xlsFile;
		workbook = new HSSFWorkbook();
		
		setDateFormat(dateFormat);
	}
	
	/**
	 * 返回Excel文件
	 *
	 * @return
	 */
	public File getFile() {
		return xlsFile;
	}
	
	/**
	 * 返回写入日期时所用的格式
	 *
	 * @return 格式化字符串
	 */
	public String getDateFormat() {
		return dateFormat;
	}
	
	/**
	 * 设置写入日期时采用的格式
	 *
	 * @param dateFormat 日期格式化字符串
	 */
	public void setDateFormat(String dateFormat) {
		this.dateFormat = dateFormat;
		if (dateFormat == null) {
			dateFormatter = new SimpleDateFormat();
		} else {
			dateFormatter = new SimpleDateFormat(dateFormat);
		}
	}
	
	/**
	 * 清空缓存,将数据写入物理存储介质
	 *
	 * @throws IOException
	 */
	public void flush() throws IOException {
		FileOutputStream fileOut = null;
		try {
			fileOut = new FileOutputStream(xlsFile);
			workbook.write(fileOut);
		} catch (IOException e) {
			throw e;
		} finally {
			fileOut.close();
		}
	}
	
	/**
	 * 新增一个工作薄并将数组中的数据写入
	 *
	 * @param data 需写入的数组数据
	 */
	public void writeSheet(Object[][] data) {
		HSSFSheet sheet = workbook.createSheet();
		writeSheet(sheet, data);
	}
	
	/**
	 * 新增一个工作薄并将JDBC数据库返回结果集的列名及数据写入
	 *
	 * @param resultSet 数据库返回结果集
	 */
	public void writeSheet(ResultSet resultSet) throws SQLException {
		HSSFSheet sheet = workbook.createSheet();
		writeSheet(sheet, resultSet);
	}
	
	/**
	 * 新增一个指定名称的工作薄并将数组中的数据写入,
	 * 如果表中已经存在该名称的工作薄将抛出运行时异常
	 *
	 * @param sheetName 新增的工作薄名称
	 * @param data 需写入的数组数据
	 */
	public void writeSheet(String sheetName, Object[][] data) {
		HSSFSheet sheet = workbook.createSheet(sheetName);
		writeSheet(sheet, data);
	}
	
	/**
	 * 新增一个指定名称的工作薄并将数据库返回结果集的列名及数据写入,
	 * 如果表中已经存在该名称的工作薄将抛出运行时异常
	 *
	 * @param sheetName 新增的工作薄名称
	 * @param resultSet 数据库返回结果集
	 */
	public void writeSheet(String sheetName, ResultSet resultSet) throws SQLException {
		HSSFSheet sheet = workbook.createSheet(sheetName);
		writeSheet(sheet, resultSet);
	}
	
	/**
	 * 写入数组中的数据到指定的工作薄
	 */
	private void writeSheet(HSSFSheet sheet, Object[][] data) {
		for (int i=0; i<data.length; i++) {
			HSSFRow row = sheet.createRow(i);
			for (int j=0; j<data[i].length; j++) {
				HSSFCell cell = row.createCell(j);
				writeCell(cell, data[i][j]);
			}
		}
	}
	
	/**
	 * 写入数据库结果集的列名及数据到指定工作薄
	 */
	private void writeSheet(HSSFSheet sheet, ResultSet resultSet) throws SQLException {
		ResultSetMetaData metaData = resultSet.getMetaData();
		int rowNum = 0;
		// 写入列名
		HSSFRow header = sheet.createRow(rowNum);
		int colCount = metaData.getColumnCount();
		for (int i=0; i<colCount; i++) {
			HSSFCell cell = header.createCell(i);
			writeCell(cell, metaData.getColumnLabel(i+1));
		}
		
		// 写入数据
		while (resultSet.next()) {
			rowNum++;
			HSSFRow row = sheet.createRow(rowNum);
			for (int i=0; i<colCount; i++) {
				HSSFCell cell = row.createCell(i);
				writeCell(cell, resultSet.getObject(i+1));
			}
		}
	}
	
	/**
	 * 写入数据到指定单元格
	 */
	private void writeCell(HSSFCell cell, Object obj) {
		if (obj instanceof Date) {
			// 日期以文本形式写入
			Date d = (Date) obj;
			cell.setCellValue(new HSSFRichTextString(dateFormatter.format(d)));
		} else if (obj instanceof Boolean) {
			boolean b = (Boolean) obj;
			cell.setCellValue(b);
		} else if (obj instanceof Number) {
			double d = ((Number) obj).doubleValue();
			cell.setCellValue(d);
		} else {
			String s = (String) obj;
			cell.setCellValue(new HSSFRichTextString(s));
		}
	}
}
 

你可能感兴趣的:(apache,sql,工作,Excel,J#)