Excel导出导入

1. 先说说导入

     导入流程很简单,

  第一步必须先知道文件在那 用一个标签 <s:file>即可解决

  

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
  2. <%@ taglib prefix="s" uri="/struts-tags" %> 
  3.  
  4.  
  5. <%  
  6. String path = request.getContextPath();  
  7. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  8. %> 
  9.  
  10. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  11. <html> 
  12.   <head> 
  13.     <base href="<%=basePath%>"> 
  14.       
  15.     <title>My JSP 'exceltodatabase.jsp' starting page</title> 
  16.       
  17.     <meta http-equiv="pragma" content="no-cache"> 
  18.     <meta http-equiv="cache-control" content="no-cache"> 
  19.     <meta http-equiv="expires" content="0">      
  20.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
  21.     <meta http-equiv="description" content="This is my page"> 
  22.     <!--  
  23.     <link rel="stylesheet" type="text/css" href="styles.css">  
  24.     --> 
  25.  
  26.   </head> 
  27.     
  28.   <body> 
  29.    <s:form action="userInfo" method="post" enctype="multipart/form-data">     
  30.     导入Excel文件:<s:file name="excelFile"></s:file> <br/>    
  31.     <s:submit value="导入"></s:submit>    
  32.   </s:form>    
  33.  
  34.  
  35.   </body> 
  36. </html> 

,在这里我用的是ACTION   都是自动赋值 所以无须接值 如果用Servlet  则将跳转路径修改  写一个方法 接收到FILE控件的值就OK 其他小细节就不说了。

 核心部分在接收Excle行的数据,由于Excle的单元格式有很多种。 想让其插入到数据库,很有可能会出现数据格式不符合的问题。

