1. 程式人生 > >Excel檔案上傳伺服器並解析存入資料庫的整套過程(2003--2013都可試)

Excel檔案上傳伺服器並解析存入資料庫的整套過程(2003--2013都可試)


執行環境搭建:
    JDK1.6.0
    MyEclipse 6.5
    Linux伺服器


所需jar包:用積分到我的資源下載


java程式碼: 

ReadExcel03Util.java


package com.rapoo.excelToDB;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;




import jxl.Workbook;




import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;




public class ReadExcel03Util{
HSSFWorkbook readbook;
HSSFSheet sheet;
String FormatDate;

Log log = LogFactory.getLog(this.getClass());

public  ReadExcel03Util(String uploadFilePath) throws IOException
{
FileInputStream fis=new FileInputStream(uploadFilePath);
POIFSFileSystem pfs=new POIFSFileSystem(fis);
readbook=new HSSFWorkbook(pfs);
sheet=readbook.getSheetAt(0);

}



public HSSFWorkbook getReadbook() {
return readbook;
}


public void setReadbook(HSSFWorkbook readbook) {
this.readbook = readbook;
}


public HSSFSheet getSheet() {
return sheet;
}


public void setSheet(HSSFSheet sheet) {
this.sheet = sheet;
}

public List<List<String>> ItermCell(HSSFSheet sheet){
List<List<String>> str1 = new ArrayList<List<String>>();    

lable:
  // 遍歷行Row

 
  for(int rowNum=1;rowNum<=sheet.getLastRowNum();rowNum++){
  
  log.info("總共的行數:"+sheet.getLastRowNum());
  List<String> str2 = new ArrayList<String>();
           HSSFRow hssfRow=sheet.getRow(rowNum);
            if(hssfRow==null){
                break lable;
            }
            // 遍歷列Cell
            for(int cellNum=0;cellNum<hssfRow.getLastCellNum();cellNum++){
             
            String hssfCell = getCellValue(rowNum,cellNum);
              
           
            log.info("hssfCell的值:======"+hssfCell);
                str2.add(hssfCell);
            }
            
            str1.add(str2);
  }
  return str1;
  
}


public  int getsheetLastRow(){

return sheet.getLastRowNum();

}

public  String getCellValue(int row, int col) {


String value="";
if(sheet==null)return "";
HSSFRow hrow=sheet.getRow(row);
if(hrow==null)return "";
HSSFCell cell=hrow.getCell((short) col);
if(cell==null)
return "";
int type=cell.getCellType();
switch(type)
{
case HSSFCell.CELL_TYPE_NUMERIC: 
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
value = sdf.format(date);
} else {
NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(3);
String newD = formatter.format(
(Double) cell.getNumericCellValue()).toString()
.replace(",", "");
value = newD;
}
break;
case HSSFCell.CELL_TYPE_STRING: value=cell.getStringCellValue();break;
case HSSFCell.CELL_TYPE_FORMULA:value=cell.getStringCellValue();break;
case HSSFCell.CELL_TYPE_BOOLEAN:value=cell.getBooleanCellValue()+"";break;
case HSSFCell.CELL_TYPE_BLANK: value="";break;

default:value="";
}
return value.trim();
}
public int getRows()
{
if(sheet!=null)
return sheet.getPhysicalNumberOfRows();
else
return 0;
}




public String getDateCellValue(int r, short col) {

try{
if(getSheet()==null)
return getCellValue(r,col);
HSSFRow row=getSheet().getRow(r);
if(row==null)
return getCellValue(r,col);
HSSFCell cell=row.getCell(col);
if(cell==null)
return getCellValue(r,col);
Date date=cell.getDateCellValue();
return FormatDate.format("yyyy-MM-dd",date);
}catch(Exception e)
{
e.printStackTrace();
return getCellValue(r,col);
}

}
    public int getFirstRow()
    {
        
        return sheet.getFirstRowNum();
    }
    public int getCols(int row)
    {
        
        return sheet.getRow(row).getPhysicalNumberOfCells();
    }
    
    
}


ReadExcel10Util.java


package com.rapoo.excelToDB;




import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;




import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;




