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