简单的POI导出JSP页面表格数据到excel

数据库中的equipment表格数据:


读取数据库中表格数据的代码TestExcel.java

public class TestExcel extends BaseAction{

	/**
	 * @param args
	 * @throws Exception 
	 */
	public  String excel()  {
		try{
		Connection connection = con();
        String sql = "select * from equipment";
        PreparedStatement  ps = pre(sql, connection);
       ResultSet rs =  ps.executeQuery();
        String [] string = {"设备编号","学院名称","入库时间","实验室位置","实验箱名称","使用状态"};
       ArrayList listname = new ArrayList();
        for(int i = 0;i< string.length;i++){
        	listname.add(string[i]);
        }
       // ArrayList  listname = (ArrayList) Arrays.asList(string);
 	   ArrayList listData = new ArrayList();
       while(rs.next()){
    	   ArrayList list = new ArrayList();
    	   list.add(rs.getString(1));
    	   list.add(rs.getString(2));
    	   list.add(rs.getTimestamp(3));
    	   list.add(rs.getString(4));
    	   list.add(rs.getString(5));
    	   list.add(rs.getString(6));
    	   listData.add(list);
       }
       OutputStream out = response.getOutputStream();
		//重置输出流
		response.reset();
		//设置导出Excel报表的导出形式
		response.setContentType("application/vnd.ms-excel");
		//设置下载的excel文件名称
		response.setHeader("Content-Disposition", "attachment;filename=zfc.xls");  
		 ExcelFileGenerator ex = new ExcelFileGenerator(listname,listData);
		ex.expordExcel(out);
		//设置输出形式
		System.setOut(new PrintStream(out));
		//刷新输出流
		out.flush();
		//关闭输出流
		if(out!=null){
			out.close();
		}
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return null;
	}
	public static Connection con() throws Exception{
		Connection connection = null;
		Class.forName("com.mysql.jdbc.Driver");
		connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/ems", "root", "123456");
		return connection;
	}
	
	public static PreparedStatement pre(String sql,Connection connection) throws Exception{
		PreparedStatement ps = null;
		ps = connection.prepareStatement(sql);
		return ps;
	}

}

将list集合的中的数据导入到excel表中的步骤如下:

 * 1、创建 HSSFWorkBook对象
* 2、获取要导出的表格的总记录数
* 3、根据总记录和每个excels的所容纳的记录数,进行分页处理,得出分为几个sheet的excels
* 4、得出sheet,进行每个sheet的循环处理
*      4.1、通过workbook对象进行创建createSheet,HSSFSheet对象
*      4.2、拥有了HSSFSheet对象,创建sheet.createRow行表头,单独的一行即数据说明
*      4.3、创建表头行HSSFRow,开始导入表头行数据,开始对表头这一行进行数据循环填充
*              4.3.1、通过行头对象HSSFRow创建HSSFCell列对象
*              4.3.2、有列对象,可以设置显示的样式,单元格宽度通过sheet对象设置
*              4.3.3、列对象设置完了,可以进行值的填充cell.setValue
*       4.4、接着开始循环每一行数据,对总记录进行循环,如果超过最大容量,那么最大值就是它,否则就是实际记录数
*       4.5、开始进入循环,然后都要创建一个行对象HSSFRow,根据现在的页数取出第几条数据集合,进行循环
*               4.5.1、也是通过HSSFRow,创建HSSFCell列对象
*               4.5.2、通过cell对象设置相应的样式或者编码
*               4.5.3、编码设置完,就可以进行每列数据的填充
* 5、返回workBook对象


代码ExcelFileGenerator.java:

public class ExcelFileGenerator {

	private final int SPLIT_COUNT = 1500; //Excel每个工作簿的行数

	private ArrayList fieldName = null; //excel标题数据集

	private ArrayList fieldData = null; //excel数据内容	

	private HSSFWorkbook workBook = null;

	/**
	 * 构造器
	 * @param fieldName 结果集的字段名
	 * @param data
	 */
	public ExcelFileGenerator(ArrayList fieldName, ArrayList fieldData) {

		this.fieldName = fieldName;
		this.fieldData = fieldData;
	}

