欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用JXL、HSSF、XSSH操作Excel数据

程序员文章站 2022-07-13 13:18:07
...

说明:的确是用JXL、HSSF、XSSF三种方式导入、导出Excel数据,但是跟所用项目的业务有所关联,摘出来比较麻烦,我就直接贴代码了。当给自己一个备份吧。

 

目前我知道的、会用的用来处理Excel的也就JXL和POI两种,JXL是用来处理Excel2003格式的,也只能处理这种格式。POI有HSSF和XSSF两种,前者用来且只处理Excel2003版本,后者用来处理2007版本且只处理2007版本的,要是用错了,系统会报错,譬如说:

1、org.apache.poi.openxml4j.exceptions.InvalidOperationException: Can't open the specified file:xxx 

2、org.apache.poi.POIXMLException: org.apache.poi.openxml4j.exceptions.InvalidFormatException: Package should contain a content type part [M1.13]。

这两种错基本上都是跟Excel版本有关系的。

 

好啦,言归正传,直接贴代码:

1、JXL读取Excel和将数据写入到Excel中:

/**
 * 该方法用来读取指定的Excel文件,将其中的内容拼接成String返回到调用方法处
 * @param filepath:需要读取的文件路径
 * @param fieldList:参数列表
 * @param viewID:指定的视图序号
 * @param user:当前登录人
 * */
public String readExcelInJXL(String filepath,String fieldList,String viewID,SUser user) throws Exception {
	StringBuffer retuStr= new StringBuffer();
	StringBuffer columnVal = new StringBuffer();
	String fields = "";
	String afterSql="";
	String sql="";
	//3、获取需要insert的表和字段数据
	SView view = this.dataEngine.getView(Integer.parseInt(viewID));
	Integer size = this.dataEngine.getViewDatabindView(view.getSViewId(), 2).size();//获取要求显示的字符串
	//说明有添加条件(在导入数据模块,将该条件作为前执行sql)
	if(view.getQuery()!=null && view.getQuery().trim().length()>0){
		fields = replaceFieldList(fieldList,view.getQuery())+";";
	}
	//在导入数据模块,将该条件作为后执行sql
	if(view.getOrdersql()!=null && view.getOrdersql().trim().length()>0){ 
		afterSql = replaceFieldList(fieldList,view.getOrdersql())+";";
	}
	//拼接SQL
	fields = fields+"insert into "+view.getSelectcondition()+"("+this.dataEngine.getViewColumn(view)+")";
	String paramVal = getFieldList(fieldList);//获取参数键数据
	paramVal +=this.dataEngine.getDefaultData(view,user);//获取默认值信息
	//System.out.println(fields);
	//4、读取上传的Excel文件
	File excelFile = new File(filepath);
	Workbook book = Workbook.getWorkbook(excelFile);//获取Excel文件对象,便于读取
	//5、获取每个sheet并读取其中数据
	String cellContent = "";//单元格内容
	DateCell dc=null;//单元格日期类型 
	Sheet[] sheets = book.getSheets();//获取当前Excel下所有sheet集合
	for(int j=0;j<sheets.length;j++){
		Sheet sheet = sheets[j];//获取单个sheet
		String sheetName = sheet.getName();//当前sheet的名称
		Integer column = sheet.getColumns();//当前sheet所有列
		if(column!=size) break;//说明上传的excel与给定的字段不想符合,那么当前工作簿不加载
		Integer row = sheet.getRows();//当前sheet所有行
		retuStr.append("<center><h3>"+sheetName+"</h3></center>")
			   .append("<table  border='0' cellspacing='0' cellpadding='0' class='p_show' width='100%'>");
		for(int m=0;m<row;m++){//一行一行的遍历
			if(m==0){//第一行:标题行
				retuStr.append("<tr class='tabFirstTr'>");
				for(int n=0;n<column;n++){
					//getCell(int columu,int row):获取第columu列,第row行的单元格,getContents()获取单元格的内容
					if(null!=sheet.getCell(n,0).getContents() && !sheet.getCell(n,0).getContents().equals("")){//不为空,进行拼接
						retuStr.append("<td>"+sheet.getCell(n,0).getContents()+"</td>");
					}else{
						column=n-1;//避免空的列也显示出来
						break;
					}
				}
				retuStr.append("<td>操作</td>");
				retuStr.append("</tr>");
			}else{//其他内容行
				retuStr.append("<tr>");
				columnVal.delete(0, columnVal.length());//清空
				sql="";
				for(int n=0;n<column;n++){
					//值如是为空或者空字符串,那么设置默认值0
					//日期格式为date类型,需要进行判断
//						System.out.print("************\n"+sheet.getCell(n,m).getContents()+sheet.getCell(n,m).getType());
					if(sheet.getCell(n,m).getType().equals(CellType.DATE)){
						dc = (DateCell)sheet.getCell(n,m);
						Date jxlDate = dc.getDate();  
	                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
	                    sdf.setTimeZone(TimeZone.getTimeZone("GMT"));  
//		                    System.out.println("格式化后的日期:"+sdf.format(jxlDate));  
						cellContent = sdf.format(jxlDate);
					}else{
						cellContent =(sheet.getCell(n,m).getContents()==null || sheet.getCell(n,m).getContents().equals(""))?"":sheet.getCell(n,m).getContents();
					}
					
					columnVal.append(",'"+(cellContent.equals("")?"0":cellContent)+"'");
					retuStr.append("<td>"+cellContent+"</td>");
				}
				if(columnVal.length()>0){sql = columnVal.substring(1);}
				
				sql = fields+" values("+paramVal+sql+");"+afterSql;
	   			retuStr.append("<td><a href='javascript:void(0);' class='deleteTr' onclick='deleteTheTr(this);' title='删除'><img src='images/alldel.png'/></a><textarea name='sql'>"+sql+"</textarea></td>");
	   			retuStr.append("</tr>");
			}
		}
		retuStr.append("</table>");
	}
	//删除文件
	excelFile.delete();
	return retuStr.toString();
}