比如:  VO 的 username 字段属性是String    而Excle的单元格格式是数字 或者其他格式   那插入的过程就会出错  当初我是这样的想的 我全都设置成常规或者文本     将其转成String  再把String   转成VO的属性      但是失败了  后来 慢慢研究     发现了 其实影响数据不是只有 单元格格式。还有数据本身   怎么说呢 就是将数据过度到JAVA类的时候 就会发现      它会自己判断数据,    用这个方法getCellType获取数据格式     如果  username= 张三    getCellType=String 、 username=1233 getCellType=int、

 那插入就会出错        不说了 贴代码。

  1.  
  2. import java.io.File;    
  3.  
  4.  
  5. import java.io.FileInputStream;    
  6. import java.io.IOException;    
  7. import java.io.InputStream;    
  8. import java.util.ArrayList;    
  9. import java.util.Iterator;    
  10. import java.util.List;    
  11.     
  12. import org.apache.poi.hssf.record.UserSViewBegin;  
  13. import org.apache.poi.hssf.usermodel.HSSFCell;  
  14. import org.apache.poi.hssf.usermodel.HSSFWorkbook;    
  15. import org.apache.poi.ss.usermodel.Cell;    
  16. import org.apache.poi.ss.usermodel.Row;    
  17. import org.apache.poi.ss.usermodel.Sheet;    
  18. import org.apache.poi.ss.usermodel.Workbook;    
  19.    
  20. import cn.ichina.bean.ExcelWorkSheet;  
  21. import cn.ichina.bean.Userinfo;  
  22. import com.opensymphony.xwork2.ActionSupport;    
  23. /**  
  24.  * 导入的action  
  25.  * @author Administrator  
  26.  *  
  27.  */ 
  28. public class UserAction extends ActionSupport{  
  29.      private File excelFile; //上传的文件     
  30.          
  31.      private String excelFileFileName; //保存原始文件名        
  32.      private ExcelWorkSheet<Userinfo> excelWorkSheet;  //将Excel文件解析完毕后信息存放到这个对象中   
  33.      //判断文件类型     
  34.      public File getExcelFile() {    
  35.          return excelFile;    
  36.      }    
  37.      
  38.      public void setExcelFile(File excelFile) {    
  39.          this.excelFile = excelFile;    
  40.      }    
  41.      
  42.      public String getExcelFileFileName() {    
  43.          return excelFileFileName;    
  44.      }    
  45.      
  46.      public void setExcelFileFileName(String excelFileFileName) {    
  47.          this.excelFileFileName = excelFileFileName;    
  48.      }    
  49.      
  50.      public ExcelWorkSheet<Userinfo> getExcelWorkSheet() {    
  51.          return excelWorkSheet;    
  52.      }    
  53.      
  54.      public void setExcelWorkSheet(ExcelWorkSheet<Userinfo> excelWorkSheet) {    
  55.          this.excelWorkSheet = excelWorkSheet;    
  56.      }    
  57.      public Workbook createWorkBook(InputStream is) throws IOException{    
  58.          if(excelFileFileName.toLowerCase().endsWith("xls")){    
  59.              return new HSSFWorkbook(is);    
  60.          }    
  61.          if(excelFileFileName.toLowerCase().endsWith("xlsx")){    
  62.              //return new XSSFWorkbook(is);    
  63.          }    
  64.          return null;    
  65.      }    
  66.          
  67.      public String execute() throws Exception{    
  68.          System.out.println(excelFile);  
  69.          Workbook book = createWorkBook(new FileInputStream(excelFile));    
  70.          //book.getNumberOfSheets();  判断Excel文件有多少个sheet     
  71.          Sheet sheet =  book.getSheetAt(0);      
  72.          excelWorkSheet = new ExcelWorkSheet<Userinfo>();    
  73.          //保存工作单名称     
  74.          Row firstRow = sheet.getRow(0);    
  75.          Iterator<Cell> iterator = firstRow.iterator();    
  76.              
  77.          //保存列名     
  78.          List<String> cellNames = new ArrayList<String>();    
  79.          while (iterator.hasNext()) {    
  80.              cellNames.add(iterator.next().getStringCellValue());    
  81.          }    
  82.          excelWorkSheet.setColumns(cellNames);  
  83.          //遍历  
  84.          for (int i = 1; i <= sheet.getLastRowNum(); i++) {    
  85.              Row ros = sheet.getRow(i);    
  86.              Iterator cells = ros.cellIterator();     
  87.              Userinfo user = new Userinfo();   
  88.              if(ros!=null){  
  89.              while (cells.hasNext()) {     
  90.                  String valueString="";  
  91.                  HSSFCell cell = (HSSFCell) cells.next();     
  92.                   System.out.println("列:" + cell.getCellNum());  
  93.                  switch (cell.getCellType()) {     
  94.                  case HSSFCell.CELL_TYPE_NUMERIC: // 数字        
  95.                      valueString=String.valueOf(cell.getNumericCellValue());  
  96.                      System.out.println(cell.getNumericCellValue() + " 1 " );   
  97.                       break;     
  98.                  case HSSFCell.CELL_TYPE_STRING: // 字符串     
  99.                      valueString=String.valueOf(cell.getStringCellValue());  
  100.                      System.out.println(cell.getStringCellValue() + "  1 " );     
  101.                      break;     
  102.                  case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean    
  103.                      valueString=String.valueOf(cell.getBooleanCellValue());  
  104.                      System.out.println(cell.getBooleanCellValue() + " 1  " );     
  105.                      break;     
  106.                  case HSSFCell.CELL_TYPE_FORMULA: // 公式   
  107.                      valueString=String.valueOf(cell.getCellFormula());  
  108.                      System.out.println(cell.getCellFormula() + " 1   " );     
  109.                      break;     
  110.                  case HSSFCell.CELL_TYPE_ERROR: // 故障     
  111.                      System.out.println(" ");     
  112.                      break;       
  113.                  }     
  114.                  switch (((int)cell.getCellNum()))//这是判断当前是第几行 {     
  115.                  case 0// 如果等于第一行,获取
  116.                      System.out.println("id="+valueString);  
  117.                        break;     
  118.                  case 1:     // 如果等于第二行,获取
  119.                      user.setName(valueString);  
  120.                       break;     
  121.                  case 2:   // 如果等于第三行,获取
  122.                       user.setPass(valueString);  
  123.                      break;     
  124.                  case 3:     // 如果等于第四行,获取
  125.                      user.setLastname(valueString);  
  126.                      break;     
  127.                  case 4:   // 如果等于第五行,获取
  128.                      user.setAddres(valueString);  
  129.                      break;     
  130.                  case 5:      // 如果等于第六行,获取
  131.                      user.setRemark(valueString);      
  132.                      break;       
  133.                  }       
  134.                  }}  
  135.              excelWorkSheet.getData().add(user);    
  136.           
  137.       }   
  138.          for (int i = 0; i < excelWorkSheet.getData().size(); i++) {    
  139.              Userinfo info = excelWorkSheet.getData().get(i);  // 如果需要插入数据库 则写插入遇见即可  
  140. //             System.out.println(info.getLastname());    
  141.          }    
  142.            
  143.          return SUCCESS;    
  144.      }        
  145.      }  

  在这里 我用一个String 变量来接收所有的值 然后再将其设置VO   然后将VO设置进 excelWorkSheet的Data里   再用循环  赋值插入    这样导入就ok了。如果有很多行就多写几个case就ok了   

 

 

