poi操作excel文件

struts1.x文章來自http://www.blogjava.net/hawk8359/archive/2008/02/19/180623.html 
import java.io.*; 
import java.sql.*; 
import java.util.ArrayList; 

import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.poi.hssf.usermodel.*; 
import org.apache.struts.action.*; 
import org.apache.struts.upload.FormFile; 
import org.apache.commons.beanutils.BeanUtils; 

public class Action { 
/**//* 
  * 把數據庫中的字段導入到Excel ,並生成Excel文檔 
  **/ 
public ActionForward getDownload(ActionMapping actionMapping, 
   ActionForm actionForm, HttpServletRequest request, 
   HttpServletResponse response) throws Exception { 
  Form fm = (Form) actionForm; 
  // Excel 文件存放在服務器的相對路徑下 
  String outputFile = request.getRealPath("/tmp/Excel.xls"); 
  
  try { 
   // 創建新的Excel 工作簿 
   HSSFWorkbook workbook = new HSSFWorkbook(); 
   // 在Excel 工作簿中建一工作表 
   HSSFSheet sheet = workbook.createSheet("Sheet1"); 
   // 設置單元格格式(文本) 
   HSSFCellStyle cellStyle = workbook.createCellStyle(); 
   cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("@")); 
   
   // 在索引0的位置創建行(第一行) 
   HSSFRow row = sheet.createRow((short) 0); 
   
   HSSFCell cell1 = row.createCell((short) 0);// 第一列 
   HSSFCell cell2 = row.createCell((short) 1); 
   HSSFCell cell3 = row.createCell((short) 2); 
   // 定義單元格爲字符串類型 
   cell1.setCellType(HSSFCell.CELL_TYPE_STRING); 
   cell2.setCellType(HSSFCell.CELL_TYPE_STRING); 
   cell3.setCellType(HSSFCell.CELL_TYPE_STRING); 
   
   cell1.setEncoding(HSSFCell.ENCODING_UTF_16); 
   cell2.setEncoding(HSSFCell.ENCODING_UTF_16); 
   cell3.setEncoding(HSSFCell.ENCODING_UTF_16); 
   // 在單元格中輸入數據 
   cell1.setCellValue("姓名"); 
   cell2.setCellValue("性別"); 
   cell3.setCellValue("年齡"); 
   
   Connection connection = session.connection(); 
   
   String sql = "Select t.name, t.sex, t.age from table t where t.sex = ?"; 
   
   try { 
    PreparedStatement ps = connection.prepareStatement(sql); 
    ps.setString(1, fm.getSex());// 傳入查詢條件 
    ResultSet rs = ps.executeQuery();// 查詢結果存入rs 
    connection.commit();// 執行SQL 
    
    while (rs.next()) { 
    //設置j行從第二行開始 
     int j = 1; 
     row = sheet.createRow((short) j); 
     //設置i列從第二列開始 
     for (int i = 1; i <= 3; i++) { 
      HSSFCell cell = row.createCell((short) (i-1)); 
      // 設置單元格格式 
      cell.setCellStyle(cellStyle); 
      cell.setCellType(HSSFCell.CELL_TYPE_STRING); 
      cell.setEncoding(HSSFCell.ENCODING_UTF_16); 
      cell.setCellValue(rs.getString(i)); 
     } 
     
     j++; 
    } 
    
    request.setAttribute("message", "文件生成成功!"); 
   } catch (SQLException e) { 
    request.setAttribute("message", "創建文件失敗!"); 
    e.printStackTrace(); 
   } 
   // 刪除路徑下同名的Excel 文件 
   File path = new File(outputFile); 
   path.delete(); 
   
   // 新建一輸出文件流 
   FileOutputStream fOut = new FileOutputStream(outputFile); 
   // 把相應的Excel 工作簿存盤 
   workbook.write(fOut); 
   // 操作結束,關閉文件 
   fOut.flush(); 
   fOut.close(); 
    //該處如果Excel過大會影響效率,誰有好的想法可以提出來參考(不過從頁面下載完後就會清空) 
   request.getSession().setAttribute("Download", outputFile); 
   
  } catch (Exception ioexception) { 
   request.setAttribute("message", "創建文件失敗!"); 
   return actionMapping.findForward("outJSP"); 
  } 
  