/**
 * 该方法从数据库中查询数据并写入到Excel文件中,最后返回Excel文件路径
 * @param parametersStr:参数字符串,告知获取哪个视图的哪些字段哪些数据信息
 * @param user:当前登录人信息
 * @param flag:查询标记 1-模糊查询 0-精确查询
 * */
public String exportToExcelInJXL(String parametersStr,SUser user,int flag) throws Exception {
	String result="";
	Parameters paramters=this.getParameters(parametersStr);
	List<Object[]> dataList = this.dataEngine.getTableData(paramters,user,flag);
	if(dataList!=null && dataList.size()>0){
    	
		String fileName = System.currentTimeMillis()+".xls";//以当前时间作为Excel的名称:2003版本的  
        File saveDir = this.initFileDir();//获取Excel文件导出后保存路径
//        	System.out.println(saveDir+ java.io.File.separator + fileName);  
        String filePath = saveDir+ java.io.File.separator + fileName;
        File excel = new File(filePath);  
         
        //工作簿名称 list
        Object [] title = dataList.get(dataList.size()-2);
        WritableWorkbook workBook = Workbook.createWorkbook(excel);//创建可写入的Excel工作薄  
        Object [] sheetName= dataList.get(dataList.size()-1); 
        WritableSheet sheet = workBook.createSheet(sheetName[0].toString(), 0);//生成名为“当前视图名称”的工作表,参数0表示这是第一页,1表示第二页,以此类推  
        /** 
         * 定义excel主标题的格式 
         */  
        WritableFont title2 = new WritableFont(WritableFont.ARIAL,12,WritableFont.BOLD);//加粗  
        WritableCellFormat titlewcf = new WritableCellFormat(title2); // 单元格定义  
        titlewcf.setAlignment(jxl.format.Alignment.CENTRE); //设置对齐方式  
        titlewcf.setBorder(Border.ALL, BorderLineStyle.THIN);//设置边框样式  
        titlewcf.setBackground(Colour.LIGHT_GREEN);//设置背景色  
          
        /** 
         * 定义excel列标题的格式 
         */  
        WritableFont wf = new WritableFont(WritableFont.ARIAL,14,WritableFont.BOLD);//加粗  
        WritableCellFormat wcf = new WritableCellFormat(wf); // 单元格定义  
        wcf.setAlignment(jxl.format.Alignment.CENTRE); // 设置对齐方式  
        wcf.setBorder(Border.ALL, BorderLineStyle.THIN);//设置边框样式  
        wcf.setBackground(Colour.LIGHT_GREEN);//设置背景色  
          
        /** 
         * 定义excel内容的格式 
         */  
        WritableFont comtent = new WritableFont(WritableFont.ARIAL,12,WritableFont.NO_BOLD);//常规  
        WritableCellFormat comtent_c = new WritableCellFormat(comtent); // 单元格定义  
        comtent_c.setAlignment(jxl.format.Alignment.CENTRE); // 设置对齐方式  
        comtent_c.setBorder(Border.ALL, BorderLineStyle.THIN);//设置边框样式  
        comtent_c.setBackground(Colour.LIGHT_GREEN);//设置背景色  
         
        String objStr="";
        //遍历“标题”内容并添加到Excel中  
        for(int i=0;i<title.length;i++){  
            sheet.setColumnView(i, 23);//设置单元格的宽度
            sheet.setRowView(i, 20*23,false);//设置单元格的宽度,目前为23,高度大概得设置成Excel里面行高的20倍才能达到相应的效果
            objStr=(title[i]==null?"":title[i].toString());
            Label label=new Label(i,0,objStr,wcf);//在第一行中添加文本类单元格  
            sheet.addCell(label);  
        }  
          
        //遍历list中的内容并添加到Excel中
        for(int i=0;i<dataList.size()-2;i++){  
        	Object [] objs= dataList.get(i);  
            for(int j=0;j<objs.length;j++){
            	objStr=objs[j]==null?"":objs[j].toString();
//                	System.out.println(i+"        "+j+"    "+objStr);
            	//添加序号列
            	Label orderLabel = new Label(0,i+1,new Integer(i+1).toString(),comtent_c);//第一列为序号列
                sheet.addCell(orderLabel); 
                
            	Label label = new Label(j+1,i+1,objStr,comtent_c);//从第二行开始添加单元格,第一行是标题  
                sheet.addCell(label);  
            }  
        }  
        //在Excel中写入数据并关闭文件  
        workBook.write();  
        workBook.close();  
        result=filePath;
	}
	return result;
}

 

