本项目基于SSM框架,简单封装了Excel批量导入导出功能,不用建数据库表一键导入导出Excel,不过这样只适用于对导入的Excel表进行转换,通过模板导出Excel并且能实现导入多个sheet表。上一篇介绍了建表导入导出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文件,格式样式表头标题编辑好,放入到项目中,下面是我的路径。

WEB-INF/jsp/purchasing/orderExcel/Excel.xls

三、控制层Controller按照模板导出Excel

解决: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<List<Object>> lists = null;if (myFile.isEmpty()) {logBefore(logger, "导入文件为空,请先添加Excel文件!");} else {String fileName = myFile.getOriginalFilename();input = myFile.getInputStream();//实现多sheet页批量导入Excel读取数据存入listslists = util.getBankListByExcel(input, fileName);input.close();//引入导出Excel路径File fi = new File(request.getSession().getServletContext().getRealPath("/") + "WEB-INF/jsp/purchasing/orderExcel/Excel.xls");POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(fi));//读取excel模板HSSFWorkbook wb = new HSSFWorkbook(fs);//读取了模板内所有sheet内容HSSFSheet sheet = wb.getSheetAt(0);//如果这行没有了,整个公式都不会有自动计算的效果的sheet.setForceFormulaRecalculation(true);// 循环将excel中的数据存入库for (int i = 1; i < lists.size(); i++) {List<Object> list = lists.get(i);HSSFRow dataRow = sheet.createRow((int) i + 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(19))));//往来单位编码(客户编码)(结算客户编码)dataRow.createCell(3).setCellValue("");//客户dataRow.createCell(4).setCellValue(util.getFormat(String.valueOf(list.get(19))));//结算客户编码dataRow.createCell(5).setCellValue("");//结算客户dataRow.createCell(6).setCellValue(util.getFormat(String.valueOf(list.get(21))));//部门编码dataRow.createCell(7).setCellValue("");//部门dataRow.createCell(8).setCellValue(util.getFormat(String.valueOf(list.get(17))));//业务员编码dataRow.createCell(9).setCellValue(util.getFormat(String.valueOf(list.get(18))));//业务员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(22))));//汇率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(23))));//仓库编码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(util.getFormat(String.valueOf(list.get(13))));//国家dataRow.createCell(39).setCellValue(util.getFormat(String.valueOf(list.get(15))));//货代?国际dataRow.createCell(40).setCellValue(util.getFormat(String.valueOf(list.get(5))));//客户单号dataRow.createCell(41).setCellValue("");//预计交货日期dataRow.createCell(42).setCellValue("");//赠品dataRow.createCell(43).setCellValue("");//备注}// 设置Excel文件名,并以中文进行编码String codedFileName = new String("销售订单".getBytes("gbk"), "iso-8859-1");response.setHeader("Content-Disposition", "attachment;filename=" + codedFileName + DateUtil.sdfDaym() +".xlsx");// 响应类型,编码response.setContentType("application/octet-stream;charset=UTF-8");// 形成输出流OutputStream osOut = response.getOutputStream();// 将指定的字节写入此输出流wb.write(osOut);// 刷新此输出流并强制将所有缓冲的输出字节被写出osOut.flush();// 关闭流osOut.close();}} 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;}

四、封装Excel工具类ImportExcelUtil实现导入多个sheet表

导入多个sheet表-->如果就一个sheet那么就读取所有行,如果有多个sheet就在第二页开始跳过标题行只读取数据,不然会出现标题重复。

package com.fh.util;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ImportExcelUtil {private final static String Excel_2003 = ".xls"; //2003 版本的excelprivate final static String Excel_2007 = ".xlsx"; //2007 版本的excelpublic List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{List<List<Object>> 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<List<Object>>();//遍历Excel中的所有sheetfor(int i = 0; i<work.getNumberOfSheets(); i++) {//如果Excel就一页一个sheet则i=0if(i==0){sheet = work.getSheetAt(i);if(sheet == null) {continue;}//遍历当前sheet中的所有行//int totalRow = sheet.getPhysicalNumberOfRows();//如果excel有格式,这种方式取值不准确int totalRow = sheet.getPhysicalNumberOfRows();for(int j = sheet.getFirstRowNum(); j<totalRow; j++) {row = sheet.getRow(j);if(!isRowEmpty(row)) {//if(row != null && !"".equals(row)) {//获取第一个单元格的数据是否存在Cell fristCell=row.getCell(0);if(fristCell!=null){//遍历所有的列List<Object> li = new ArrayList<Object>();//int totalColum = row.getLastCellNum();for(int y = row.getFirstCellNum(); y<row.getLastCellNum(); y++) {cell = row.getCell(y);if(cell == null){String callCal ="";li.add(callCal);}else{String callCal = this.getCellValue(cell)+"";li.add(callCal);}}list.add(li);}}else if(isRowEmpty(row)){continue;}}}else{//如果是第二页sheet要从第二行遍历数据去掉标题行即i>0sheet = work.getSheetAt(i);if(sheet == null) {continue;}//遍历当前sheet中的所有行int totalRow = sheet.getPhysicalNumberOfRows();//j从第二行读取数据即j=1跳过标题行for(int j = 1; j<totalRow; j++) {row = sheet.getRow(j);if(!isRowEmpty(row)) {//if(row != null && !"".equals(row)) {//获取第一个单元格的数据是否存在Cell fristCell=row.getCell(0);if(fristCell!=null){//遍历所有的列List<Object> li = new ArrayList<Object>();//int totalColum = row.getLastCellNum();for(int y = row.getFirstCellNum(); y<row.getLastCellNum(); y++) {cell = row.getCell(y);if(cell == null){String callCal ="";li.add(callCal);}else{String callCal = this.getCellValue(cell)+"";li.add(callCal);}}list.add(li);}}else if(isRowEmpty(row)){continue;}}}}in.close();return list;}/*** 判断行是否为空* @param row* @return*/public static boolean isRowEmpty(Row row) {for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {Cell cell = row.getCell(c);if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK)return false;}return true;}/*** 描述:根据文件后缀,自动适应上传文件的版本* @param inStr,fileName* @return* @throws Exception* */public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception {Workbook work = null;String fileType = fileName.substring(fileName.lastIndexOf("."));if(Excel_2003.equals(fileType)){work=new HSSFWorkbook(inStr);//2003 版本的excel}else if(Excel_2007.equals(fileType)) {work=new XSSFWorkbook(inStr);//2007 版本的excel}else {throw new Exception("解析文件格式有误!");}return work;}/*** 描述:对表格中数值进行格式化* @param cell* @return* */public Object getCellValue(Cell cell) {String result = new String();  switch (cell.getCellType()) {  case HSSFCell.CELL_TYPE_FORMULA:  //Excel公式try {  result = String.valueOf(cell.getNumericCellValue());  } catch (IllegalStateException e) {  result = String.valueOf(cell.getRichStringCellValue());}  break;case HSSFCell.CELL_TYPE_NUMERIC:// 数字类型  if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式  SimpleDateFormat sdf;  if (cell.getCellStyle().getDataFormat() == HSSFDataFormat  .getBuiltinFormat("h:mm")) {  sdf = new SimpleDateFormat("HH:mm");  } else {// 日期  sdf = new SimpleDateFormat("yyyy-MM-dd");  }  Date date = cell.getDateCellValue();  result = sdf.format(date);  } else if (cell.getCellStyle().getDataFormat() == 58) {  //如果导出格式是yyyy/MM/dd那么如下//SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); //如果导出格式是例如:9月10日那么如下SimpleDateFormat sdf = new SimpleDateFormat("M月d日");  double value = cell.getNumericCellValue();  Date date = org.apache.poi.ss.usermodel.DateUtil  .getJavaDate(value);  result = sdf.format(date);  } else {  double value = cell.getNumericCellValue();  CellStyle style = cell.getCellStyle();  DecimalFormat format = new DecimalFormat();  String temp = style.getDataFormatString();  // 单元格设置成常规  if (temp.equals("General")) {  format.applyPattern("#.##");  }  result = format.format(value);  }  break;  case HSSFCell.CELL_TYPE_STRING:// String类型  result = cell.getRichStringCellValue().toString();  break;  case HSSFCell.CELL_TYPE_BLANK:  result = "";  default:  result = "";  break;  }  return result;  }public String getFormat(String str) {if(str.equals("null")) {str="";return str;}else{return str;}    }public Integer getFormats(Integer str) {if(str==null) {str=0;return str;}else{return str;}  }/*** 获取字符串中的数字订单号、数字金额等,如从"USD 374.69"中获取到374.69、从“交易单号:66666666666”获取到66666666666* @param receiptAmountString* @return*/public static String getFormatNumber(String str){str = str.trim();Pattern p = Pattern.compile("[0-9]");int indexNum = 0;int lenght = str.length();String num = "";for(int i=0;i<lenght;i++){num += str.charAt(i);Matcher m = p.matcher(num);if(m.find()){indexNum = i;break;}}String formatNumber = str.substring(indexNum,lenght);return formatNumber;}
}

五、jsp页面

<form action="orderExcel/export.do" name="Form" id="Form" method="post" enctype="multipart/form-data"><table id="table_report" class="table table-striped table-bordered table-hover"><tr><td style="width:70px;text-align: right;padding-top: 13px;">选择Excel:</td><td><input id="uploadFile" name="file" type="file" style="width:330px" onchange="fileType(this)"/><br/><br/>  </td></tr><tr><td style="text-align: center;" colspan="10"><input id="btnImportSubmit" class="btn btn-small btn-success" type="submit" value="Excel转换"/></td></tr></table>
</form>
<script type="text/javascript">var msg = '${msg}';if(msg == 'error'){alert("导出文件失败!请检查Excel文件!")}$(top.hangge());//检索function search(){top.jzts();$("#Form").submit();}//过滤类型function fileType(obj){var fileType=obj.value.substr(obj.value.lastIndexOf(".")).toLowerCase();//获得文件后缀名if(fileType != '.xls' && fileType != '.xlsx'){$("#uploadFile").tips({side:3,msg:'请选择正确的Excel文件',bg:'#AE81FF',time:3});$("#uploadFile").val('');}}
</script>

poi批量导入导出Excel(三、通过模板导出Excel并能实现导入多个sheet表)相关推荐

  1. ftl模板导出excel_使用freemark模板生成excel

    1.背景 文件操作中导入导出功能在项目中十分常见,这里我们要聊的是导出excel这一功能.老话题常谈常新,小编给大家介绍使用freemark模板的方式导出excel. 2.实现 Demo中采用spri ...

  2. java word导出表格_Java Word模板导出包含表格单元格合并

    java通过freemarker导出word循环合并表格单元格 本文主要讲解通过freemarker模板引擎来导出word,并且在word中包含表格的合并部分需要循环生成. 一.Java需要通过模板导 ...

  3. c# excel导出png_c#根据html模板导出excel

    ExcelHelper封装 public class ExcelHelper{ /// /// 根据html模板文件生成excel文件 /// /// 数据源 /// html模板文件路径(虚拟路径而 ...

  4. java pdf 导出下载_Java+PDF模板导出成pdf文件,并下载

    1,根据前人经验,熟悉完成基础操作:https://www.cnblogs.com/wangpeng00700/p/8418594.html?tdsourcetag=s_pcqq_aiomsg 2,根 ...

  5. C#基于Npoi通过特性的方式导出简单数据到Excel或基于特性以及基于Excel模板导出数据到Excel以及从Excel中把数据导入到对象中

    导出数据到Excel表格以及从Excel表格中读取数据是我们日常开发很多情况都会遇到的,这里或许只是导出一些简单的数据到excel,这里或许会按照一定的模板导出数据到excel,这里也可能需要从Exc ...

  6. Excel模板导出之导出教材订购表

    说明 本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出. 要点 本教程使用Magicodes.IE.Excel来完成Excel模板导出 需要通过创建Dto来 ...

  7. Magicodes.IE之Excel模板导出教材订购表

    说明 本教程主要说明如果使用Magicodes.IE.Excel完成教材订购表的Excel模板导出. 要点 本教程使用Magicodes.IE.Excel来完成Excel模板导出 需要通过创建Dto来 ...

  8. Java 根据模板导出PDF

    文章目录 前言 思路一:直接导出pdf 使用itext模板导出pdf 思路二:先导出word再转成pdf 1)导出word 2)word转pdf 最终方案 ~~docx4j~~ spire.doc.f ...

  9. Freemarker 模板导出(带图片)

    1. 依赖 <!--FreeMarker--><dependency><groupId>org.freemarker</groupId><arti ...

  10. 佩奇的数据分析学习之excel(三)

    佩奇的数据分析学习之excel(三) 文章目录 佩奇的数据分析学习之excel(三) 前言 一.excel是什么? 二.什么是周报 三.周报的制作 前言 文章内容来源于博主对B站UP主:"戴 ...

