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

说明:的确是用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' οnclick='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.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值