2、HSSF读取Excel和将数据写入到Excel中:

/**
 * 该方法用来读取指定的Excel文件,将其中的内容拼接成String返回到调用方法处
 * @param filepath:需要读取的文件路径
 * @param fieldList:参数列表
 * @param viewID:指定的视图序号
 * @param user:当前登录人
 * */
public String readExcelInHSSF(String filepath,String fieldList,String viewID,SUser user) throws Exception {
	StringBuffer retuStr= new StringBuffer();
	StringBuffer columnVal = new StringBuffer();
	String fields = "";
	String afterSql="";
	String sql="";
	//3、获取需要insert的表和字段数据
	SView view = this.dataEngine.getView(Integer.parseInt(viewID));
	Integer size = this.dataEngine.getViewDatabindView(view.getSViewId(), 2).size();//获取要求显示的字符串
	//说明有添加条件(在导入数据模块,将该条件作为前执行sql)
	if(view.getQuery()!=null && view.getQuery().trim().length()>0){
		fields = replaceFieldList(fieldList,view.getQuery())+";";
	}
	//在导入数据模块,将该条件作为后执行sql
	if(view.getOrdersql()!=null && view.getOrdersql().trim().length()>0){ 
		afterSql = replaceFieldList(fieldList,view.getOrdersql())+";";
	}
	//拼接SQL
	fields = fields+"insert into "+view.getSelectcondition()+"("+this.dataEngine.getViewColumn(view)+")";
	String paramVal = getFieldList(fieldList);//获取参数键数据
	paramVal +=this.dataEngine.getDefaultData(view,user);//获取默认值信息
	//System.out.println(fields);
	//4、读取上传的Excel文件
	File excelFile = new File(filepath);
	POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(excelFile));
	HSSFWorkbook workBook = new HSSFWorkbook(fs);//获取Excel文件对象,便于读取
	//5、获取每个sheet并读取其中数据
	String cellContent = "";//单元格内容
	HSSFSheet sheet = null;
	for(int j=0;j<workBook.getNumberOfSheets();j++){//获取当前Excel下所有sheet集合
		sheet = workBook.getSheetAt(j);//获取单个sheet
		String sheetName = workBook.getSheetName(j);//当前sheet的名称
		Integer columnNum = sheet.getRow(0).getPhysicalNumberOfCells();;//当前sheet总共有多少列
		if(columnNum!=size) break;//说明上传的excel与给定的字段不想符合,那么当前工作簿不加载
		Integer rowNum = sheet.getLastRowNum();//当前sheet所有行
		retuStr.append("<center><h3>"+sheetName+"</h3></center>")
			   .append("<table  border='0' cellspacing='0' cellpadding='0' class='p_show' width='100%'>");
		HSSFRow row=null;//行
		for(int m=0;m<=rowNum;m++){//一行一行的遍历
			row = sheet.getRow(m);//获取当前行
			if(m==0){//第一行:标题行
				retuStr.append("<tr class='tabFirstTr'>");
				for(short n=0;n<columnNum;n++){
					if(null!=row.getCell(n) && !row.getCell(n).getRichStringCellValue().toString().equals("")){//不为空,进行拼接
						retuStr.append("<td>"+row.getCell(n).getRichStringCellValue().toString()+"</td>");
					}else{
						columnNum=n-1;//避免空的列也显示出来
						break;
					}
				}
				retuStr.append("<td>操作</td>");
				retuStr.append("</tr>");
			}else{//其他内容行
				retuStr.append("<tr>");
				columnVal.delete(0, columnVal.length());//清空
				sql="";
				for(short n=0;n<columnNum;n++){
					//值如是为空或者空字符串,那么设置默认值0
					cellContent = row.getCell(n)!=null?parseExcel(row.getCell(n)):"";
					columnVal.append(",'"+(cellContent.equals("")?"0":cellContent)+"'");
					retuStr.append("<td>"+cellContent+"</td>");
				}
				if(columnVal.length()>0){sql = columnVal.substring(1);}
				
				sql = fields+" values("+paramVal+sql+");"+afterSql;
	   			retuStr.append("<td><a href='javascript:void(0);' class='deleteTr' onclick='deleteTheTr(this);' title='删除'><img src='images/alldel.png'/></a><textarea name='sql'>"+sql+"</textarea></td>");
	   			retuStr.append("</tr>");
			}
		}
		retuStr.append("</table>");
	}
	//删除文件
	excelFile.delete();
	return retuStr.toString();
}

