Excel檔案上傳伺服器並解析存入資料庫的整套過程(2003--2013都可試)
阿新 • • 發佈:2019-01-30
執行環境搭建:
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";
}