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();

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章