/**
 * 该方法从数据库中查询数据并写入到Excel文件中,最后返回Excel文件路径
 * @param parametersStr:参数字符串,告知获取哪个视图的哪些字段哪些数据信息
 * @param user:当前登录人信息
 * @param flag:查询标记 1-模糊查询 0-精确查询
 * */
public String exportToExcelInHSSF(String parametersStr,SUser user,int flag) throws Exception {
	String result="";
	Parameters paramters=this.getParameters(parametersStr);
	List<Object[]> dataList = this.dataEngine.getTableData(paramters,user,flag);
	if(dataList!=null && dataList.size()>0){
    	//1、创建Excel文件
		String fileName = System.currentTimeMillis()+".xls";//以当前时间作为Excel的名称:2003版本的  
        File saveDir = this.initFileDir();//获取Excel文件导出后保存路径
        String filePath = saveDir+ java.io.File.separator + fileName;
        FileOutputStream fout = new FileOutputStream(filePath);
        
        //2、获取工作簿名称和主标题
        Object [] title = dataList.get(dataList.size()-2);
        Object [] sheetName= dataList.get(dataList.size()-1); 
        
        //3、创建一个webbook,对应一个Excel文件
		HSSFWorkbook workbook = new HSSFWorkbook();
		HSSFSheet sheet = workbook.createSheet(sheetName[0].toString());//添加sheet
		sheet.setDefaultColumnWidth(23);//设置当前sheet的默认列宽
		sheet.setDefaultRowHeightInPoints(23);  
		//4、创建标题行,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
		HSSFRow row = sheet.createRow((int) 0);
        //定义excel主标题的格式 
		HSSFCellStyle titleStyle = workbook.createCellStyle();
		titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中
		titleStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);//前景色,浅绿色
		titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		titleStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		titleStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		titleStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		titleStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		
		//创建标题的字体样式
		HSSFFont titleFont = workbook.createFont();
		titleFont.setColor(HSSFColor.BLACK.index);//字体颜色,黑色
		titleFont.setFontHeightInPoints((short) 14);//14号字体
		titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //加粗
		
		titleStyle.setFont(titleFont);
        String objStr="";
        //遍历“标题”内容并添加到Excel中  
        for(int i=0;i<title.length;i++){  
        	objStr=(title[i]==null?"":title[i].toString());
            HSSFCell cell = row.createCell(i);
            cell.setCellStyle(titleStyle);
            HSSFRichTextString text = new HSSFRichTextString(objStr);
            cell.setCellValue(text);
        } 
        
        //5、创建内容样式
        //定义excel主标题的格式 
		HSSFCellStyle contentStyle = workbook.createCellStyle();
		contentStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);//浅绿色
		contentStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		contentStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		contentStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		contentStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		contentStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		contentStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

	    //生成内容字体样式
	    HSSFFont contentFfont = workbook.createFont();
	    contentFfont.setColor(HSSFColor.BLACK.index);//字体颜色,黑色
	    contentFfont.setFontHeightInPoints((short) 12);//12号字体
	    contentFfont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
	    // 把字体应用到当前的样式
	    contentStyle.setFont(contentFfont);
		
        //遍历list中的内容并添加到Excel中
        for(int i=0;i<dataList.size()-2;i++){  
        	row = sheet.createRow((i+1));//创建行
        	Object [] objs= dataList.get(i); 
        	//添加其他列
    		HSSFCell cell = row.createCell(0);//第一列为序号列
            cell.setCellStyle(contentStyle);
            cell.setCellValue((i+1)); 
        	for(short j=0;j<objs.length;j++){
            	objStr=objs[j]==null?"":objs[j].toString();
                cell = row.createCell(j+1);
                cell.setCellStyle(contentStyle);
                HSSFRichTextString text = new HSSFRichTextString(objStr);
                cell.setCellValue(text);  
            }  
        }  
        //6、在Excel中写入数据并关闭文件  
        workbook.write(fout);
        fout.flush();
		fout.close(); 
        result=filePath;
	}
