通过POI组件从数据库向Excel中写数据

原创
2013/09/25 14:52
阅读数 461

写入Excel文件所需Jar包:poi-3.9-20121203.jar
Excel文件存放路径:D://cba.xls,这个可以根据你自己想要写入excel文件的路径而改变
修改这条语句中的路径即可:

FileOutputStream fileout = new FileOutputStream("D://cba.xls");


下面是整体代码:

package com.poi.test.outxls;

import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.DataFormat;
import org.junit.Test;

@SuppressWarnings("deprecation")
public class WriteExcel {
	
	static private String SQL_QUERY = "SELECT * FROM LOG4J";
	static private  List columnname = new ArrayList();
	static private PreparedStatement stmt = null;
	static private ResultSet rset = null;
//	static private List data = new ArrayList();  //Method One
	private List data = null ; //Method Two
	static private List resultData = new ArrayList();
	
	//@Test
	public void db()
	{
	    try {
	    	//1.注册驱动
			Class.forName("com.mysql.jdbc.Driver");
			//2.获取数据库连接
			Connection conn =
			DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
			"test","test");
		      stmt = conn.prepareStatement(SQL_QUERY);
		     rset = stmt.executeQuery();
		      ResultSetMetaData rsmd = rset.getMetaData();//获取元数据对象
		     
		      for(int i = 1;i<=rsmd.getColumnCount();i++)
		      {
		    	  columnname.add(rsmd.getColumnName(i));//获取表中各个字段的名称并存入columnname集合中
		      }
		      while(rset.next()) {
		    	  
		    	  /*****************Method   One**********************/  
		    	 //数组 
	   //   Object[] obj = new Object[]{rset.getString(1),rset.getString(2),rset.getString(3),rset.getString(4),rset.getString(5),rset.getString(6)};
		    //	  data.add(obj);
		    	  
		    	  
		    	/*****************Method   Two**********************/  
		    	 data  = new ArrayList();
		    	 System.out.println();
		    	 for(int i=1;i<=rsmd.getColumnCount();i++)
		    	 {
		    		 Object obj = rset.getObject(i);
		    		 data.add(obj);//存入每一条记录中字段的值
		    	 }
		    	 resultData.add(data);//存入数据库的记录条数
		    	 System.out.println("ColumnNum "+rsmd.getColumnCount()+"***"+rset.getString(1)+"***"+rset.getString(2)+"***"+rset.getString(3)+"***"+rset.getString(4));
		      }
	    }
	    catch (Exception e) {
	    	e.printStackTrace();
	      System.out.println("ERR");
	    }
	}
	
	@Test
	public void WriteToExcel()
	{
		db();
		try {
			FileOutputStream fileout = new FileOutputStream("D://cba.xls");
			HSSFWorkbook hswb = new HSSFWorkbook();//创建Excel工作对象
			
			DataFormat format = hswb.createDataFormat();//创建数据格式对象
			
			HSSFFont f = hswb.createFont();//创建字体对象
			f.setColor(HSSFColor.RED.index);//设置字体颜色
			f.setFontName("Comic Sans MS");	//Set Font
			
			HSSFFont f2 = hswb.createFont();
			f2.setColor(HSSFColor.BLUE.index);
			
			HSSFCellStyle hcs = hswb.createCellStyle();//创建单元格格式对象
			hcs.setFont(f);
//			hcs.setDataFormat(format.getFormat("@"));
			
			HSSFCellStyle hcs2 = hswb.createCellStyle();
			hcs2.setFont(f2);
//			hcs2.setDataFormat(format.getFormat("0"));
//			hcs2.setDataFormat(format.getFormat("yyyy-m-d h:mm:ss"));
			
			HSSFSheet sheet1 = hswb.createSheet("Log4j");//给Excel工作表命名
			
			sheet1.setSelected(true);//Set a sheet as selected//设置打开Excel默认选中的工作表
			
			//Merging cells -----合并单元格
			sheet1.addMergedRegion(new CellRangeAddress( 
					1, //first row (0-based)
					2, //last row  (0-based)
					5, //first column (0-based)
					5 //last column  (0-based)
					));
			
			
			HSSFRow row = sheet1.createRow(0);//创建sheet工作表中的第一行
			
			for(int i=0;i<columnname.size();i++)
			{
				 String colname = (String)columnname.get(i);
				 row.createCell(i).setCellValue(colname);//在第一行中创建单元格,并设置单元中的值
			}
			System.out.println("datasize is "+data.size());
			System.out.println("resultsize is "+resultData.size());
			
			/*****************Method   One**********************/  
		//	for(int j=0;j<data.size();j++)
		//	{
		//		row = sheet1.createRow(j+1);	
		//		Object[] obj = (Object[])data.get(j);
		//		for(int i=0;i<columnname.size();i++)
		//		{
		//			row.createCell(i).setCellValue(obj[i].toString());
		//		}
		//	}
			
			
			/*****************Method   Two**********************/ 
			HSSFCell hc = null;
			for(int i=0;i<resultData.size();i++)
			{
				sheet1.autoSizeColumn(i+1);//Adjust column width to fit the contents
				row = sheet1.createRow(i+1);//循环创建工作表的行数
				ArrayList list = (ArrayList)resultData.get(i);
				for(int j=0;j<list.size();j++)
				{	
					//row.createCell(j).setCellValue(list.get(j).toString());
					hc = row.createCell(j);//循环创建每一行所需要创建的单元格数
					//hc.setCellStyle(hcs);
				//	if(j%2==0)
					
					if(j==2)
					{
						/*java.lang.IllegalArgumentException: Cannot for                                                  mat given Object as a Date
						 format方法格式的对象必须是Date类型*/
//		String d = DateFormat.getDateInstance().format(String.valueOf(list.get(j)));
						
						/**
						 * 数值数据需要特殊处理。要将数字存储为数字而不是文本,                                                  * 需要先将它们转换成 doubles 类型。
						 * 不要将日期转换成 doubles 类型,否则将不正确。
						 */
						
						
						/**
						 * 直接以文本格式输出日期
						 */
	/*SimpleDateFormat smd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   Date d = DateFormat.getDateTimeInstance().parse(list.get(j).toString());//获取日期时间格式
						String date = smd.format(d);
						hc.setCellValue(date);
						hc.setCellStyle(hcs2);
						hc.setCellType(HSSFCell.CELL_TYPE_STRING);*/
						
						
						/*******************************************
						 * 
						 * Excel表格以日期转数字类型显示
						 * 此时需要把数据格式设置为:
						 * hcs2.setDataFormat(format.getFormat("0"));
						 * ******************************************/
	//SimpleDateFormat smd = new SimpleDateFormat("yyyy/M/d");//Note uppercase M
	 /*SimpleDateFormat smd = new SimpleDateFormat("yyyy-M-d");
	Date d = DateFormat.getDateInstance().parse(list.get(j).toString()); //获取日期格式
						String date = smd.format(d);
						String[] strs = date.split("-");
						StringBuffer sb = new StringBuffer();
						for(int r=0;r<strs.length;r++)
						{
							 sb.append(strs[r]);
						}
						
						String newdate = sb.toString();
						Double dd = Double.parseDouble(newdate);
						hc.setCellValue(dd);
						hcs2.setDataFormat(format.getFormat("0"));
						hc.setCellStyle(hcs2);
						hc.setCellType(HSSFCell.CELL_TYPE_NUMERIC);*/
						
						
						
						/********************************************************
						 * 当setCellValue(value);时
						 * 是Date类型时,可以设置setCellType(cellType)
						 * 应该为HSSFCell.CELL_TYPE_NUMERIC 
						 * 或者不设置setCellType属性
						 * 此时数据格式设置为:
						 * hcs2.setDataFormat(format.getFormat("yyyy-m-d h:mm:ss"));
						 * **********************************************************/
						hcs2.setDataFormat(format.getFormat("yyyy-m-d h:mm:ss"));
						Date d = DateFormat.getDateTimeInstance().parse(list.get(j).toString());//获取日期时间格式
						hc.setCellValue(d);
						hc.setCellStyle(hcs2);	//设置单元格格式
						hc.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
						
						
						
						//DataUtil工具类
//						hc.setCellValue(DateUtil.parseYYYYMMDDDate(list.get(j).toString()));
						
						
					}
					else
					{
						hc.setCellValue(list.get(j).toString());
						hc.setCellStyle(hcs);
						hc.setCellType(HSSFCell.CELL_TYPE_STRING);
					}
					
				}
				
			}
			hswb.write(fileout);
			fileout.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

参考:http://poi.apache.org/

        http://www.ibm.com/developerworks/cn/data/library/techarticles/0302bhogal/0302bhogal.html


展开阅读全文
打赏
0
7 收藏
分享
加载中
更多评论
打赏
0 评论
7 收藏
0
分享
返回顶部
顶部