利用poi從excel中匯入資料到資料庫
阿新 • • 發佈:2019-01-24
最近遇到了從excel向資料庫匯入資料的情況,利用POI技術實現資料的匯入:
前臺頁面程式碼如下:
<input type="file" name="" id="file" style="width: 165px"> <button type="button" onclick="improtMessage()" style="width: 48px">匯入</button> <button type="button" onclick="exportMessage()" style="width: 48px">匯出</button> <button type="button" onclick="dowloadMessage()" style="width: 70px">模板下載</button>
前臺js程式碼:
/** * 匯入配置 */ function improtMessage() { $.messager.confirm('提示','確定您要匯入配置?',function(r){ if (r){ var fileName=$('#file').val(); var file=fileName.split(".")[0]; $('#file').attr("name",$('#file').val()); $.ajaxFileUpload({ url: path+'/systemConfigureController/importSysConfig.do', secureuri: false,//非同步 fileElementId: 'file',//上傳控制元件ID dataType: 'text',//返回的資料資訊格式 success: function(data){ $.messager.alert('提示','匯入配置成功!'); if(file == "小區"){ selectVillageMessage(); }if(file == "國家地區碼"){ selectCountryMessage(); }if(file == "位置區"){ selectPositionMessage(); }if(file == "終端資訊"){ selectIMEIMessage(); } } }) } }); }
控制層程式碼如下:
/** * 匯入配置 * @param request * @param response * @throws IOException */ @RequestMapping("importSysConfig") public void importData(HttpServletRequest request, HttpServletResponse response) throws IOException{ logger.info("**********into method importData*************"); // 設定上下文 CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver( request.getSession().getServletContext()); // 檢查form是否有enctype="multipart/form-data" if (multipartResolver.isMultipart(request)) { MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; Iterator<String> iter = multiRequest.getFileNames(); while (iter.hasNext()) { List objList = new ArrayList(); MultipartFile file = multiRequest.getFile(iter.next()); logger.info("print out file: "+file+" fileName: "+file.getName()+" fileSize: "+file.getSize()); version = (file.getName().endsWith(".xls") ? version2003 : version2007); if (version == 2003) { POIFSFileSystem fs = new POIFSFileSystem(file.getInputStream()); HSSFWorkbook wb = new HSSFWorkbook(fs); HSSFSheet sheet = wb.getSheetAt(0); readObject(file.getName(), sheet); logger.info("print out readExcel: " + objList); }else if (version == 2007){ XSSFWorkbook hwk = new XSSFWorkbook(file.getInputStream());// 將is流例項到 一個excel流裡 XSSFSheet sheet = hwk.getSheetAt(0);// 得到book第一個工作薄sheet readObject(file.getName(), sheet); logger.info("print out readExcel: " + objList); } } } response.getWriter().print("1"); } /** * 根據不同的excle表名,呼叫不同的讀取方法 * @param name * @param sheet * @return */ public void readObject(String name, Sheet sheet){ List objList = new ArrayList(); String _name = name.substring(0, name.indexOf(".")); if (_name.equals("國家地區碼")){ objList = readCountryExcel(sheet); systemConfigureService.addCountryMEessage(objList); } else if (_name.equals("位置區")){ objList = readPositionExcel(sheet); systemConfigureService.addPositionMessage(objList); } else if(_name.equals("小區")){ objList = readVillageExcel(sheet); systemConfigureService.addVillageMessage(objList); } else if(_name.equals("終端資訊")){ objList = readIMEIExcel(sheet); systemConfigureService.addIMEIMessage(objList); } }
/**
* 1讀取國家地區碼excel表格
* @param sheet
* @return
*/
public List<Country> readCountryExcel(Sheet sheet){
List<Country> countryList = new ArrayList<Country>();
int rowNum = sheet.getPhysicalNumberOfRows(); //獲得總共的行數
Country country = null;
for (int i =1; i<rowNum; i++){
country = new Country();
Row row = sheet.getRow(i); //得到第i行資料
Cell c = null;
if (null != row){
c = row.getCell(0);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
c.setCellType(c.CELL_TYPE_STRING);
country.setCountry(c.getStringCellValue());
}else{
country.setCountry(c.getStringCellValue());
}
}
c = row.getCell(1);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
c.setCellType(c.CELL_TYPE_STRING);
country.setProvince(c.getStringCellValue());
}else {
country.setProvince(c.getStringCellValue());
}
}
c = row.getCell(2);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
c.setCellType(c.CELL_TYPE_STRING);
country.setZone(c.getStringCellValue());
}else {
country.setZone(c.getStringCellValue());
}
}
c = row.getCell(3);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
c.setCellType(c.CELL_TYPE_STRING);
country.setCode(c.getStringCellValue());
}else {
country.setCode(c.getStringCellValue());
}
}
}
countryList.add(country);
logger.info("print out read Excel row" + i + "Country: " + country);
}
return countryList;
}
/**
* 2.讀取位置區excel表格
* @param sheet
* @return
*/
public List<Position> readPositionExcel(Sheet sheet){
List<Position> positionList = new ArrayList<Position>();
int rowNum = sheet.getPhysicalNumberOfRows(); //獲得總共的行數
Position position = null;
for (int i =1; i<rowNum; i++){
position = new Position();
Row row = sheet.getRow(i); //得到第i行資料
Cell c = null;
if (null != row){
c = row.getCell(0);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
c.setCellType(c.CELL_TYPE_STRING);
position.setArea(c.getStringCellValue());
}else {
position.setArea(c.getStringCellValue());
}
}
c = row.getCell(1);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
c.setCellType(c.CELL_TYPE_STRING);
position.setPosition_code(c.getStringCellValue());
}else {
position.setPosition_code(c.getStringCellValue());
}
}
c = row.getCell(2);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC) {
c.setCellType(c.CELL_TYPE_STRING);
position.setPosition_name(c.getStringCellValue());
}else {
position.setPosition_name(c.getStringCellValue());
}
}
}
positionList.add(position);
logger.info("print out read Excel row" + i + "position: " + position);
}
return positionList;
}
/**
* 3.讀取小區excel表格
* @param sheet
* @return
*/
public List<Village> readVillageExcel(Sheet sheet){
StringBuffer sss=null;
List<Village> villageList = new ArrayList<Village>();
int rowNum = sheet.getPhysicalNumberOfRows(); //獲得總共的行數
for(int i = 1; i<rowNum; i++){
Row row = sheet.getRow(i); //得到第i行資料
int cols = row.getLastCellNum(); // 該行的總列數
String[] str = new String[cols]; // 用來存放該行每一列的值
for (int j = 0; j < cols; j++) {
Object col = row.getCell((short)j);
if (null != col){
str[j] = col.toString();
}else{
str[j] = "";
}
}
Village v = new Village(str);
logger.info("print out read String[] str" + "str: " + Arrays.toString(str));
villageList.add(v);
}
return villageList;
}
/**
* 4.讀取終端資訊excel表格
* @param sheet
* @return
*/
public List<IMEI> readIMEIExcel(Sheet sheet){
List<IMEI> IMEIList = new ArrayList<IMEI>();
int rowNum = sheet.getPhysicalNumberOfRows(); //獲得總共的行數
IMEI _imei = null;
for (int i =1; i<rowNum; i++){
_imei = new IMEI();
Row row = sheet.getRow(i); //得到第i行資料
Cell c = null;
if (null != row){
c = row.getCell(0);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC){
c.setCellType(c.CELL_TYPE_STRING);
_imei.setIMEI(c.getStringCellValue());
}else{
_imei.setIMEI(c.getStringCellValue());
}
}
c = row.getCell(1);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC){
c.setCellType(c.CELL_TYPE_STRING);
_imei.setImei_version(c.getStringCellValue());
}else{
_imei.setImei_version(c.getStringCellValue());
}
}
c = row.getCell(2);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC){
c.setCellType(c.CELL_TYPE_STRING);
_imei.setImei_name(c.getStringCellValue());
}else{
_imei.setImei_name(c.getStringCellValue());
}
}
c = row.getCell(3);
if (null != c){
if (c.getCellType() == c.CELL_TYPE_NUMERIC){
c.setCellType(c.CELL_TYPE_STRING);
_imei.setImei_factory_name(c.getStringCellValue());
}else{
_imei.setImei_factory_name(c.getStringCellValue());
}
}
}
IMEIList.add(_imei);
logger.info("print out read Excel row" + i + "_imei: " + _imei);
}
return IMEIList;
}
}
servicedao的程式碼:
public void addCountryMEessage(List<Country> list);
public void addIMEIMessage(List<IMEI> list);
public void addPositionMessage(List<Position> list);
public void addVillageMessage(List<Village> list);
servicedaoimpl的程式碼:
@Override
public void addCountryMEessage(List<Country> list) {
countryDao.addCountryMessage(list);
}
@Override
public void addIMEIMessage(List<IMEI> list) {
imeiDao.addIMEIMessage(list);
}
@Override
public void addPositionMessage(List<Position> list) {
positionDao.addPositionMessage(list);
}
@Override
public void addVillageMessage(List<Village> list) {
villageDao.addVillageMessage(list);
}
xml中sql的程式碼如下:
<!-- 向資料庫imei中插入資料 -->
<insert id="addIMEIMessage" parameterType="java.util.List">
insert into imei
(IMEI, imei_version, imei_name, imei_factory_name)
values
<foreach collection="list" item="item" index="index" separator="," >
(#{item.IMEI}, #{item.imei_version}, #{item.imei_name}, #{item.imei_factory_name})
</foreach>
</insert>