//    	System.out.println(result);
	return result;
}

 

3、XSSF读取Excel和将数据写入到Excel中(与XSSF大同小异):

/**
 * 该方法用来读取指定的Excel文件,将其中的内容拼接成String返回到调用方法处
 * @param filepath:需要读取的文件路径
 * @param fieldList:参数列表
 * @param viewID:指定的视图序号
 * @param user:当前登录人
 * */
public String readExcelInXSSF(String filepath,String fieldList,String viewID,SUser user) throws Exception {
	StringBuffer retuStr= new StringBuffer();
	StringBuffer columnVal = new StringBuffer();
	String fields = "";
	String afterSql="";
	String sql="";
	//3、获取需要insert的表和字段数据
	SView view = this.dataEngine.getView(Integer.parseInt(viewID));
	Integer size = this.dataEngine.getViewDatabindView(view.getSViewId(), 2).size();//获取要求显示的字符串
	//说明有添加条件(在导入数据模块,将该条件作为前执行sql)
	if(view.getQuery()!=null && view.getQuery().trim().length()>0){
		fields = replaceFieldList(fieldList,view.getQuery())+";";
	}
	//在导入数据模块,将该条件作为后执行sql
	if(view.getOrdersql()!=null && view.getOrdersql().trim().length()>0){ 
		afterSql = replaceFieldList(fieldList,view.getOrdersql())+";";
	}
	//拼接SQL
	fields = fields+"insert into "+view.getSelectcondition()+"("+this.dataEngine.getViewColumn(view)+")";
	String paramVal = getFieldList(fieldList);//获取参数键数据
	paramVal +=this.dataEngine.getDefaultData(view,user);//获取默认值信息
	//System.out.println(fields);
	//4、读取上传的Excel文件
	File excelFile = new File(filepath);
	XSSFWorkbook workBook = new XSSFWorkbook(new FileInputStream(excelFile));//获取Excel文件对象,便于读取
	//5、获取每个sheet并读取其中数据
	String cellContent = "";//单元格内容
	XSSFSheet sheet = null;
	for(int j=0;j<workBook.getNumberOfSheets();j++){//获取当前Excel下所有sheet集合
		sheet = workBook.getSheetAt(j);//获取单个sheet
		String sheetName = workBook.getSheetName(j);//当前sheet的名称
		Integer columnNum = sheet.getRow(0).getPhysicalNumberOfCells();;//当前sheet总共有多少列
		if(columnNum!=size) break;//说明上传的excel与给定的字段不想符合,那么当前工作簿不加载
		Integer rowNum = sheet.getLastRowNum();//当前sheet所有行
		retuStr.append("<center><h3>"+sheetName+"</h3></center>")
			   .append("<table  border='0' cellspacing='0' cellpadding='0' class='p_show' width='100%'>");
		XSSFRow row=null;//行
		for(int m=0;m<=rowNum;m++){//一行一行的遍历
			row = sheet.getRow(m);//获取当前行
			if(m==0){//第一行:标题行
				retuStr.append("<tr class='tabFirstTr'>");
				for(short n=0;n<columnNum;n++){
					if(null!=row.getCell(n) && !row.getCell(n).getRichStringCellValue().toString().equals("")){//不为空,进行拼接
						retuStr.append("<td>"+row.getCell(n).getRichStringCellValue().toString()+"</td>");
					}else{
						columnNum=n-1;//避免空的列也显示出来
						break;
					}
				}
				retuStr.append("<td>操作</td>");
				retuStr.append("</tr>");
			}else{//其他内容行
				retuStr.append("<tr>");
				columnVal.delete(0, columnVal.length());//清空
				sql="";
				for(short n=0;n<columnNum;n++){
					//值如是为空或者空字符串,那么设置默认值0
					cellContent = row.getCell(n)!=null?parseExcel(row.getCell(n)):"";
					columnVal.append(",'"+(cellContent.equals("")?"0":cellContent)+"'");
					retuStr.append("<td>"+cellContent+"</td>");
				}
				if(columnVal.length()>0){sql = columnVal.substring(1);}
				
				sql = fields+" values("+paramVal+sql+");"+afterSql;
	   			retuStr.append("<td><a href='javascript:void(0);' class='deleteTr' onclick='deleteTheTr(this);' title='删除'><img src='images/alldel.png'/></a><textarea name='sql'>"+sql+"</textarea></td>");
	   			retuStr.append("</tr>");
			}
		}
		retuStr.append("</table>");
	}
	//删除文件
	excelFile.delete();
	//System.out.println("XSSF:"+retuStr.toString());
	return retuStr.toString();
}

