批量导入数据库思想之一:页面上传excel表格后台解析excel表格的数据暂放数据结构中(list或Map,自己看情况处理),再把list里面的数据批量存入数据库。直接贴代码:
前端:<form action="upload" enctype="multipart/form-data" method="post">
文件描述: | <input type="text" name="description"> |
请选择文件: | <input type="file" name="file" > |
<input type="submit" value="上传"> |
</form>
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<PageData> 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<Object> readExcel(String filepath, String filename, int startrow, int startcol, int sheetnum, String format) throws Exception {
List<Object> varList = new ArrayList<Object>();
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;
}
}
运行后直接在控制台上看效果:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。