excel中数据写入mysql_批量导入数据(excel表格)写入数据库

批量导入数据库思想之一:页面上传excel表格后台解析excel表格的数据暂放数据结构中(list或Map,自己看情况处理),再把list里面的数据批量存入数据库。直接贴代码:

前端:

文件描述:

请选择文件:

controller中:

// 上传文件会自动绑定到MultipartFile中

@RequestMapping(value="/upload",method=RequestMethod.POST)

public String upload(HttpServletRequest request,

@RequestParam("description") String description,

@RequestParam("file") MultipartFile file) throws Exception{

System.out.println(description);

// 如果文件不为空,写入上传路径

if(!file.isEmpty()){

// 上传文件路径

String path = request.getServletContext().getRealPath(

"/images/");

// 上传文件名

String filename = file.getOriginalFilename();

File filepath = new File(path,filename);

// 判断路径是否存在,如果不存在就创建一个

if (!filepath.getParentFile().exists()) {

filepath.getParentFile().mkdirs();

}

// 将上传文件保存到一个目标文件当中

file.transferTo(new File(path+File.separator+ filename));

//解析excel表格的数据

List excelPdList = (List)ObjectExcelRead.readExcel(path, filename, 2, 1, 0, "#.####");

for(PageData ca:excelPdList){

System.out.println(StringUtils.trimToEmpty(ca.getString("var1")));

System.out.println(StringUtils.trimToEmpty(ca.getString("var2")));

System.out.println(StringUtils.trimToEmpty(ca.getString("var3")));

}

return "success";

}else{

return "error";

}

}

解析数据的方法如下:

public class ObjectExcelRead {

protected static Logger logger = Logger.getLogger(ObjectExcelRead.class);

/**

*

* @param filepath 文件路径

* @param filename 文件名

* @param startrow 开始行号 从0开始

* @param startcol 开始列号 从0开始

* @param sheetnum sheet

* @param format double型小数据点保留位数,如: #.##

* @return

*/

public static List readExcel(String filepath, String filename, int startrow, int startcol, int sheetnum, String format) throws Exception {

List varList = new ArrayList();

try {

HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(filepath, filename)));

HSSFSheet sheet = workbook.getSheetAt(sheetnum); //sheet 从0开始

int rowNum = sheet.getLastRowNum() + 1; //取得最后一行的行号

for (int i = startrow; i < rowNum; i++) { //行循环开始

PageData varpd = new PageData();

HSSFRow row = sheet.getRow(i); //行

if(row==null) break; //中间如果有空行,则退出

int cellNum = row.getLastCellNum(); //每行的最后一个单元格位置

for (int j = startcol; j < cellNum; j++) { //列循环开始

HSSFCell cell = row.getCell(Short.parseShort(j + ""));

String cellValue = getCellValue(cell, format);

varpd.put("var"+j, cellValue);

}

varList.add(varpd);

}

workbook.close();

} catch (Exception e) {

logger.error("解析Excel文件出错", e);

throw e;

}

return varList;

}

public static String getCellValue(HSSFCell cell, String format) {

if(cell==null)

return "";

String cellValue="";

switch(cell.getCellType()){

case HSSFCell.CELL_TYPE_NUMERIC : //数值类型

case HSSFCell.CELL_TYPE_FORMULA://公式

if (HSSFDateUtil.isCellDateFormatted(cell)) { // 判断是日期类型

SimpleDateFormat dateformat = new SimpleDateFormat("yyyy/MM/dd");

Date dt = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());// 获取成DATE类型

cellValue = dateformat.format(dt);

}else{

//非日期格式

Long longVal = Math.round(cell.getNumericCellValue());

Double doubleVal = cell.getNumericCellValue();

if(Double.parseDouble(longVal + ".0") == doubleVal){ //判断是否含有小数位.0

cellValue=String.valueOf(longVal);

}

else{

DecimalFormat df = new DecimalFormat(format); //格式化为N位小数

cellValue=df.format(doubleVal); //返回String类型

}

}

break;

case HSSFCell.CELL_TYPE_BOOLEAN:

cellValue = String.valueOf(cell.getBooleanCellValue());

break;

case HSSFCell.CELL_TYPE_STRING:

cellValue = String.valueOf(cell.getStringCellValue());

break;

case HSSFCell.CELL_TYPE_ERROR:

cellValue = String.valueOf(cell.getErrorCellValue());

break;

//case HSSFCell.CELL_TYPE_FORMULA:

// cellValue = String.valueOf(cell.getNumericCellValue()); //如果是日期,取到的是个数值,改为和CELL_TYPE_NUMERIC一起处理

//cellValue = String.valueOf(cell.getCellFormula()); //取到的是个公式,不是具体值

// break;

case HSSFCell.CELL_TYPE_BLANK:

cellValue = "";

break;

}

return cellValue;

}

}

运行后直接在控制台上看效果:

a36840bbf7ed8fc599ef088983f3f7a5.png

d6c7bc414a788c690ab0cd91f6e33d36.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值