版权声明:本文为博主原创文章,转载请注明原帖地址,谢谢 https://blog.csdn.net/AooMiao/article/details/81780627
接在上次文章说的excel的下载,这次说明excel的导入,既然是导入肯定要涉及到文件的上传,下面代码的环境是spingMVC环境,若需使用下面代码,请配置spring环境
1.maven中导入依赖包
<dependency><!-- excel2003 -->
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.8</version>5
</dependency>
<dependency><!-- excel2007以上 -->
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.8</version>
</dependency>
2.代码
@RequestMapping("doImport")
public String doImport(@RequestParam("files[]") MultipartFile file, HttpServletRequest request, HttpServletResponse response)
throws Exception {
_Log.info("处理上传的文件--开始");
byte[] bytes = file.getBytes();
String uploadPath = request.getSession().getServletContext().getRealPath("/upload/");//获取保存文件路径,绝对路径例如:d/tomcat/demo/upload/...
_Log.info(uploadPath);
Path path = Paths.get(uploadPath + file.getOriginalFilename());
path = Files.write(path, bytes);//写入文件二进制数据
_Log.info("处理上传的文件--结束");
//这里的文件上传处理明显过于简单,因为这边文章重点是excel的导入,详细的文件上传处理大家可以等待下篇文章
/**
* 注意这里应该判断文件的扩展名来判断是xls(2003)或xlxs(2007以上)
* 因为xls和xlxs用的poi的api都不一样
* xls:HSSFWorkbook
* xlxs:XSSFworkbook
* 由于下载模板(看开头)我选用了xls,这里我就不判断了
*/
List<List<Object>> list = ImportExcelUtil.read2003Excel(path.toFile(), false, 3, "");//封装excel的内容返回list列表
//接下来就是导入的逻辑代码
list = deleteAllEmptyElement(list);//清空导入列表的空白行,节省遍历时间
for (List<Object> objectList : list) {
Object[] rows = objectList.toArray();
_Log.info(rows[0].toString());//字段1
_Log.info(rows[1].toString());//字段2
_Log.info(rows[2].toString());//字段3
}
return "/excel/import";
}
上面代码中比较重要的就是ImportExcelUtil.read2003Excel(path.toFile(), false, 3, “”);这句,这里接受一个file参数,经过处理就可以把excel数据封装成list列表返回,直接上代码
/**
* 读取Office 2003 excel
* @param file excel文件
* @param lastcellnum 读取列数(excel的列数)
* @param sheetName 指定工作表的名称
* @return
* @throws IOException
*/
public static List<List<Object>> read2003Excel(File file,boolean isReadColumn,int lastcellnum,String sheetName)
throws IOException {
List<List<Object>> list = new ArrayList<List<Object>>();
HSSFWorkbook hwb = new HSSFWorkbook(new FileInputStream(file));
HSSFSheet sheet = null;
if (null != sheetName && sheetName.length() > 0) {
sheet = hwb.getSheet(sheetName);// 获取指定工作表的excel内容
} else {
sheet = hwb.getSheetAt(0);// 默认获取第一个工作表
}
if (null != sheet) {
Object value = null;
HSSFRow row = null;
HSSFCell cell = null;
for (int i = 1; i <= sheet.getPhysicalNumberOfRows(); i++) {//从一行遍历到物理行数(包括空行)
row = sheet.getRow(i);
if (row == null) {//行为空,跳过
continue;
}
List<Object> linked = new ArrayList<Object>();//记录行的内容
for (int j = row.getFirstCellNum(); j < lastcellnum; j++) {//该行第一个单元格遍历到列数,简单来说就是行的内容遍历
cell = row.getCell(j);//取出当前单元格
if (cell == null) {
linked.add("");
continue;
}
DecimalFormat df = new DecimalFormat("0");// 格式化 number
// String
// 字符
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串
DecimalFormat nf = new DecimalFormat("#");// 格式化数字
DecimalFormat mf = new DecimalFormat("######0.00");// 保留两位小数
switch (cell.getCellType()) {//判断当前单元格的格式,对value进行适当的类型转换
case XSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if ("@".equals(cell.getCellStyle().getDataFormatString())) {
value = df.format(cell.getNumericCellValue());
} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
value = nf.format(cell.getNumericCellValue());
} else if ("0.00_ ".equals(cell.getCellStyle().getDataFormatString())) {
value = mf.format(cell.getNumericCellValue());
} else if ("#,##0.00".equals(cell.getCellStyle().getDataFormatString())) {
value = mf.format(cell.getNumericCellValue());
} else {
value = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue();
break;
case XSSFCell.CELL_TYPE_BLANK:
value = "";
break;
default:
value = cell.toString();
}
linked.add(value);
}
list.add(linked);
}
}
return list;
}