poi批量导入导出Excel(二、不需要建数据库表一键实现导入导出功能)

本项目基于SSM框架,简单封装了Excel批量导入导出功能,不用建数据库表一键导入导出Excel,不过这样只适用于对导入的Excel表进行转换。上一篇介绍了建表导入导出Excel(点击跳转)
一、下载poi jar包:
    点这里下载:poi 3.8/3.9/3.10三个版本下载
                        poi 3.17最新版本下载
二、基本操作步骤:   
首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(页/表)(HSSFSheet)组成,一个sheet是由多个row(行)(HSSFRow)组成,一个row是由多个cell(单元格)(HSSFCell)组成。
1、用HSSFWorkbook打开或者创建“Excel文件对象”
2、用HSSFWorkbook对象返回或者创建Sheet对象
3、用Sheet对象返回行对象,用行对象得到Cell对象
4、对Cell对象读写。

三、封装Excel工具类ImportExcelUtil

public class ImportExcelUtil {
	
	private final static String Excel_2003 = ".xls"; //2003 版本的excel
	private final static String Excel_2007 = ".xlsx"; //2007 版本的excel
	
	/**
	 * @param in
	 * @param fileName
	 * @param columNum 自定义列数
	 * @return
	 * */
	public List> getBankListByExcel(InputStream in,String fileName) throws Exception{
		List> list = null;
		
		//创建Excel工作簿
		Workbook work = this.getWorkbook(in, fileName);
		if(work == null) {
			throw new Exception("创建Excel工作簿为空!");
		}
		Sheet sheet = null;
		Row row = null;
		Cell cell = null;
		list = new ArrayList>();
		//遍历Excel中的所有sheet
		for(int i = 0; i li = new ArrayList();
						//int totalColum = row.getLastCellNum();
						for(int y = row.getFirstCellNum(); y 
  

四、控制层Controller

解决:MultipartFile文件或者图片上传一直为null问题

     /**
     * 导出销售订单数据
     * @param myFile
     * @param respon
     * @return
     * @throws IOException
     */
    @RequestMapping(value = "export", method=RequestMethod.POST)
    public ModelAndView exportFile(@RequestParam(value="file",required=false)MultipartFile myFile,HttpServletResponse response,HttpServletRequest request)throws IOException {
    	ModelAndView mv = this.getModelAndView();
    	try {
    		ImportExcelUtil util = new ImportExcelUtil();
    		InputStream input = null;
    		List> lists = null;
    		if (myFile.isEmpty()) {
    			logBefore(logger, "导入文件为空,请先添加Excel文件!");
    		} else {
    			String fileName = myFile.getOriginalFilename();
    			input = myFile.getInputStream();
    			lists = util.getBankListByExcel(input, fileName);
    			input.close();
    			//导出用SXSSFWorkbook
    			SXSSFWorkbook workbook = new SXSSFWorkbook(10000);
    			CellStyle style = workbook.createCellStyle();
    			style.setAlignment(XSSFCellStyle.ALIGN_CENTER);//SXSSFWorkbook方式的居中
    			// 创建一个sheet页
    			SXSSFSheet sheet = (SXSSFSheet) workbook.createSheet("销售订单");
    			// 创建标题
    			SXSSFRow headRow = (SXSSFRow) sheet.createRow(0);
    			headRow.createCell(0).setCellValue("单据日期");
    			headRow.createCell(1).setCellValue("单据编号");
    			headRow.createCell(2).setCellValue("客户编码");
    			headRow.createCell(3).setCellValue("客户");
    			headRow.createCell(4).setCellValue("结算客户编码");
    			headRow.createCell(5).setCellValue("结算客户");
    			headRow.createCell(6).setCellValue("部门编码");
    			headRow.createCell(7).setCellValue("部门");
    			headRow.createCell(8).setCellValue("业务员编码");
    			headRow.createCell(9).setCellValue("业务员");
    			headRow.createCell(10).setCellValue("币种代码");
    			headRow.createCell(11).setCellValue("币种");
    			headRow.createCell(12).setCellValue("汇率");
    			headRow.createCell(13).setCellValue("运输方式");
    			headRow.createCell(14).setCellValue("送货地址");
    			headRow.createCell(15).setCellValue("联系人");
    			headRow.createCell(16).setCellValue("联系电话");
    			headRow.createCell(17).setCellValue("客户手机号");
    			headRow.createCell(18).setCellValue("合同号");
    			headRow.createCell(19).setCellValue("收款方式");
    			headRow.createCell(20).setCellValue("外部单据号");
    			headRow.createCell(21).setCellValue("按仓库拆单出库");	
    			headRow.createCell(22).setCellValue("国际单号");
    			headRow.createCell(23).setCellValue("内部单号");
    			headRow.createCell(24).setCellValue("备注");
    			headRow.createCell(25).setCellValue("仓库编码");
    			headRow.createCell(26).setCellValue("仓库");
    			headRow.createCell(27).setCellValue("项目编码");
    			headRow.createCell(28).setCellValue("项目");
    			headRow.createCell(29).setCellValue("存货编码");
    			headRow.createCell(30).setCellValue("存货名称");
    			headRow.createCell(31).setCellValue("销售单位");
    			headRow.createCell(32).setCellValue("数量");
    			headRow.createCell(33).setCellValue("报价");
    			headRow.createCell(34).setCellValue("折扣%");
    			headRow.createCell(35).setCellValue("税率%");
    			headRow.createCell(36).setCellValue("含税单价");
    			headRow.createCell(37).setCellValue("含税金额");
    			headRow.createCell(38).setCellValue("预计交货日期");
    			headRow.createCell(39).setCellValue("赠品");
    			headRow.createCell(40).setCellValue("备注");
    			headRow.createCell(41).setCellValue("国家");
    			headRow.createCell(42).setCellValue("货代");
    			headRow.createCell(43).setCellValue("客户单号");
    			// 循环将excel中的数据存入库
    			for (int i = 1; i < lists.size(); i++) {
    				List list = lists.get(i);
    				SXSSFRow dataRow = (SXSSFRow) sheet.createRow(sheet.getLastRowNum() + 1);
    				dataRow.createCell(0).setCellValue(util.getFormat(String.valueOf(list.get(0))));//单据日期
    				dataRow.createCell(1).setCellValue(util.getFormat(String.valueOf(list.get(1))));//单据编号(内部单号)
    				dataRow.createCell(2).setCellValue(util.getFormat(String.valueOf(list.get(21))));//往来单位编码(客户编码)(结算客户编码)
    				dataRow.createCell(3).setCellValue("");//客户
    				dataRow.createCell(4).setCellValue(util.getFormat(String.valueOf(list.get(21))));//结算客户编码
    				dataRow.createCell(5).setCellValue("");//结算客户
    				dataRow.createCell(6).setCellValue(util.getFormat(String.valueOf(list.get(23))));//部门编码
    				dataRow.createCell(7).setCellValue("");//部门
    				dataRow.createCell(8).setCellValue(util.getFormat(String.valueOf(list.get(19))));//业务员编码
    				dataRow.createCell(9).setCellValue(util.getFormat(String.valueOf(list.get(20))));//业务员
    				dataRow.createCell(10).setCellValue(util.getFormat(String.valueOf(list.get(12))));//币种代码
    				dataRow.createCell(11).setCellValue("");//币种
    				dataRow.createCell(12).setCellValue(util.getFormat(String.valueOf(list.get(13))));//汇率
    				dataRow.createCell(13).setCellValue("");//运输方式
    				dataRow.createCell(14).setCellValue("");//送货地址
    				dataRow.createCell(15).setCellValue("");//联系人
    				dataRow.createCell(16).setCellValue("");//联系电话
    				dataRow.createCell(17).setCellValue("");//客户手机号
    				dataRow.createCell(18).setCellValue("");//合同号
    				dataRow.createCell(19).setCellValue("其它");//收款方式
    				dataRow.createCell(20).setCellValue("");//外部单据号
    				dataRow.createCell(21).setCellValue("");//按仓库拆单出库
    				dataRow.createCell(22).setCellValue("");//国际单号
    				dataRow.createCell(23).setCellValue(util.getFormat(String.valueOf(list.get(4))));//内部单号
    				dataRow.createCell(24).setCellValue(util.getFormat(String.valueOf(list.get(6))));//备注
    				dataRow.createCell(25).setCellValue(util.getFormat(String.valueOf(list.get(24))));//仓库编码
    				dataRow.createCell(26).setCellValue("");//仓库
    				dataRow.createCell(27).setCellValue("");//项目编码
    				dataRow.createCell(28).setCellValue("");//项目
    				dataRow.createCell(29).setCellValue(util.getFormat(String.valueOf(list.get(8))));//存货编码
    				dataRow.createCell(30).setCellValue("");//存货名称
    				dataRow.createCell(31).setCellValue("个");//销售单位
    				dataRow.createCell(32).setCellValue(util.getFormat(String.valueOf(list.get(9))));//数量
    				dataRow.createCell(33).setCellValue("");//报价
    				dataRow.createCell(34).setCellValue("");//折扣%
    				dataRow.createCell(35).setCellValue("0");//税率%
    				dataRow.createCell(36).setCellValue(util.getFormat(String.valueOf(list.get(10))));//含税单价
    				dataRow.createCell(37).setCellValue(util.getFormat(String.valueOf(list.get(11))));//含税金额
    				dataRow.createCell(38).setCellValue("");//预计交货日期
    				dataRow.createCell(39).setCellValue("");//赠品
    				dataRow.createCell(40).setCellValue("");//备注
    				dataRow.createCell(41).setCellValue(util.getFormat(String.valueOf(list.get(15))));//国家
    				dataRow.createCell(42).setCellValue(util.getFormat(String.valueOf(list.get(17))));//货代?国际
    				dataRow.createCell(43).setCellValue(util.getFormat(String.valueOf(list.get(5))));//客户单号
    			}
    			
    			// 设置Excel文件名,并以中文进行编码
    			String codedFileName = new String("销售订单".getBytes("gbk"), "iso-8859-1");
    			response.setHeader("Content-Disposition", "attachment;filename=" + codedFileName + DateUtil.getDays() +".xlsx");
    			// 响应类型,编码
    			response.setContentType("application/octet-stream;charset=UTF-8");
    			// 形成输出流
    			OutputStream osOut = response.getOutputStream();
    			// 将指定的字节写入此输出流
    			workbook.write(osOut);
    			// 刷新此输出流并强制将所有缓冲的输出字节被写出
    			osOut.flush();
    			// 关闭流
    			osOut.close();
    			/*
    			 * dispose of temporary files backing this workbook on disk
    			 * 处理在磁盘上备份此工作簿的临时文件 SXSSF分配临时文件,您必须始终清除显式,通过调用dispose方法
    			 */
    			workbook.dispose();
    		}
    		
    	} catch (Exception e) {
    		e.printStackTrace();
    		System.out.println("异常信息: " + e.getMessage() );
    		//发送错误到前台页面
    		mv.addObject("msg","error");
    		mv.setViewName("purchasing/orderExcel/orderExcelList");
    		return mv;
    	}
    	mv.addObject("msg","success");
		return mv;
    } 
  

 

五、jsp页面

 

选择Excel:

  

 

 

 

你可能感兴趣的:(POI)