2,Excle导出并生成一个Excle

    导出很简单,但是有个问题。就是选择文件保存在那。 在这里我用的是下载的方式

 如果用的是servlet 用 JFileChooser 选择保存路径即可 但是有个问题  客户端无法弹出

  这个问题  我也不知道  求大神指教。

  1. JFileChooser jf=new JFileChooser(System.getProperty("user.dir"));//获取项目的路径  
  2.                 System.out.println(System.getProperty("user.dir"));  
  3.         jf.setSelectedFile(new File("ExeclIreport.xls"));//设置默认  
  4.          jf.setDialogTitle("选择报表保存路径");     //自定义选择框标题  
  5.         jf.setFileFilter(new FileNameExtensionFilter("xls""xls"));//设置文件格式  
  6.         int value=jf.showSaveDialog(null);  
  7.         if(value==JFileChooser.APPROVE_OPTION){    //判断窗口是否点的是打开或保存     
  8.         File getPath=jf.getSelectedFile();       } //取得路径  

好了先说

 

第一步  点击按钮,链接进入方法

  1. public InputStream getDownloadFile() throws Exception{  
  2.         return this.getInputStream();  
  3.     }  
  4.       
  5.     public InputStream getInputStream() {  
  6.         HSSFWorkbook wb=new HSSFWorkbook();  
  7.         HSSFSheet sheet=wb.createSheet("用户列表");  
  8.               
  9.         // 设置表格样式  
  10.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  11.         HSSFFont font = wb.createFont();  
  12.         font.setFontHeightInPoints((short)10); // 字体高度  
  13.         font.setColor(HSSFFont.COLOR_NORMAL); // 字体颜色  
  14.         font.setFontName( "宋体" );   
  15.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 宽度  
  16.         //font.setItalic( true );   // 是否使用斜体  
  17.         //font.setStrikeout(true); // 是否使用划线  
  18.         cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
  19.         cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);  
  20.         cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);  
  21.         cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
  22.         cellStyle.setFont(font);  
  23.         cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平布局:居中  
  24.         cellStyle.setWrapText(false);  
  25.           
  26.           
  27.         HSSFRow row=sheet.createRow(0);  
  28.         HSSFCell cell=row.createCell(0);  
  29.         cell.setCellStyle(cellStyle); // 设置单元格样式  
  30.         cell.setCellValue("序号");  
  31.           
  32.         cell=row.createCell(1);  
  33.         cell.setCellStyle(cellStyle); // 设置单元格样式  
  34.         cell.setCellValue("姓名");  
  35.           
  36.         cell=row.createCell(2);  
  37.         cell.setCellStyle(cellStyle); // 设置单元格样式  
  38.         cell.setCellValue("年龄");  
  39.           
  40.         //如果是数据库的数据的话,用一个for循环就可以输出全部了  
  41.         row=sheet.createRow(1);  
  42.           
  43.         cell=row.createCell(0);  
  44.         cell.setCellStyle(cellStyle);  
  45.         cell.setCellValue(1);  
  46.           
  47.         cell=row.createCell(1);  
  48.         cell.setCellStyle(cellStyle);  
  49.         cell.setCellValue("张三");  
  50.           
  51.         cell=row.createCell(2);  
  52.         cell.setCellStyle(cellStyle);  
  53.         cell.setCellValue("1221");  
  54.         ByteArrayOutputStream os = new ByteArrayOutputStream();  
  55.               
  56.         try {  
  57.             wb.write(os);   
  58.         } catch (IOException e){  
  59.             e.printStackTrace();  
  60.         }  
  61.         byte[] content = os.toByteArray();  
  62.         InputStream is = new ByteArrayInputStream(content);  
  63.         return is;  
  64.           
  65.     } 


 