public class ReadExcel10Util {

Log log = LogFactory.getLog(this.getClass());

XSSFSheet xssfSheet;
XSSFWorkbook readbook;




public ReadExcel10Util(String fileurl) throws IOException{

FileInputStream fis= new FileInputStream(fileurl);
readbook= new XSSFWorkbook(fis);
xssfSheet= readbook.getSheetAt(0);

}
/**
* 讀取excel中sheet的數量,sheet中每行每列的值

* @param fileurl
* @return
*/
public List<List<String>> ItemVale(XSSFWorkbook readbook){


log.info("進入ItemVale方法++++++++++++++++++");

List<List<String>> str1 = new ArrayList<List<String>>();    //存入excel中的資料

log.info("xssfWorkbook++++++++++++++++++");

//1.迴圈讀取所有的sheet
tlable :

for (int numSheet = 0; numSheet < readbook.getNumberOfSheets(); numSheet++) 
{
 
log.info("獲取sheet表====="+readbook.getNumberOfSheets());

xssfSheet = readbook.getSheetAt(numSheet);



   if (xssfSheet == null) {
      break tlable;
   }

   log.info("讀取sheet檔案的所有行數======="+xssfSheet.getLastRowNum());
   //2.讀取行元素
   for (int rowNum = 1; rowNum <=xssfSheet.getLastRowNum(); rowNum++) 
   {
   List<String> str2 = new ArrayList<String>();  //每列中存入的資料
   
   XSSFRow xssfRow = xssfSheet.getRow(rowNum);
   
   if (xssfRow == null) {
   break tlable;
   }
   
   for(int sheetcol=0;sheetcol<xssfRow.getLastCellNum();sheetcol++)
   {
   
   
   log.info("讀取每行元素的每列數值======"+xssfRow.getLastCellNum());
   
   XSSFCell cell = xssfRow.getCell(sheetcol);
   
   String val = getCellValue(rowNum,sheetcol);
   
   log.info("每行元素的每列的資料:"+val);
   str2.add(val);
   }
   
   str1.add(str2);
   }
   
}


return str1;

}




/**
* 2010版本Excel

* 獲取cellValue值  判斷每行每列的型別返回String value值 
* @param row
* @param col
* @return
*/
public  String getCellValue(int row, int col) {

String value="";
if(xssfSheet==null)return "";
XSSFRow hrow= xssfSheet.getRow(row);
if(hrow==null)return "";
XSSFCell cell= hrow.getCell(col);
if(cell==null)
return "";
int type= cell.getCellType();
switch(type)
{
case XSSFCell.CELL_TYPE_NUMERIC: 
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
value = sdf.format(date);
} else {
NumberFormat formatter = NumberFormat.getNumberInstance();
formatter.setMaximumFractionDigits(3);
String newD = formatter.format(
(Double) cell.getNumericCellValue()).toString()
.replace(",", "");
value = newD;
}
break;
case XSSFCell.CELL_TYPE_STRING: value=cell.getStringCellValue();break;
case XSSFCell.CELL_TYPE_FORMULA:value=cell.getStringCellValue();break;
case XSSFCell.CELL_TYPE_BOOLEAN:value=cell.getBooleanCellValue()+"";break;
case XSSFCell.CELL_TYPE_BLANK: value="";break;

default:value="";
}
return value.trim();
}








public XSSFSheet getXssfSheet() {
return xssfSheet;
}








public void setXssfSheet(XSSFSheet xssfSheet) {
this.xssfSheet = xssfSheet;
}
public XSSFWorkbook getReadbook() {
return readbook;
}
public void setReadbook(XSSFWorkbook readbook) {
this.readbook = readbook;
}




}




NewMyExcel.java


package com.rapoo.excelToDB;




import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.DiskFileUpload;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;




import weaver.conn.RecordSet;
import weaver.file.FileUploadToPath;
import weaver.general.GCONST;




public class NewMyExcel extends HttpServlet{

Log log = LogFactory.getLog(this.getClass());

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}


@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


log.info("進入NewMyExcelServle方法++++++++++");


   /**
    * 一、先刪除suppliernumber表中的資料,再插入新資料
    * 
    */
   String delExcel = "delete from suppliernumber";
   
   RecordSet recordSet=new RecordSet();
    recordSet.execute(delExcel);
   
   String selExcel = "select * from suppliernumber";
   RecordSet selRecordSet=new RecordSet();
   selRecordSet.execute(selExcel);
   
   if(selRecordSet.next()){
   
   log.info("刪除失敗!------------");
   }else{
   
   log.info("刪除成功!------------");
   }

log.info("進入MyReadExcel中的doPost方法");



/**
* 二、將Excel存入伺服器

*/
String tmpPath = "/app/ecology/tempfile/";   //存Excel檔案的路徑
String dirPath ="";                          //存Excel檔案的路徑地址(包含Excel名字)

//1.建立解析工廠
DiskFileUpload factory = new DiskFileUpload();
 




 
//2.解析
List<FileItem> items = null;
 
