导入Excel:首先需要一个小小工具类,当然如果为了测试的话直接参考导入部分即可,下面上代码
提示:如果你的表格中后面的列有空值可能会导致poi读取出的最终列数和你表格中实际的列数不一致,例:你的表格中共有五列数据但是最后一列全部没有数据,当执行到---判断共有多少列:if(row==null||row.getFirstCellNum()==j){ continue;}---时poi可能会只读取出四列,然后会报错数组越界异常,这里小编的一个解决办法是:在表格最后一列的后面再添一列,全部赋一个值,这样poi就会读正确读取出表格中所有的列(这是小编自己想出来的笨方法,哈哈,具体解决办法在网上没有找到,如果有哪位知道如何用代码解决这个问题的话请评论在下方,小编想学习学习~感激不尽)
public class ExcelUtils {
//先创建两个变量,为下面判断上传文件格式做准备
private final static String excel2003 = ".xls";
private final static String excel2007 = ".xlxs";
//获取IO流中的数据,组装成List<List<Object>>对象
public List<List<Object>> getExcel(InputStream in, String fileName) throws Exception{
List<List<Object>> list = null;
//创建Excel工作薄
Workbook wb = this.getWorkbook(in, fileName);
if(wb == null){
throw new Exception("创建Excel工作薄为空!");
}
Sheet sheet = null;
Row row = null;
Cell cell = null;
list = new ArrayList<List<Object>>();
//遍历Excel中所有的sheet
for (int i = 0; i < wb.getNumberOfSheets(); i++) {
sheet = wb.getSheetAt(i);
if(sheet == null){
continue;
}
//遍历当前sheet中的所有行
for (int j = sheet.getFirstRowNum(); j <=sheet.getLastRowNum(); j++) {
row = sheet.getRow(j);
if(row==null||row.getFirstCellNum()==j){
continue;
}
//遍历所有的列
List<Object> li = new ArrayList<Object>();
for (int k = row.getFirstCellNum(); k <row.getLastCellNum(); k++) {
cell = row.getCell(k);
if(cell==null || cell.getCellType() == Cell.CELL_TYPE_BLANK){
//此处有坑,如果你的表格中有空单元格,poi读取的结果是null,会导致程序报错,自主为其定义个值
li.add("");
continue;
}
li.add(this.getCellValue(cell));
}
list.add(li);
}
}
return list;
}
//根据文件后缀判断上传文件版本
public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{
Workbook wb = null;
String fileType = fileName.substring(fileName.lastIndexOf("."));
if(excel2003.equals(fileType)){
wb = new HSSFWorkbook(inStr);
}else if(excel2007.equals(fileType)){
wb = new HSSFWorkbook(inStr);
}else{
throw new Exception("解析的文件格式有误!");
}
return wb;
}
//对表格中数据进行格式化
public Object getCellValue(Cell cell){
Object value = null;
DecimalFormat df = new DecimalFormat("0");
SimpleDateFormat sdf = new SimpleDateFormat("yyy-MM-dd");
DecimalFormat df2 = new DecimalFormat("0.00");
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
value = cell.getRichStringCellValue().getString();
break;
case Cell.CELL_TYPE_NUMERIC:
if("General".equals(cell.getCellStyle().getDataFormatString())){
value = df.format(cell.getNumericCellValue());
}else if("m/d/yy".equals(cell.getCellStyle().getDataFormatString())){
value = sdf.format(cell.getDateCellValue());
}else{
value = df2.format(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_BOOLEAN:
value = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_BLANK:
value = "";
break;
default:
break;
}
return value;
}
}
前台代码就不写了,可以用form表单上传也可以用ajax上传,下面直接写controller代码
@RequestMapping("importExcel")
@ResponseBody
LaiuiUploadResult importHaha(@RequestParam("file") MultipartFile file, HttpServletRequest request) throws Exception {
if(file.isEmpty()){
return new LaiuiUploadResult(1, "error");
}
InputStream in = file.getInputStream();
List<List<Object>> list = new ExcelUtils().getExcel(in, file.getOriginalFilename());
in.close();
for (int i = 0; i < list .size(); i++) {
List<Object> newList = list .get(i);
Haha haha = new Haha();
//此处将解析出来的数据set到你要保存的对象中,调用保存方法
haha.setUserName(String.valueOf(newList.get(0)).trim());
haha.setPassWord(String.valueOf(newList.get(1)).trim());
Haha info = hahaService.save(haha);
}
return new LaiuiUploadResult(0, "ok");
}
这里面的LaiuiUploadResult是事先已经封装好的一个实体类,用来返回信息
public class LaiuiUploadResult {
public LaiuiUploadResult(int code, String msg){
this.code = code;
this.msg = msg;
}
private int code;
private String msg;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
导入数据完成,下面是导出数据到Excel~
导出Excel:下面上代码
public void exportExcel(HttpServletRequest request, String condition){
//先查询要导出到表中的实体类
List<Haha> list = hahaService.selectByCondition(condition);
//创建webbook对象,对应Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
//在webbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet("哈哈");
//在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short
HSSFRow row = sheet.createRow(0);
row.createCell(0).setCellValue("column1");
row.createCell(1).setCellValue("column2");
row.createCell(2).setCellValue("column3");
row.createCell(3).setCellValue("column4");
//循环向表格中插入数据
for(int i = 0;i < list.size();i++){
row = sheet.createRow(i + 1);
row.createCell(0).setCellValue(list.get(i).getcolumn1());
row.createCell(1).setCellValue(list.get(i).getcolumn2());
row.createCell(2).setCellValue(list.get(i).getcolumn3());
row.createCell(3).setCellValue(list.get(i).getcolumn4());
}
try {
//得到桌面路径,直接放到桌面上了
File desktopDir = FileSystemView.getFileSystemView().getHomeDirectory();
String desktopPath = desktopDir.getAbsolutePath();
String desktopDirPath = desktopPath.replace("\\","\\\\");
String filePath = desktopDirPath + "\\\\haha.xls";"
File file = new File(filePath);
if(file.exists()){
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStream fos = new FileOutputStream(file);
if(fos != null){
wb.write(fos);
fos.flush();
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}