/**
 * 该方法从数据库中查询数据并写入到Excel文件中,最后返回Excel文件路径
 * @param parametersStr:参数字符串,告知获取哪个视图的哪些字段哪些数据信息
 * @param user:当前登录人信息
 * @param flag:查询标记 1-模糊查询 0-精确查询
 * */
public String exportToExcelInXSSF(String parametersStr,SUser user,int flag) throws Exception {
	String result="";
	Parameters paramters=this.getParameters(parametersStr);
	List<Object[]> dataList = this.dataEngine.getTableData(paramters,user,flag);
	if(dataList!=null && dataList.size()>0){
    	//1、创建Excel文件
		String fileName = System.currentTimeMillis()+".xlsx";//以当前时间作为Excel的名称:2007版本的  
        File saveDir = this.initFileDir();//获取Excel文件导出后保存路径
        String filePath = saveDir+ java.io.File.separator + fileName;
        FileOutputStream fout = new FileOutputStream(filePath);//文件不存在时会自动新建
//            System.out.println(filePath);
        //2、获取工作簿名称和主标题
        Object [] title = dataList.get(dataList.size()-2);
        Object [] sheetName= dataList.get(dataList.size()-1); 
        //3、创建一个webbook,对应一个Excel文件
		XSSFWorkbook workbook = new XSSFWorkbook();
		XSSFSheet sheet = workbook.createSheet(sheetName[0].toString());//添加sheet
		sheet.setDefaultColumnWidth(23);//设置当前sheet的默认列宽
		sheet.setDefaultRowHeightInPoints(23);  
		//4、创建标题行,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
		XSSFRow row = (XSSFRow) sheet.createRow((int) 0);
        //定义excel主标题的格式 
		XSSFCellStyle titleStyle = (XSSFCellStyle) workbook.createCellStyle();
		titleStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);//居中
		titleStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);//前景色,浅绿色
		titleStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
		titleStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
		titleStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
		titleStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
		titleStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
		titleStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
		
		//创建标题的字体样式
		XSSFFont titleFont = (XSSFFont) workbook.createFont();
		titleFont.setColor(HSSFColor.BLACK.index);//字体颜色,黑色
		titleFont.setFontHeightInPoints((short) 14);//14号字体
		titleFont.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); //加粗
		//将字体添加到样式中
		titleStyle.setFont(titleFont);
		
        String objStr="";
        //遍历“标题”内容并添加到Excel中  
        for(int i=0;i<title.length;i++){  
        	objStr=(title[i]==null?"":title[i].toString());
            XSSFCell cell = row.createCell(i);
            cell.setCellStyle(titleStyle);
            XSSFRichTextString text = new XSSFRichTextString(objStr);
            cell.setCellValue(text);
        } 
        
        //5、创建内容样式
        //定义excel主标题的格式 
		XSSFCellStyle contentStyle = (XSSFCellStyle) workbook.createCellStyle();
		contentStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index);//浅绿色
		contentStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
		contentStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
		contentStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
		contentStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
		contentStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
		contentStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
		contentStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);

	    //生成内容字体样式
	    XSSFFont contentFfont = (XSSFFont) workbook.createFont();
	    contentFfont.setColor(HSSFColor.BLACK.index);//字体颜色,黑色
	    contentFfont.setFontHeightInPoints((short) 12);//12号字体
	    contentFfont.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
	    // 把字体应用到当前的样式
	    contentStyle.setFont(contentFfont);
		
        //遍历list中的内容并添加到Excel中
        for(int i=0;i<dataList.size()-2;i++){  
        	row = (XSSFRow) sheet.createRow((i+1));//创建行
        	Object [] objs= dataList.get(i); 
        	//添加其他列
    		XSSFCell cell = row.createCell((short)(0));//第一列为序号列
            cell.setCellStyle(contentStyle);
            cell.setCellValue((i+1)); 
        	for(short j=0;j<objs.length;j++){
            	objStr=objs[j]==null?"":objs[j].toString();
                cell = row.createCell((short)(j+1));
                cell.setCellStyle(contentStyle);
                XSSFRichTextString text = new XSSFRichTextString(objStr);
                cell.setCellValue(text);  
            }  
        }  
        
        //6、在Excel中写入数据并关闭文件  
		workbook.write(fout);
        fout.flush();
		fout.close();
        result=filePath;
	}
