说明:的确是用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.