try {
items = factory.parseRequest(request);


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


String repName = "";

//3.遍歷

File file1 ;
for(FileItem item : items){

if(item.getFieldName().equals("excelData"))
{
//將檔名加上唯一的標識  保證檔名不重複
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
String primatekey= sdf.format(date);


//獲得欄位名
String name = item.getFieldName();
log.info("欄位名稱=========:"+name);

//獲得檔名
String fileName = item.getName();
log.info("檔名稱=========:"+fileName);

int startSub = fileName.indexOf(".");
repName = fileName.substring(startSub);

log.info("擷取的檔案字尾名字==="+repName);


dirPath = primatekey+repName;


File remoteFile = new File(new String(dirPath.getBytes(),"utf-8"));





//4.將檔案存入相應路徑


log.info("存放新檔案的路徑======"+tmpPath+"檔名:"+dirPath);


file1 = new File(tmpPath, remoteFile.getName());

file1.createNewFile();     //建立新檔案

InputStream ins = item.getInputStream();    //FileItem的內容

OutputStream ous  = new FileOutputStream(file1);

byte[] buffer = new byte[1024];   //位元組快取
int len = 0 ;

while((len = ins.read(buffer)) > -1){

ous.write(buffer, 0, len);

}

ins.close();
ous.close();
}

}


/**

* 三、判斷上傳檔案字尾名,不同版本Excel匯入資料
*
*/

String returnval = "";                 

String Excelurl = tmpPath+dirPath;

if(Common.OFFICE_EXCEL_2010_POSTFIX.equals(repName)){

//1.讀取10版本Excel檔案中的資料
ReadExcel10Util mrs = new ReadExcel10Util(Excelurl);      //始化Excel中的資料內容

XSSFWorkbook readbook = mrs.getReadbook();

List<List<String>>  excelVal = mrs.ItemVale(readbook);





   
   for(int i =0;i<excelVal.size();i++)
   {
   List<String> colStr = excelVal.get(i);
   
   log.info("Excel錶行數:===="+excelVal.size()+"列數:===="+colStr.size());
   
   String _inVal = ""; 
   for(int j =0;j<colStr.size();j++)
   {
   _inVal = _inVal+"'"+colStr.get(j)+"'"+",";
   
   
   }
   
   if(_inVal.length()>0)
   {
   
   String sqlVals = _inVal.substring(0, _inVal.length()-1);
   log.info("插入suppliernumber資料的val值:"+sqlVals);
   
   String sql = "insert into suppliernumber(BH,GYSJC,GYSMC,XXGL,WLLB,SL,FKTJ,FKTJ2)values("+sqlVals+")";
   
   log.info("sql插入資料======="+sql);
   
   RecordSet inseSql=new RecordSet();
   inseSql.execute(sql);
   
   returnval="<div style='position:absolute;top: 50%;left:50%'><font color='red'>資料匯入成功!</font></div>";
   }else{
   
   returnval="<div style='position:absolute;top: 50%;left:50%'><font color='red'>資料匯入失敗!</font></div>";
   }
   }

}
if(Common.OFFICE_EXCEL_2003_POSTFIX.equals(repName))
{


//1.讀取03版本Excel檔案中的資料
ReadExcel03Util mrs = new ReadExcel03Util(Excelurl);      //始化Excel中的資料內容

HSSFSheet hfs = mrs.getSheet();                   //03版本獲取建構函式中的sheet檔案
   
   List<List<String>> strList = mrs.ItermCell(hfs);        //遍歷迴圈sheet檔案中的資料

   
   //2.將資料插入資料庫
   
   for(int i =0;i<strList.size();i++)
   {
   List<String> colStr = strList.get(i);
   
   String _inVal = ""; 
   for(int j =0;j<colStr.size();j++)
   {
   _inVal = _inVal+"'"+colStr.get(j)+"'"+",";
   
   }
   
   if(_inVal.length()>0)
   {
   
   String sqlVals = _inVal.substring(0, _inVal.length()-1);
   log.info("插入suppliernumber資料的val值:"+sqlVals);
   
   String sql = "insert into suppliernumber(BH,GYSJC,GYSMC,XXGL,WLLB,SL,FKTJ,FKTJ2)values("+sqlVals+")";
   
   log.info("sql插入資料======="+sql);
   
   RecordSet inseSql=new RecordSet();
   inseSql.execute(sql);
   
       returnval="<div style='position:absolute;top: 50%;left:50%'><font color='red'>資料匯入成功!</font></div>";
   }else{
   
   returnval="<div style='position:absolute;top: 50%;left:50%'><font color='red'>資料匯入失敗!</font></div>";
   }
   }
   



}  

response.setHeader("content-type", "text/html;charset=GBK");
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
PrintWriter out = null;
try {
out = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
out.print(returnval);
out.flush();
out.close();

}

}




Common.java


package com.rapoo.excelToDB;




public class Common {

public static final String OFFICE_EXCEL_2003_POSTFIX = ".xls";
public static final String OFFICE_EXCEL_2010_POSTFIX = ".xlsx";
 
}