//    	System.out.println(result);
	return result;
}

 

4、用到的一些公用方法:

/**
 * 该方法用来替换参数值
 * @param fieldList:参数集合,格式:参数键1:参数值1;参数键2:参数值2;以此类推
 * @param reg:需要进行替换的字符串
 * */
private String replaceFieldList(String fieldList,String reg){
	//只要双方有一个为null或者为空字符串,都返回原来的值reg
	if(fieldList==null || fieldList.trim().equals("") ||
			reg==null || reg.trim().equals("")){
		return reg;
	}
	fieldList = fieldList.trim();//去除空格
	reg = reg.trim();
	String[] fields = fieldList.split(";");//
	String[] val = null;
	if(fields.length>0){//说明至少有一组
		for(String f:fields){
			val = f.split(":");
			reg = reg.replaceAll("<"+val[0]+">", val[1]);
		}
	}
	return reg;
}

private Parameters getParameters(String parametersStr) {
	return ParametersUitls.getParametersByStrForXML(parametersStr);
}

/**
 * 该方法用来获取参数键的参数值
 * @param fieldList:参数集合,格式:参数键1:参数值1;参数键2:参数值2;以此类推
 * */
private String getFieldList(String fieldList){
	//只要双方有一个为null或者为空字符串,都返回原来的值reg
	if(fieldList==null || fieldList.trim().equals("")){
		return "";
	}
	fieldList = fieldList.trim();//去除空格
	String[] fields = fieldList.split(";");//
	StringBuffer result= new StringBuffer();
	if(fields.length>0){//说明至少有一组
		for(String f:fields){
			result.append("'"+f.split(":")[1]+"'").append(",");
		}
	}
	return result.toString();
}

