1、表格导入方法

(1)首先jsp文件中加入对应的HTML样式,并调用对应js中的方法

 <em class="separ"></em><a class="txt-all" onclick="pageObj.import()"><i class="iconfont icon-up"></i>导入</a><em class="separ"></em><a class="txt-all" onclick="ExcelUtil.export('${pageTitle}.xls', pageObj.getDataGrid())"><i class="iconfont icon-down"></i>导出</a><em class="separ"></em>//这是设置点击导入按钮弹出的弹框的表单和对应方法<div class="invisible"><iframe id="importIframe" name="importIframe"></iframe><form id="importForm" target="importIframe" method="post" enctype="multipart/form-data"action="${staticContextPath}/import/importExcel.json"><input type="file" name="importFile" id="importFile"onchange="window.pageObj.importForm()" accept=".xls,.xlsx"/><input type="hidden" name="type" value="publishLicense"/><input type="hidden" name="pageObj" value="pageObj"/><input type="hidden" name="dataGridMethod" value="getDataGrid"/></form></div>

(2)js文件中代码段

getDataGrid: function () {var $grid = $("#grid");if (!$grid[0].grid) {$grid.jqGrid({url: App["contextPath"] + "/bs/publishLicense/getPublishLicensePage.json",ajaxGridOptions: {contentType: "application/json"},autoWidthPadding: 25,autoHeightPadding: 90,shrinkToFit: true,//自适应都挤在一块multiselect: false,multiboxonly: false,enabledLoad: false,pager: "#pager",colModel: [{name: "id",label: "主键",hidden: true},{name: "operate", label: "操作", width: 80, align: 'center',formatter: function (cellContent, options, rowData) {var html = '';html += "<a class='mr5' οnclick='pageObj.edit(\"" + rowData.id + "\")'>编辑</a>";html += "<a class='mr5' οnclick='pageObj.delete(this, \"" + rowData.id + "\")'>删除</a>";return html;}},{name:'name', label:'出版公司名称',align:'center'},{name: 'publishLicense', label:'经营许可证',align:'center'},{name:'phone', label:'手机号码', align:'center'}]});}return $grid;},import: function () {var fileObj = document.getElementById('importFile');fileObj.value = ''; // 每次先将file值设置为空值fileObj.click();},importForm: function () {document.getElementById('importForm').submit();$('body').block({message: '<h1>正在导入,请稍候...</h1>',css: {width: '',left: '40%',border: 'none',padding: '15px',backgroundColor: '#000','-webkit-border-radius': '10px','-moz-border-radius': '10px',opacity: .5,color: '#fff'},overlayCSS: {backgroundColor: '#000', opacity: 0.4}});},});

第二步注意的几点:1、getDataGrid方法中

var $grid = $("#grid");pager: "#pager",

两个属性的绿色的值要与jsp中的值对应

2、import和importForm 方法中绿色的值和jsp中相应字段值对应

import: function () {var fileObj = document.getElementById('importFile');importForm: function () {document.getElementById('importForm').submit();

这次用AbstractImportHandler抽象类先封装导入方法和获取excel表格中行列值的方法

public abstract class AbstractImportHandler {protected Logger logger = LoggerFactory.getLogger(getClass());/*** 导入** @param sheet 工作簿* @param user  user* @return 错误消息*/public abstract String doHandler(Sheet sheet, UserVOExt user);protected String getCell(Row row, int colIdx, String errMsg) {return Optional.ofNullable(getCellValue(row.getCell(colIdx))).orElseThrow(() -> new BusinessException(errMsg));}protected String getCellValue(Cell cell) {String cellValue = null;if (cell != null){if (CellType.STRING == cell.getCellTypeEnum()) {cellValue = cell.getStringCellValue();}
//            else (CellType.NUMERIC == cell.getCellTypeEnum()){
//                cellValue = cell.getNumericCellValue();
//            }}return cellValue;}}

在具体实现类中重写doHandler方法

@Component
@ImportHandler(type = "publishLicense")
public class PublishLicenseImportHandler extends AbstractImportHandler {/*** 书店索引值*/private final static Integer  STORE_NAME = 0;/*** 出版物经营许可证索引值*/private final static Integer  PLNUM_INDEX = 1;/*** 手机号索引值*/private final static Integer  PHONE_INDEX = 2;@Autowiredprivate IPublishLicenseService publishLicenseService;@Overridepublic String doHandler(Sheet sheet, UserVOExt user) {// 校验数据,存储数据,报错信息//Set<String> corpSet = new HashSet<>(); Set<String> cdrSet = new HashSet<>();List<String> plNumList = new ArrayList<>();List<String> phoneList = new ArrayList<>();List<PublishLicenseVOExt> records = new ArrayList<>();String errorMessage = "";//0行是标题 从第一行开始for (int i = 1; i <= sheet.getLastRowNum(); i++) {try{Row row = sheet.getRow(i);String storeName = getCell(row, STORE_NAME, "书店名称不能为空");String publishLicense = getCell(row, PLNUM_INDEX, "出版物经营许可证不能为空");String phone = convertCellValueToString(row.getCell(PHONE_INDEX),row);PublishLicenseVOExt voExt = new PublishLicenseVOExt();voExt.setName(storeName);voExt.setPublishLicense(publishLicense);voExt.setPhone(phone);publishLicenseService.checkPublishLicense(publishLicense, phone);records.add(voExt);}catch (BusinessException e){e.printStackTrace();errorMessage = String.format("导入失败!第%d行: %s", i+1, e.getMessage());break;}}publishLicenseService.saveImport(records);return errorMessage;}private String convertCellValueToString(Cell cell, Row row) {return new DecimalFormat("#").format(cell.getNumericCellValue());}}

特别说明该类 @ImportHandler(type = “publishLicense”)注解中type的值要与jsp文件中相应属性的值一定要一样,因为这里属于映射关系

(3)编写导入功能的接口

@Controller
@RequestMapping("/import")
public class ImportController extends BaseController {private final static String IMPORTS_PACKAGE_PATH = "com.jiujie.book.application.web.imports";/*** Excel载入公共入口** @param file     导入文件* @param request  请求参数* @param response 响应参数* @throws IOException 异常*/@RequestMapping(value = "/importExcel.json", method = RequestMethod.POST)public void importExcel(@RequestParam("importFile") MultipartFile file, HttpServletRequest request,HttpServletResponse response) throws IOException {String type = request.getParameter("type");String pageObj = request.getParameter("pageObj");String dataGridMethod = request.getParameter("dataGridMethod");PrintWriter out = response.getWriter();if (!file.isEmpty()) {try {POIFSFileSystem fs = new POIFSFileSystem(file.getInputStream());HSSFWorkbook wb = new HSSFWorkbook(fs);Sheet sheet = wb.getSheetAt(0);String errorMessage = importRoute(type, sheet);if ("".equals(errorMessage)) {out.println("<script>parent.TipsUtil.info('载入成功!');parent." + pageObj + "." + dataGridMethod + "().jqGrid('reloadGrid');parent.$('body').unblock();</script>");} else {out.println("<script>parent.TipsUtil.error('" + errorMessage + "');parent.$('body').unblock();</script>");}} catch (Exception e) {logger.error(e.getMessage(), e);if (StringUtils.isNotEmpty(e.getMessage()) && e.getMessage().contains("Your file appears not to be a valid OLE2 document")) {out.println("<script>parent.TipsUtil.error('请使用标准导入模板来导入数据!');</script>");} else if (StringUtils.isNotEmpty(e.getMessage()) && e.getMessage().contains("The supplied data appears to be in the Office 2007+ XML")) {out.println("<script>parent.TipsUtil.error('请使用下载的模版添加数据进行导入!');</script>");} else {out.println("<script>parent.TipsUtil.error('导入的模板有误,请校验是否满足以下要求:<br/>" +"'1、填写的单元格中不得包含计算公式;<br/>'+\n" +"'2、导入的模板不能删除或添加列;<br/>'+\n" +"'3、需要下拉选择的信息,只能是模板中的选择项。');</script>");}} finally {out.close();}}}/*** 导入处理类路由,通过模板类型映射到对应的处理类** @param type  模板类型* @param sheet 导入文件Excel* @return 错误消息* @throws ClassNotFoundException 类未找到*/private String importRoute(String type, Sheet sheet) throws ClassNotFoundException {AbstractImportHandler bean = (AbstractImportHandler) SpringContextUtil.getBean(getImportHandlerClass(type));return bean.doHandler(sheet, getCurrentUser());}/*** 遍历imports目录下,先匹配注解ImportHandler type的值* 如果没有再匹配类名,如:ImportClazzHandler** @param type 导入文件类型* @return 类* @throws ClassNotFoundException 类未找到*/private Class<?> getImportHandlerClass(String type) throws ClassNotFoundException {ConfigurationBuilder builder = new ConfigurationBuilder();builder.setUrls(ClasspathHelper.forPackage(IMPORTS_PACKAGE_PATH));builder.filterInputsBy(new FilterBuilder().include(IMPORTS_PACKAGE_PATH + ".*.class"));Set<Class<?>> classList = new Reflections(builder).getTypesAnnotatedWith(ImportHandler.class);for (Class<?> clazz : classList) {ImportHandler importHandler = clazz.getAnnotation(ImportHandler.class);if (importHandler.type().equals(type)) {return clazz;}}String className = "Import" + StringUtils.capitalize(type) + "Handler";return Class.forName(IMPORTS_PACKAGE_PATH + "." + className);}}

通过流来读取文件,在调用importRoute方法,遍历文件的行列数据,第三个方法是用来确定上传文件和对应handler映射关系

excel表格导入功能相关推荐

  1. 使用 EPPlus 封装的 excel 表格导入功能 (.net core c#)

    使用 EPPlus 封装的 excel 表格导入功能 购物优惠券 https://www.cqfenfa.com/ 前言 最近做系统的时候有很多 excel导入 的功能,以前我前后端都做的时候是在前端 ...

  2. 基于vue 实现 excel导出导入功能

    第一步下包 excel导入导出功能需要我们下载哪些包? 在vue-element-admin中有着详细的文档查看: Excel 导出 Excel 的导入导出都是依赖于js-xlsx来实现的. 在 js ...

  3. Java EXCEL 表格导入导出(带下拉选-带VLOOKUP函数封装)

    Java EXCEL 表格导入导出(带下拉选-带VLOOKUP函数封装) 对于excel Java POI 使用 目前简单导出导入功能网上很多,但是对于有下拉选,样式等缺点却是最大硬伤,故此封装一个通 ...

  4. 如何从Excel表格导入数据批量生成二维码

    目前二维码应用渐趋广泛,二维码具有储存量大.保密性高.追踪性高.抗损性强.备援性大.成本便宜等特性,这些特性特别适用于表单.安全保密.追踪.证照.存货盘点.资料备援等方面.那么我们怎么用条码打印软件从 ...

  5. 纯前端实现excel表格导入导出

    前言 github: https://github.com/stardew516... 以往做excel表格下载功能的时候,都是后端生成好表格后,存储在某个地方,然后给前端一个链接,前端使用a标签加d ...

  6. iview upload组件手动控制上传,excel表格导入

    iview upload组件手动控制上传,这里我只需要将文件的file传给后端用来做excel表格的导入,所以用不到upload-success回调,也用不到action (iview 有提供exce ...

  7. word导入mysql表格,如何将excel表格导入mysql数据库【excel表格导入word太大】

    如何在excel表格中读取sql数据库数据 excel程序自带的外部功能,可以连接sql服.具体步骤为: 1.选择[数据]选项卡,在[获取外部数据]分组,找到[自其他来源]. 2.单击[自其他来源]按 ...

  8. 关于怎么把Excel表格导入MySQL数据库中

    关于怎么把Excel表格导入MySQL数据库中 第一步:建造Excel表格并且编辑数据. 1.我们要建立一个Excel表格文件 2.编辑我们需要的数据 3.保存到你知道的位置 第二步:在MySQL中建 ...

  9. 把EXCEL表格导入到MYSQL中_将EXCEL表格中的数据导入mysql数据库表中(两种方法)...

    今天项目上遇到需要将excel中的数据导入到数据库的classify表中,于是乎拼命上网查阅方法,发现以下两种方法比较可行: 在此之前先说说按照网上的说法我没有试验成功的方法,将excel文件xls保 ...

最新文章

  1. 全球及中国抗菌溶液行业深度调研与前景研究建议报告2022年
  2. elasticsearch快照和恢复
  3. java的静态变量怎么赋值_java static变量可以赋值吗?
  4. ssl1104-USACO 2.1城堡(foodfill)【图论,广搜】
  5. 选择排序java从小到大代码_java中选择排序与归并排序的内容,详细解析
  6. 这又是什么新玩法?华为Mate 30 Pro真机谍照现身:音量键大变样
  7. 为了搞懂什么是区块链,我都快抑郁了(转)
  8. Java配置分离之Spring远程配置
  9. java writer 乱码_Java servlet 使用 PrintWriter 时的编码与乱码
  10. CC2530之OLED12864程序详解
  11. 蓝桥杯 算法提高 盾神与条状项链
  12. 一不小心成了中国电力行业最大的无人机供应商,但曹飞的理想是推动整个产业变革
  13. 两难选择:继续工作还是考研
  14. MFC中CImage类显示的半透明PNG存在的问题以及处理方法
  15. 更改谷歌浏览器的安装位置(此方法同样适用于把安在C盘的东西移到其它盘)
  16. Linux硬盘管理:分区、GParted分区操作
  17. 【观察】“互联网+政务服务”提速,迈入数字政府新阶段
  18. 【老生谈算法】matlab实现高通滤波器源码——高通滤波器
  19. 7-2 然后是几点 (15 分)有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分。现在,你的程序要根据起始时间和流逝的时间计算出终止时间。读入两个数字,第一个数字以这样
  20. 【转】MFC 迅雷七窗体特效,使用DWM实现Aero Glass效果

热门文章

  1. CSS解决无空格太长的字母,数字不会自动换行的问题
  2. 整合重组叠加市场扩容 “广电云”发展将提速
  3. ryzen linux 搭配显卡,AMD锐龙Ryzen5 2600X配什么显卡好?锐龙R5-2600X最佳显卡搭配知识...
  4. 【javascript】js检验注册密码强度效果
  5. 寻找不到iframe元素
  6. 【云图】如何制作全国×××查询系统?
  7. 开源框架_Index
  8. linux开启权限继承,linux的一个权限问题(权限继承)
  9. java二分查找范围区间_二分查找(Java实现)
  10. 公布几个流氓软件分析报告——哇哇资讯精灵