如果用数据库的数据:

 

   

scoresall=this.scoresdao.findAll(""); //查出需要导出的数据

  //如果是数据库的数据的话,用一个for循环就可以输出全部了.  

  1.         for (int i = 0; i < scoresall.size(); i++) {      
  2.             tScores=scoresall.get(i);  
  3.         row=sheet.createRow(i+1);  
  4.         cell=row.createCell(0);  
  5.         cell.setCellStyle(cellStyle);  
  6.         cell.setCellValue(tScores.getExamname());  
  7.           
  8.         cell=row.createCell(1);  
  9.         cell.setCellStyle(cellStyle);  
  10.         cell.setCellValue(tScores.getExamnumber() );  
  11.           
  12.         cell=row.createCell(2);  
  13.         cell.setCellStyle(cellStyle);  
  14.         cell.setCellValue(tScores.getSubject());  
  15.  
  16.         cell=row.createCell(3);  
  17.         cell.setCellStyle(cellStyle);  
  18.         cell.setCellValue(tScores.getExaminename());  
  19.  
  20.         cell=row.createCell(4);  
  21.         cell.setCellStyle(cellStyle);  
  22.         cell.setCellValue(tScores.getGroupname());  
  23.  
  24.         cell=row.createCell(5);  
  25.         cell.setCellStyle(cellStyle);  
  26.         cell.setCellValue(tScores.getFraction());  
  27.         } 

   然后执行方法返回   因为我这ACTION 只有一个方法  所以直接返回下载

  1. <action name="exportExcel" class="com.crd.action.ExportExcelAction"> 
  2.      <result name="success" type="stream"> 
  3.             <!-- 指定输出的为Excel文件 -->    
  4.             <param name="contentType">application/vnd.ms-excel</param> 
  5.             <!-- 类型是附件和指定下载时文件的默认名字 --> 
  6.             <param name="contentDisposition">p_w_upload;filename="Uaaaas.xls"</param> 
  7.             <!-- 这里的inputName的属性要和action里相应的get方法的名字对应。例如action的对应的方法名是getDownloadFile  
  8.             所以这里用downloadFile --> 
  9.             <param name="inputName">downloadFile</param> 
  10.         </result>         
  11.     </action> 

 选择下载路径。OK

 

 

 

    在这里小弟附上  源代码下载  http://down.51cto.com/data/502603  

 chenwei51制作  请尊重作者  转帖 注明原地址

感谢各位的观看  小弟 第一次写 技术文档    有什么不足  麻烦指出  在这里谢谢了