`

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

    博客分类:
  • JXL
阅读更多

说明:的确是用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的两种方式弄了很久,也碰到了很多问题。这篇粘代码粘太多了,问题就不写在这篇了,呵呵呵!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics