excel导入与导出(markdown版本)
来源:互联网 发布:图灵机原理 知乎 编辑:程序博客网 时间:2024/06/05 23:07
前段时间要做一个excel表格的上传下载功能,上网找了各种资料及源码,最后借用别人的代码及思路完成了符合自己需求的代码,总结一下excel的上传下载实质是通过第三方的类库比如poi,jxl等对excel单元格的设置与读写,通过类库的api,你可以发现各种各样的操作excel的方法,基本上只要你能在office的excel上进行的基本操作通过代码都能实现。
上传文件:
首先新建一个工具类,我命名为ImportExcelUtil,代码如下:
public class ImportExcelUtil { private final static String excel2003L =".xls"; //2003- 版本的excel private final static String excel2007U =".xlsx"; //2007+ 版本的excel /** * 描述:获取IO流中的数据,组装成List<List<Object>>对象 * @param in,fileName * @return * @throws IOException */ public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{ List<List<Object>> list = null; //创建Excel工作薄 Workbook work = this.getWorkbook(in,fileName); if(null == work){ throw new Exception("创建Excel工作薄为空!"); } Sheet sheet = null; Row row = null; Cell cell = null; list = new ArrayList<List<Object>>(); //遍历Excel中所有的sheet int s=work.getNumberOfSheets(); for (int i = 0; i < work.getNumberOfSheets(); i++) { sheet = work.getSheetAt(i); if(sheet==null){continue;} int s2=sheet.getLastRowNum(); //遍历当前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 y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) { cell = row.getCell(y); li.add(this.getCellValue(cell)); } list.add(li); } } work.close(); return list; } /** * 描述:根据文件后缀,自适应上传文件的版本 * @param inStr,fileName * @return * @throws Exception */ public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{ Workbook wb = null; String fileType = fileName.substring(fileName.lastIndexOf(".")); if(excel2003L.equals(fileType)){ wb = new HSSFWorkbook(inStr); //2003- }else if(excel2007U.equals(fileType)){ wb = new XSSFWorkbook(inStr); //2007+ }else{ throw new Exception("解析的文件格式有误!"); } return wb; } /** * 描述:对表格中数值进行格式化 * @param cell * @return */ public Object getCellValue(Cell cell){ Object value = null; DecimalFormat df = new DecimalFormat("0"); //格式化number String字符 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; } }
这个工具类是支持2003和2007的,excel2003和2007所用到的包是不一样的,所以如何你的工程师maven构建的话需要在pom.xml上引入下面两个包:
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency>
工具类写好以后,接下来就可以在具体业务逻辑实现方法里调用了,我这边有个上传的controller
public class UploadExcelControl { @Autowired DetailInfoVoService detailInfoVoService; /** * 描述:通过传统方式form表单提交方式导入excel文件 * @param request * @throws Exception */ @RequestMapping(value="upload.do",method={RequestMethod.GET,RequestMethod.POST}) public String uploadExcel(HttpServletRequest request) throws Exception { MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; System.out.println("通过传统方式form表单提交方式导入excel文件!"); InputStream in =null; List<List<Object>> listob = null; MultipartFile file = multipartRequest.getFile("upfile"); if(file.isEmpty()){ throw new Exception("文件不存在!"); } in = file.getInputStream(); listob = new ImportExcelUtil().getBankListByExcel(in,file.getOriginalFilename()); in.close(); //因为要导入的excel比较特殊,不是常规的一行类别,其他行都是数据,所以我需要根据具体模板来读取excel for (int i = 0; i < listob.size(); i+=11) { DetailInfoVo vo = new DetailInfoVo(); vo.setSiteId(String .valueOf(listob.get(i).get(1))); vo.setSiteName(String.valueOf(listob.get(i).get(3))); vo.setSitePhone(String.valueOf(listob.get(i).get(5))); vo.setSiteAddress(String.valueOf(listob.get(i+1).get(1))); vo.setIsOpened(String.valueOf(listob.get(i+1).get(5))); vo.setSiteClass(String.valueOf(listob.get(i+2).get(1)).split(",")[0]); vo.setSiteScale(String.valueOf(listob.get(i+2).get(1)).split(",")[1]); vo.setSiteDetail(String.valueOf(listob.get(i+3).get(0))); vo.setIsPartnership(String.valueOf(listob.get(i+4).get(1))); vo.setReason(String.valueOf(listob.get(i+5).get(0))); vo.setBossName(String.valueOf(listob.get(i+7).get(1))); vo.setBossAge(String.valueOf(listob.get(i+7).get(3))); vo.setBossJiguan(String.valueOf(listob.get(i+7).get(5))); vo.setBossYear(String.valueOf(listob.get(i+8).get(1))); vo.setBossPeople(String.valueOf(listob.get(i+8).get(3))); vo.setOthers(String.valueOf(listob.get(i+9).get(1))); vo.setEventLog(String.valueOf(listob.get(i+10).get(0))); int resultCode=detailInfoVoService.insert(vo); if(resultCode!=0){ System.out.println("======="); } } return "result"; } }
前台使用的是form表单提交的方式,首先在jsp页面定义一个form,action指向对应的controller
<form class="form-inline clearfix " method="POST" enctype="multipart/form-data" id="form1" action="../uploadExcel/upload.do"> <div class="row"> <div class="form-group col-xs-12"> <label class="fl">上传文件: </label> <input type="file" class="form-control" id="upfile" name="upfile"> </div> </div> </form>
上传的内容就介绍完了,相比上传,下载更加容易。
导出excel:
新建一个工具类ExportExcelUtil:
public class ExportExcelUtil { /** * 描述:根据文件路径获取项目中的文件 * @param fileDir 文件路径 * @return * @throws Exception */ public File getExcelDemoFile(String fileDir) throws Exception{ String classDir = null; String fileBaseDir = null; File file = null; classDir = Thread.currentThread().getContextClassLoader().getResource("/").getPath(); fileBaseDir = classDir.substring(0, classDir.lastIndexOf("classes")); file = new File(fileBaseDir+fileDir); if(!file.exists()){ throw new Exception("模板文件不存在!"); } return file; } public Workbook writeNewExcel(File file,String sheetName,List<DetailInfoVo> lis) throws Exception{ Workbook wb = null; Row row = null; Cell cell = null; FileInputStream fis = new FileInputStream(file); wb = new ImportExcelUtil().getWorkbook(fis, file.getName()); //获取工作薄 Sheet sheet = wb.getSheet(sheetName); //循环插入数据 int lastRow = sheet.getLastRowNum()+1; //插入数据的数据ROW CellStyle cs = setSimpleCellStyle(wb); //Excel单元格样式 for (int i = 0; i < lis.size(); i++) { row = sheet.createRow(lastRow+i); //创建新的ROW,用于数据插入 //按项目实际需求,在该处将对象数据插入到Excel中 DetailInfoVo vo = lis.get(i); if(null==vo){ break; } //Cell赋值开始 cell = row.createCell(0); cell.setCellValue(vo.getSiteId()); cell.setCellStyle(cs); cell = row.createCell(1); cell.setCellValue(vo.getSiteName()); cell.setCellStyle(cs); cell = row.createCell(2); cell.setCellValue(vo.getSiteAddress()); cell.setCellStyle(cs); cell = row.createCell(3); cell.setCellValue(vo.getSiteClass()); cell.setCellStyle(cs); cell = row.createCell(4); cell.setCellValue(vo.getSiteScale()); cell.setCellStyle(cs); cell = row.createCell(5); cell.setCellValue(vo.getIsPartnership()); cell.setCellStyle(cs); cell = row.createCell(6); cell.setCellValue(vo.getSitePhone()); cell.setCellStyle(cs); cell = row.createCell(7); cell.setCellValue(vo.getIsOpened()); cell.setCellStyle(cs); } return wb; } /** * 描述:设置简单的Cell样式 * @return */ public CellStyle setSimpleCellStyle(Workbook wb){ CellStyle cs = wb.createCellStyle(); cs.setBorderBottom(CellStyle.BORDER_THIN); //下边框 cs.setBorderLeft(CellStyle.BORDER_THIN);//左边框 cs.setBorderTop(CellStyle.BORDER_THIN);//上边框 cs.setBorderRight(CellStyle.BORDER_THIN);//右边框 cs.setAlignment(CellStyle.ALIGN_CENTER); // 居中 return cs; } }
具体的实现类如下
public class ExportExcelControl { @Autowired DetailInfoVoService detailInfoVoService; /** * 描述:导出Excel * @param request * @param response * @throws Exception */ @RequestMapping(value="export.do",method={RequestMethod.GET,RequestMethod.POST}) public String exportExcel(HttpServletRequest request,HttpServletResponse response) throws Exception { OutputStream os = null; Workbook wb = null; //工作薄 List<DetailInfoVo> list=detailInfoVoService.findList(); try { List<DetailInfoVo> lo = new ArrayList<DetailInfoVo>(); for (int i = 0; i < list.size(); i++) { //根据具体需求向excel即将导出的vo模型填充数据 DetailInfoVo vo = new DetailInfoVo(); vo.setSiteId(list.get(i).getSiteId()); vo.setSiteName(list.get(i).getSiteName()); vo.setSiteAddress(list.get(i).getSiteAddress()); vo.setSiteClass(list.get(i).getSiteClass()); vo.setSiteScale(list.get(i).getSiteScale()); vo.setIsPartnership(list.get(i).getIsPartnership()); vo.setSitePhone(list.get(i).getSitePhone()); vo.setIsOpened(list.get(i).getIsOpened()); lo.add(vo); } //导出Excel文件数据 ExportExcelUtil util = new ExportExcelUtil(); File file =util.getExcelDemoFile("/ExcelDemoFile/模板.xlsx"); String sheetName="sheet1"; wb = util.writeNewExcel(file, sheetName,lo); String fileName="导出信息.xlsx"; response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename="+ URLEncoder.encode(fileName, "utf-8")); os = response.getOutputStream(); wb.write(os); } catch (Exception e) { e.printStackTrace(); } finally{ os.flush(); os.close(); wb.close(); } return null; } }
更详细的代码我就不贴了,主要是上传下载这个思路大家要理清,原理搞清楚了啥都会搞了,比如加特技,通过poi提供的api让你的excel更加炫酷。
0 0
- excel导入与导出(markdown版本)
- Excel格式导入导出数据(单语言版本)
- 简单Excel导出与导入
- SQL与Excel导入导出
- excel的导出与导入
- excel的导入与导出
- Excel的导入与导出
- c#数据与Excel交互(导入与导出)
- InputOutput(Excel导入导出)
- Excel 与 SQL 数据库互相导入导出
- Excel文件的导出与导入
- excel 与 sql 之间的导入导出
- excel 文件与数据库文件导入导出
- SQL 与 Excel 之间导入导出数据
- GridView与Excel数据导入导出
- C#实现Excel的导入与导出
- 传统 excel 导入 与 导出代码
- EXCEL文件的导入与导出
- http协议:模拟浏览器、服务器
- 爬虫编码解决1
- 第八周-OJ-B分数序列求和
- Java四种线程池的使用
- 第八周课后练习——换分币
- excel导入与导出(markdown版本)
- linux网络编程之socket(三):最简单的回射客户/服务器程序、time_wait 状态
- linux下安装spss
- 数据结构-栈--结构体实现
- CONFIG_DEBUG_USER
- poj 2084 Game of Connections
- linux下打开windows编码过的txt文件
- 销毁一个Activity
- Maven项目自动部署到tomcat