使用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' 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的两种方式弄了很久,也碰到了很多问题。这篇粘代码粘太多了,问题就不写在这篇了,呵呵呵!
上一篇: 使用 POI导出到Excel
下一篇: 常用正则表达式_pynoteslog_2
推荐阅读
-
Python开发使用Pandas包进行Excel表格数据操作
-
Java操作Jxl实现导出数据生成Excel表格数据文件
-
使用JXL、HSSF、XSSH操作Excel数据
-
使用JAVA流操作将Excel表中数据取出,并直接生成完整SQL语句
-
Python使用SQLite和Excel操作进行数据分析
-
.NET读写Excel工具Spire.Xls使用 对数据操作与控制(4)
-
Python使用xlrd模块操作Excel数据导入的方法
-
Java操作Jxl实现导出数据生成Excel表格数据文件
-
Python开发使用Pandas包进行Excel表格数据操作
-
Python使用xlrd模块操作Excel数据导入的方法