	/**
	 * 1、创建 HSSFWorkBook对象
	 * 2、获取要导出的表格的总记录数
	 * 3、根据总记录和每个excels的所容纳的记录数,进行分页处理,得出分为几个sheet的excels
	 * 4、得出sheet,进行每个sheet的循环处理
	 *      4.1、通过workbook对象进行创建createSheet,HSSFSheet对象
	 *      4.2、拥有了HSSFSheet对象,创建sheet.createRow行表头,单独的一行即数据说明
	 *      4.3、创建表头行HSSFRow,开始导入表头行数据,开始对表头这一行进行数据循环填充
	 *              4.3.1、通过行头对象HSSFRow创建HSSFCell列对象
	 *              4.3.2、有列对象,可以设置显示的样式,单元格宽度通过sheet对象设置
	 *              4.3.3、列对象设置完了,可以进行值的填充cell.setValue
	 *       4.4、接着开始循环每一行数据,对总记录进行循环,如果超过最大容量,那么最大值就是它,否则就是实际记录数
	 *       4.5、开始进入循环,然后都要创建一个行对象HSSFRow,根据现在的页数取出第几条数据集合,进行循环
	 *               4.5.1、也是通过HSSFRow,创建HSSFCell列对象
	 *               4.5.2、通过cell对象设置相应的样式或者编码
	 *               4.5.3、编码设置完,就可以进行每列数据的填充
	 * 5、返回workBook对象
	 * 创建HSSFWorkbook对象
	 * @return HSSFWorkbook
	 */
	public HSSFWorkbook createWorkbook() {
       
		workBook = new HSSFWorkbook();
		int rows = fieldData.size();
		int sheetNum = 0;

		if (rows % SPLIT_COUNT == 0) {
			sheetNum = rows / SPLIT_COUNT;
		} else {
			sheetNum = rows / SPLIT_COUNT + 1;
		}

		for (int i = 1; i <= sheetNum; i++) {
			HSSFSheet sheet = workBook.createSheet("Page " + i);
			HSSFRow headRow = sheet.createRow((short) 0); 
			for (int j = 0; j < fieldName.size(); j++) {
				HSSFCell cell = headRow.createCell((short) j);
				//添加样式
				cell.setCellType(HSSFCell.CELL_TYPE_STRING);
				cell.setEncoding(HSSFCell.ENCODING_UTF_16);
				//添加样式
				//设置所有单元格的宽度
				sheet.setColumnWidth((short)j, (short)6000);
				//创建样式(使用工作本的对象创建)
				HSSFCellStyle cellStyle = workBook.createCellStyle();
				//创建字体的对象
				HSSFFont font = workBook.createFont();
				//将字体加粗
				font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
				//设置字体的颜色
				short color = HSSFColor.RED.index;
				font.setColor(color);
				//将新设置的字体属性放置到样式中
				cellStyle.setFont(font);
				if(fieldName.get(j) != null){
					cell.setCellStyle(cellStyle);
					cell.setCellValue((String) fieldName.get(j));
				}else{
					cell.setCellStyle(cellStyle);
					cell.setCellValue("-");
				}
			}

			for (int k = 0; k < (rows < SPLIT_COUNT ? rows : SPLIT_COUNT); k++) {
				HSSFRow row = sheet.createRow((short) (k + 1));
				//将数据内容放入excel单元格
				ArrayList rowList = (ArrayList) fieldData.get((i - 1)* SPLIT_COUNT + k);
			//	ArrayList rowList = fieldData;
				for (int n = 0; n < rowList.size(); n++) {
					HSSFCell cell = row.createCell((short) n);
					cell.setEncoding(HSSFCell.ENCODING_UTF_16);
					if(rowList.get(n) != null){
						cell.setCellValue((String) rowList.get(n).toString());
					}else{
						cell.setCellValue("");
					}
				}
			}
		}
		return workBook;
	}

	public void expordExcel(OutputStream os) throws Exception {
		workBook = createWorkbook();
		workBook.write(os);
		os.close();
	}

}





  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值