/** 
 * 导出数据时,先判断指定目录是否存在,若不存在则新建 
 * 若存在,则删除指定目录下的文件,避免每次下载都生成文件导致硬盘容量不够 
 */  
private File initFileDir() {  
	String savePath = WebAppConfig.app("excelDir");//从配置文件中获取保存Excel的目录
	savePath=savePath.trim();
	if(savePath==null || savePath.equals("null") || savePath.length()<=0 ){
		savePath = "D:"+java.io.File.separator+"bfp"+java.io.File.separator+"ed";
	}
    File saveDir = new File(savePath);    
    if(!saveDir.isDirectory()){//指定目录不存在则新建   
        saveDir.mkdir();    
    }else{//若是已经存在,那么删除里面的内容,避免每次下载都生成文件导致硬盘容量不够  
      deleteFiles(saveDir);  
        //saveDir.mkdir();   
    } 
    return saveDir;
}

/** 
 * 删除文件 
 * @param file:File类型,指定要删除的文件 
 * */  
private void deleteFiles(File file){
	Calendar cal = Calendar.getInstance();
	Calendar cal2 = Calendar.getInstance();
	cal2.setTime(new Date());//设置当前时间
	int day1=0,day2=0;
    if(file.isDirectory()){  
        File[] files = file.listFiles();//获取指定目录下的所有文件  
            for(int i=0;i<files.length;i++){
                cal.setTimeInMillis(files[i].lastModified()); 
                if(cal2.get(Calendar.YEAR)-cal.get(Calendar.YEAR)>0){//說明是以前的文件,那麼直接刪除
                	deleteFiles(files[i]);
                }else{//說明是今年或以後的文件
                	 day1= cal.get(Calendar.DAY_OF_YEAR);
                     day2 = cal2.get(Calendar.DAY_OF_YEAR);
                      if((day2-day1)>0){//說明是今天之前的文件
                    	  deleteFiles(files[i]);
                      }
                }
             }  
    }  
    file.delete();//删除文件  
}

/**
 * 该方法用来处理单元格中的数据
 * */
private String parseExcel(Cell cell) {
	String result = new String();
	switch (cell.getCellType()) {
	case HSSFCell.CELL_TYPE_NUMERIC:// 数字类型
		 short format = cell.getCellStyle().getDataFormat();  
		    SimpleDateFormat sdf = null;  
		    if(format == 14 || format == 31 || format == 57 || format == 58){ //日期    
		        sdf = new SimpleDateFormat("yyyy-MM-dd");  
		    }else if (format == 20 || format == 32) { //时间   
		        sdf = new SimpleDateFormat("HH:mm");  
		    }
		  //若为数字,获取到的Value会自动添加一个0,变成xxx.0,这种格式的数据不能保存到数据类型为int的字段中
		    Double value = cell.getNumericCellValue(); 
		    if(sdf!=null){//需要进行格式化
		    	Date date = HSSFDateUtil.getJavaDate(value);  
			    result = sdf.format(date);
		    }else{//可能是数字
		    	Long longVal = Math.round(value);//转换成long类型,此时没有小数点
//			    	System.out.println(longVal+"\t"+Double.parseDouble(longVal + ".0"));
		        if(Double.parseDouble(longVal + ".0") == value)  
		        	result = longVal.toString();  
		        else  
		        	result = value.toString();    
		    }
		break;
	case HSSFCell.CELL_TYPE_STRING:// String类型
		result = cell.getRichStringCellValue().toString();
		break;
	case HSSFCell.CELL_TYPE_BLANK:
		result = "";
	default:
		result = "";
		break;
	}
	return result;
}

 

 POI的两种方式弄了很久,也碰到了很多问题。这篇粘代码粘太多了,问题就不写在这篇了,呵呵呵!