最新文章

  1. Audio Streamer
  2. llist对象两个属性相乘在相加_Java8使用stream实现list中对象属性的合并(去重并求和)...
  3. 怎么用php制作会员注册表单,帝国CMS前台会员登陆表单的制作教程
  4. C代码生成图片:BMP、PNG和JPEG
  5. 找出1000以内的所有完数。
  6. 北京内推 | ​美团搜索与NLP部招聘自然语言处理算法实习生
  7. oracle中sp怎么写_校招简历中的实习和项目经历该怎么写?
  8. python调用ctypes中windll中的方法超时处理_python中使用ctypes调用MinGW生成的动态链接库(dll)...
  9. 【Python-2.7】if-elif-else
  10. HDU2156 分数矩阵【数学计算+水题】
  11. Style transfer系列论文之——Image Style Transfer Using Convolutional Neural Networks,CVPR, 2016
  12. 基于Linux的防火墙不安全
  13. UCOSIII实时操作系统
  14. 计算机黑板报主题ps,Photoshop︱用PS创建一个黑板报
  15. c语言实现 三角函数,小型嵌入式系统的三角函数C实现
  16. 发票管理小工具(三):PDFMiner vs pdfminer3k vs Pdfminer.six
  17. 怎样计算计算机的硬盘大小,硬盘容量大小计算的办法
  18. Coding and Paper Letter(八十五)
  19. gwt php,java – 启动GWT项目的PHP程序员的任何好技巧?
  20. 计算机自动关机启机唤醒设置,电脑设置自动关机和自动开机

热门文章

  1. python文字教学_【纯文本教程】大学专科的Python基础开发课?p=17
  2. Python 让多图排版更加美观
  3. python中if none什么意思_关于python:“ if x”和“ if x not None”之间的区别
  4. 普通话测试第四题评分标准_普通话等级考试内容及评分标准
  5. 如何做一个2D 横版过关类游戏
  6. 完美国际服务器维护中,《完美国际2》3月31日全服更新维护公告
  7. Axure 8授权码
  8. 2k14无法打开因为计算机,NBA2K14虚拟光驱SCSI无法开启攻略_NBA2K14提示安装SPTD_快吧单机游戏...
  9. 阶段二第一部分:第2章 Nginx进阶与实战
  10. react-native打包失败: Expiring daemon because jvm heap space is exhausted