首页 > 代码库 > 利用poi3.9做的excel导出工具

利用poi3.9做的excel导出工具

一、先看看所生成的文件效果图

技术分享

二、准备

本文需要六个jar包:

dom4j-1.6.1.jar
ojdbc14.jar
poi-3.9-20121203.jar
poi-ooxml-3.9-20121203.jar
poi-ooxml-schemas-3.9-20121203.jar
xmlbeans-2.3.0.jar

除了ojdbc14.jar是用来访问数据库的,其它的都是导出excel所需要的poi相关jar包。

注:本文是以poi3.9版本写的,利用了SXSSFWorkbook这个Workbook,这个可以分批写入,防止内存溢出。这个类只有在3.8及3.8以上版本才有。

三、写个连接数据库的工具

写得很简单,用的是oracle数据库

代码如下:

package com.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBUtil {
	private static String driver="oracle.jdbc.driver.OracleDriver";
	private static String url="jdbc:oracle:thin:@127.0.0.1:1521:xe";
	private static String user="test";
	private static String password="test";
	public static Connection getConnection(){
		Connection conn = null;
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(url,user,password);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	public static void main(String[] args) {
		System.out.println(DBUtil.getConnection());//测试连接
	}
}
四、写导出工具类

代码如下:

package com.utils;

import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

public class POIExport {
	/**
	 * 根据所传入的参数生成一个Workbook
	 * @param sql 查询数据的sql
	 * @param columns sql中列名字符串,以英文逗号分隔,不区分大小写
	 * @param headers 表头字符串数组,如果是多表头,在需要合并的地方写"null",如:test1,test2,null,null,test3。
	 * 这表示test2将占三列。如果test2下面没有null,则占一行三列,有n个null,则占n行3列
	 * @param splitStr 分割表头字符串的分割符
	 * @return
	 */
	public static Workbook export(String sql,String columns,String[] headers, String splitStr){
		SXSSFWorkbook wb = new SXSSFWorkbook(1000);//创建excel文档,内存中保留 1000 条数据,以免内存溢出
		Font font = wb.createFont();//字体
		font.setBoldweight(Font.BOLDWEIGHT_BOLD);//加粗
		CellStyle cellStylehead = wb.createCellStyle();//表头样式
		cellStylehead.setFont(font);//设置字体样式
		cellStylehead.setAlignment(CellStyle.ALIGN_CENTER);//水平对齐
		cellStylehead.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直对齐
		cellStylehead.setWrapText(true);//自动换行
		//设置边框
		cellStylehead.setBorderTop(CellStyle.BORDER_THIN);
		cellStylehead.setBorderRight(CellStyle.BORDER_THIN);
		cellStylehead.setBorderBottom(CellStyle.BORDER_THIN);
		cellStylehead.setBorderLeft(CellStyle.BORDER_THIN);
		//表体样式
		CellStyle cellStyleBody = wb.createCellStyle();//表体单元格样式
		cellStyleBody.setAlignment(CellStyle.ALIGN_LEFT);//水平对齐
		cellStyleBody.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直对齐
		cellStyleBody.setWrapText(true);//自动换行
		//设置边框
		cellStyleBody.setBorderTop(CellStyle.BORDER_THIN);
		cellStyleBody.setBorderRight(CellStyle.BORDER_THIN);
		cellStyleBody.setBorderBottom(CellStyle.BORDER_THIN);
		cellStyleBody.setBorderLeft(CellStyle.BORDER_THIN);
		Sheet sheet = wb.createSheet("sheet1");//创建一个sheet
		sheet.setDefaultColumnWidth(15);//设置默认列宽
		//写表头
		createHeader(wb,sheet,cellStylehead,headers,splitStr);
		//写表体
		int beginRowNumber = headers.length;//表体开始行
		String[] cols = columns.split(",");//切分sql列名
		int cellSize = cols.length;//列数
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		conn = DBUtil.getConnection();
		try {
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sql);
			int count = 0;//记录行号
			while(rs.next()){
				Row row = sheet.createRow(count+beginRowNumber);
				row.setHeightInPoints(14);//设置行高
				for(int j=0;j<cellSize;j++){
					Cell cell = row.createCell(j);
					Object obj = rs.getObject(cols[j]);
					String cv = obj==null?"":obj.toString();//取得对应列中的值
					cell.setCellValue(cv);//设置单元格的值
					cell.setCellStyle(cellStyleBody);//设置样式
				}
				count++;
			}
			System.out.println("共写入数据:"+count+"条");
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				if(rs!=null){
					rs.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(stmt!=null){
					stmt.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(conn!=null){
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return wb;
	}

	/**
	 * 创建excel表头
	 * @param wb excel的workbook
	 * @param sheet excel的sheet
	 * @param cellStylehead excel的样式
	 * @param headers	表头字符串数组
	 * @param splitStr	表头字符串切割符
	 */
	private static void createHeader(SXSSFWorkbook wb, Sheet sheet,
			CellStyle cellStylehead, String[] headers, String splitStr) {
		//遍历创建单元格
		for(int i=0;i<headers.length;i++){
			Row row = sheet.createRow(i);
			String[] header = headers[i].split(splitStr);
			for(int r=0;r<header.length;r++){
				Cell cell = row.createCell(r);
				cell.setCellValue(header[r]);
				cell.setCellStyle(cellStylehead);
			}
		}
		//遍历合并单元格,如果是单表头则跳过
		if(headers.length>1){
			int[][][] mergeDatas = parseHeader(headers,splitStr);
			for(int i=0;i<mergeDatas.length;i++){
				int[][] mergeData = http://www.mamicode.com/mergeDatas[i];>五、如有什么bug请批评指正。

我把源码打包了,如果不想浪费2分,可以直接复制以上代码。如果不想复制,可以点这里下载:

http://download.csdn.net/detail/yunsyz/8345949


附文件目录图:

技术分享



利用poi3.9做的excel导出工具