  return actionMapping.findForward("outJSP"); 


/**//* 
  * 從Excel文件中讀取數據,並導入到數據庫中 
  **/ 
  public ActionForward getUpload(ActionMapping actionMapping, 
   ActionForm actionForm, HttpServletRequest request, 
   HttpServletResponse response) throws Exception { 
  // 獲取excel 文件 
  Form fm = (Form) actionForm; 
  FormFile formfile = fm.getUploadfile(); 
  InputStream inputstream = formfile.getInputStream(); 
  fm.clear();// 清空 
  Session session = HibernateSession.currentSession(); 
  ArrayList list = new ArrayList(); 
  int input = 0; //導入記數 
  String name = null; 
  String sex = null; 
  String age = null; 
  
  try { 
   //通過得到的文件輸入流inputstream創建一個HSSFWordbook對象 
         HSSFWorkbook hssfworkbook = new HSSFWorkbook(inputstream); 
         HSSFSheet hssfsheet = hssfworkbook.getSheetAt(0);//第一個工作表 
   HSSFRow hssfrow = hssfsheet.getRow(0);//第一行 
   
   //遍歷該表格中所有的工作表,i表示工作表的數量 getNumberOfSheets表示工作表的總數 
            for (int i = 0; i < hssfworkbook.getNumberOfSheets(); i++) { 
             hssfsheet = hssfworkbook.getSheetAt(i); 
             
             //遍歷該行所有的行,j表示行數 getPhysicalNumberOfRows行的總數 
                for (int j = 1; j < hssfsheet.getPhysicalNumberOfRows(); j++) { 
                 hssfrow = hssfsheet.getRow(j); 
                 //判斷是否還存在需要導入的數據 
                    if (hssfrow == null) { 
                     System.out.println("這裏已沒有數據,在第"+i+"列,第"+j+"行"); 
                     break;//此處本人用continue,防止比方第八行沒數據,而第九行有數據時,break會退出循環 
                    } 
                    /** *//**將EXCEL中的第 j 行,第一列的值插入到實例中*/ 
                    if (hssfrow.getCell((short) 0) == null) { 
                     name = ""; 
                    } else if (hssfrow.getCell((short) 0).getCellType() == 0) { 
                     name = new Double(hssfrow.getCell((short) 0).getNumericCellValue()).toString(); 
                    } 
                    //如果EXCEL表格中的數據類型爲字符串型 
                    else { 
                     name = hssfrow.getCell((short) 0).getStringCellValue().trim(); 
                    } 
                    /** *//**將EXCEL中的第 j 行,第二列的值插入到實例中*/ 
                    //姓名 
                    if(hssfrow.getCell((short) 1) == null){ 
                     sex = ""; 
                    } else if(hssfrow.getCell((short) 1).getCellType() == 0) { 
                        sex = new Double(hssfrow.getCell((short) 1).getNumericCellValue()).toString(); 
                    } 
                    //如果EXCEL表格中的數據類型爲字符串型 
                    else { 
                        sex = hssfrow.getCell((short) 1).getStringCellValue().trim(); 
                    } 
                    /** *//**將EXCEL中的第 j 行,第三列的值插入到實例中*/ 
                    //姓名 
                    if(hssfrow.getCell((short) 1) == null){ 
                     age = ""; 
                    } else if(hssfrow.getCell((short) 1).getCellType() == 0) { 
                        age = new Double(hssfrow.getCell((short) 1).getNumericCellValue()).toString(); 
                    } 
                    //如果EXCEL表格中的數據類型爲字符串型 
                    else { 
                        age = hssfrow.getCell((short) 1).getStringCellValue().trim(); 
                    } 
                    
                    name = name.trim(); 
                    sex = sex.toUpperCase(); 
                    
                    if (name.equals("")) { 
                     error.setName(name); 
                     error.setMessage("姓名不能爲空"); 
                     
                     list.add(error); 
                     continue; 
                    } else { 
                     fm.setName(name); 
                     fm.setSex(sex); 
                     fm.setAge(age); 
                     
                     session.save(fm); 
                    } 
                    //導入成功加1 
                    input++; 
                } 
            } 
            
            session.saveObjs(list.toArray()); 
        } catch () { 
         
        } 





2.Form的寫法 


import org.apache.struts.action.ActionForm; 
import org.apache.struts.upload.FormFile; 

public class Form extends ActionForm { 
// 上傳的文件 
private FormFile _flddo; 

public void setUploadfile(FormFile formfile) { 
  _flddo = formfile; 


public FormFile getUploadfile() { 
  return _flddo; 


public void clear() { 
  _flddo = null; 







3.上傳頁面Upload.jsp 




<%@ page contentType="text/html; charset=GBK" language="java"%> 
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%> 

<html> 
<html:form action="/Action.do?method=getUpload" method="POST" enctype="multipart/form-data"> 
  <html:file property="uploadfile" size="80%" /> 
  <input type="button" value="導 入" οnclick="upload(this.form)" class="buttonGray"> 
</html:form> 
</html> 

<script language="javascript"> 
function upload(obj) 

if(confirm("您現在選擇的是XXX,您確定要導入嗎?")) 

  var uploadfile = document.all.uploadfile.value; 
  if((null == uploadfile) ||( "" == uploadfile)) 
  { 
   alert("上傳文件沒有指定!"); 
   return false; 
  } 
     obj.action = '<html:rewrite page="/Action.do?method=getUpload"/>'; 
     obj.submit(); 


</script> 



4.下載頁面Download.jsp 




<%@ page contentType="text/html; charset=GBK"%> 
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %> 
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %> 

<% 
//獲取下載文件 
String download = (String) request.getSession().getAttribute("Download"); 
//清空文件 
request.getSession().removeAttribute("Download"); 
%> 

<html> 
下傳文件 <a href="<%=download %>" name="下載">下載</a> 
</html> 
[color=red]/*******   自己修改的讀Excel文件部分 main()方法中 ****/[/color] 
try { 
// 通過得到的文件輸入流inputstream創建一個HSSFWordbook對象 
HSSFWorkbook hssfworkbook = new HSSFWorkbook(new FileInputStream( 
FILE_NAME)); 

// 遍歷該表格中所有的工作表,i表示工作表的數量 getNumberOfSheets表示工作表的總數 
System.out.println("工作區:"+hssfworkbook.getNumberOfSheets()); 
for (int i = 0; i < hssfworkbook.getNumberOfSheets(); i++) { 
HSSFSheet hssfsheet = hssfworkbook.getSheetAt(i); 
System.out.println("/n第" + (i + 1) + "張工作薄開始^^^^"); 
int num=hssfsheet.getLastRowNum(); 
System.out.println(num); 
// 遍歷該行所有的行,j表示行數 getPhysicalNumberOfRows行的總數 
System.out.println("行數:"+hssfsheet.getLastRowNum()); 
for (int j = 0; j < hssfsheet.getLastRowNum(); j++) {
HSSFRow hssfrow = hssfsheet.getRow(j);
System.out.println("/n第" + (j + 1) + "行數據開始^^^^"); 
// 判斷是否還存在需要導入的數據 
// try { 
if (hssfrow != null) {
for (int k = 0; k < hssfrow.getLastCellNum();k++) { 
String name = "空"; 
if (hssfrow.getCell((short) k) != null) { 
int type=hssfrow.getCell((short) k).getCellType(); 
switch (type){ 
case 0: 
name = new Double(hssfrow.getCell((short) k) 
.getNumericCellValue()).toString(); 
break; 
case 1: 
name = hssfrow.getCell((short) k) 
.getStringCellValue().trim(); 
break; 
case 4: 
name = String.valueOf(hssfrow.getCell((short) k) 
.getBooleanCellValue()); 
break; 
default : 
name = "空"; 
break; 


System.out.print((k + 1) + ":"+ name+"  "); 

System.out.println(); 





} catch (Exception e) { 
e.printStackTrace(); 

}
發佈了54 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章