java中.xlsx或者.xls格式的Excel导入(servlet中处理的)

2023-11-15

1、第一步:在pom.xml文件中添加maven依赖

<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.9</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.9</version>
</dependency>

2、第二步:前端代码

<script type="text/javascript" src="js/bootstrap-modal.js"></script>
<script type="text/javascript" src="/scripts/jQuery/jquery-1.7.2.min.js"></script>
<script type="text/javascript" src="/scripts/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
<script type="text/javascript" src="js/ajaxfileupload.js"></script>
<input type="button" id="btn_import" class="btncol" data-toggle="modal" data-target="#myModal" value="黑名单导入"/>
<!--点击按钮弹出模态框-->
<div id="myModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <a class="close" data-dismiss="modal">×</a>
                <h5 class="modal-title f24" id="mySmallModalLabel">请选择要导入的黑名单</h5>
            </div>
            <div class="modal-body">
                <input type="file" name="fileName" id="fileName" class="form-control"/>
            </div>
            <div class="modal-footer" style="text-align: center">
                <input type="button" id="btn_import_q" class="btncol" value="确定导入"/>
                <input type="button" class="btncol" data-dismiss="modal" value="取消"/>
            </div>
        </div>
    </div>
</div>
$.ajaxFileUpload({
    url: '/importExcleRoster.do?user_type=0',//上传excle要提交到的action
    secureuri: false,//是否用安全提交,默认为false
    fileElementId: 'fileName',//file选择文件的框的id
    dataType: 'json',//数据返回格式,如果用json,需要修改ajaxfileupload.js中的内容 eval("data = " + data ); -->data = jQuery.parseJSON(jQuery(data).text());
    async: true,
    error: function (data) {
        layer.alert("导入文件失败");
    },
    success: function (data) {
        //导入成功后刷新页面
        layer.alert(data.resultMsg, function () {
             window.location.reload()
        });
    }
});

3、第三步

boolean isMultipart = ServletFileUpload.isMultipartContent(request);

if (!isMultipart) {
    response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
    logger.info("File is Null!");
} else {
    //创建工厂类
    DiskFileItemFactory factory = new DiskFileItemFactory();
    //获取文件上传类
    ServletFileUpload sfu = new ServletFileUpload(factory);
    JSONObject jsonObject = null;
    PrintWriter out = null;
    HSSFWorkbook hssfWorkbook = null;
    XSSFWorkbook xssfWorkbook = null;
    try {
        //获取FileItem
        List<FileItem> fileItemList = sfu.parseRequest(request);

        Iterator it = fileItemList.iterator();
        while (it.hasNext()) {
            FileItem item = (FileItem) it.next();
            //如果item不是普通文本表单字段
            if (!item.isFormField()) {
                //对字符串进行URL解码的编码处理函数    //获取到上传文件的名字
                String fileName = URLDecoder.decode(item.getName(), "UTF-8");

                fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());
                logger.info("fileName=====" + fileName);

                String fileUrl = this.getServletConfig().getServletContext().getRealPath(File.separator);
                logger.info("fileUrl=====" + fileUrl);

                File oldFile = new File(fileUrl, fileName);
                item.write(oldFile);
                //对传过来的excel文件更改名字,确保每次传过来的文件名字不一样
                String newfileName = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + fileName;

                File file = new File(fileUrl, newfileName);
                oldFile.renameTo(file);
                /*判断文件大小,2Mb*/
                if (file.length() > SystemInfo.maxSizeOfImport) {
                    jsonObject = JSONObject.fromObject("{\"resultData\": \"无数据\", \"resultMsg\": \"文件过大,不可超过2M\", \"resultCode\": \"1009\"}");
                    out = response.getWriter();
                    out.write(jsonObject.toString());
                    return;
                }

                //上传后的路径
                String filePath = file.getPath();

                List<Map<String, Object>> gdUserCreditImportTList = null;
                //判断Excle后缀名是xls还是xlsx,然后读取excle中的数据
                try{
                    hssfWorkbook = new HSSFWorkbook(new FileInputStream(file));//.xls格式的Excle文件
                    gdUserCreditImportTList = readExcle(hssfWorkbook);
                }catch (Exception e){
                    xssfWorkbook = new XSSFWorkbook(new FileInputStream(file));//.xlsx格式的Excle文件
                    gdUserCreditImportTList = readExcle(xssfWorkbook);
                }
		/** 批量插入数据库表中*/
            }
        }
	ResultData resultData = new ResultData();
	resultData.setResultData(200);
        resultData.setResultMsg("导入完成!");
        resultData.setResultData("");
        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType("text/json;charset=UTF-8");
        out = response.getWriter();
        out.write(JSONObject.fromObject(resultData).toString());//返
    } catch (Exception e) {
        e.printStackTrace();
        logger.info("Exception" + e.getMessage());
    } finally {
        if (out != null) {
            out.flush();
            out.close();
        }
        if (xssfWorkbook != null) {
            xssfWorkbook.close();
        }
        if (hssfWorkbook != null) {
            hssfWorkbook.close();
        }
    }
    logger.info("Success" + new Date().toLocaleString());
}

 4、第四步

/**
 * 读取excle数据并封装到list集合中
 * @param workbook
 * @return
 */
private List<Map<String, Object>> readExcle(Workbook workbook) {
    List<Map<String, Object>> gdUserCreditImportTList = new ArrayList<Map<String, Object>>();
    //循环工作表Sheet
    for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {
        Sheet sheet = workbook.getSheetAt(numSheet);
        // 这种主要是判断是否含空以免包空指针
        if (sheet == null) {
            continue;
        }
        // 循环行Row
        for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) {
            Row row = sheet.getRow(rowNum);
            if (!isRowEmpty(row)) {
                continue;
            }
            // GdUserCreditImportT gdUserCreditImportT = new GdUserCreditImportT();
            Map<String, Object> map = new HashMap<String, Object>();
            //将电话号码那一列设为字符串类型
            //row.getCell(3).setCellType(HSSFCell.CELL_TYPE_STRING);

            String user_name = row.getCell(1).getRichStringCellValue().toString();
            // gdUserCreditImportT.setUserName(user_name);//用户姓名
            String user_card_id = row.getCell(2).getRichStringCellValue().toString();
            //  gdUserCreditImportT.setUserCardId(user_card_id);//用户身份证
            row.getCell(3).setCellType(HSSFCell.CELL_TYPE_STRING);
            String user_phone = row.getCell(3).getRichStringCellValue().toString();
            //  gdUserCreditImportT.setUserPhone(user_phone);//用户手机号
            map.put("userName", user_name);
            map.put("userCardId", user_card_id);
            map.put("userPhone", user_phone);
            map.put("userType", user_type);
            map.put("creationBy", user.getUserId());
            map.put("lastUpdateBy", String.valueOf(user.getUserId()));
            map.put("creationDate", new Date());
            map.put("lastUpdateDate", new Date());
            map.put("status", 1);

            //将每一行封装好的对象添加进集合
            gdUserCreditImportTList.add(map);
        }
    }
    return gdUserCreditImportTList;
}

 5、第五步

public static boolean isRowEmpty(Row row) {
    Boolean result = false;
    if (row != null) {
        for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {
            Cell cell = row.getCell(c);
            if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK)
                result = true;
        }
    }
    return result;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java中.xlsx或者.xls格式的Excel导入(servlet中处理的) 的相关文章

  • 如何防止在 CXF Web 服务客户端中生成 JAXBElement

    我正在尝试使用 CXF 创建一个 Web 服务客户端来使用 WCF Web 服务 当我使用 wsdl2java 时 它生成具有 JAXBElement 类型而不是 String 的对象 我读到有关使用 jaxb bindings xml 文
  • 在 Tomcat 上部署 Java Web 项目,无需 WAR 或 EAR

    我有一个 Java Web 项目 Struts Spring 在我的本地主机上完美运行 我必须将其部署在我的网站上 但虚拟主机提供的 Tomcat Manager 界面显示 由于安全原因 它无法上传 WAR 文件 当联系技术支持时 我被告知
  • 使用 JAXB 编组 LocalDate

    我正在构建一系列链接类 我希望能够将其实例编组到 XML 以便我可以将它们保存到文件中并稍后再次读取它们 目前我使用以下代码作为测试用例 import javax xml bind annotation import javax xml b
  • java中队列的实现

    在 Java 中实现队列是一个非常常见的面试问题 我在网上冲浪 看到了许多实现 他们做了一些奇特的事情 比如实现队列接口和编写自己的addLast and removeFirst 方法 我的问题是我不能使用LinkedList 类并使用其预
  • 空 EntityManager/EJB 注入 MDB

    我有一个消息驱动 bean MDB 部署到 WebLogic 12 1 3 我尝试使用 PersistenceContext 注释将实体管理器注入 MDB 但实体管理器为空 我还尝试注入一个简单的无状态会话 bean 它也是空的 但是 Me
  • Excel - 查找列中不是错误或空白的最后一个值

    我需要在 Excel 电子表格的一列中找到最后一个非错误 非空白值 该列可以有多个 N A 实例 它们与实际值交替 有多种解决方案可用于查找最后一个非空单元格 但这些解决方案不考虑错误 特别是如果最后一个非空单元格出现错误 在这种情况下 解
  • 如果按下 Esc 则中断循环

    我用 JAVA 语言编写了一个程序 它使用 Scanner 类接受来自控制台的输入 现在我想将此功能添加到我的代码中 以便在用户按下 Esc 按钮时存在循环 while 到目前为止 我认为键盘类可以帮助我 但它就像扫描仪一样 我尝试使用事件
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • 如何使用 Spring MVC 和 Thymeleaf 添加静态文件

    我的问题是如何添加 CSS 和图像文件等静态文件 以便我可以使用它们 我正在使用 Spring MVC 和 Thymeleaf 我查看了有关此主题的各种帖子 但它们对我没有帮助 所以我才来问 根据这些帖子 我将 CSS 和图像文件放在res
  • Java 中 static 关键字如何工作?

    我正在阅读Java教程 http docs oracle com javase tutorial index html从一开始我就有一个问题static字段或变量上的关键字 作为Java said here http docs oracle
  • NoSuchMethodError:将 Firebase 与应用程序引擎应用程序集成时

    我试图将 firebase 实时数据库与谷歌应用程序引擎应用程序集成 我在调用时收到此错误 gt DatabaseReference ref FirebaseDatabase gt getInstance gt getReference t
  • 如何列出所有可用的 LookAndFeel 主题?

    如何列出所有可用的 LookAndFeel 主题 我想在 JComboBox 中显示以供用户选择 这真的很简单 public static UIManager LookAndFeelInfo getInstalledLookAndFeels
  • 膨胀类片段 InflateException 二进制 XML 文件时出错

    我正在使用 Material Design 和 NavigationDrawer 布局等设计我的第一个应用程序 但我遇到了一个问题 该应用程序非常简单 它只显示文本 并且基于 Android Studio 中提供的模板 尝试启动我的应用程序
  • 为什么 RMI 注册表忽略 java.rmi.server.codebase 属性

    我正在运行 java RMI 的 Hello World 示例 1 我在空文件夹中运行注册表 motta motta laptop tmp rmiregistry 2 我启动 HTTP 服务器以在运行时检索类 下载文件夹包含客户端 服务器的
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • 在方法内声明类 - Final 关键字 [重复]

    这个问题在这里已经有答案了 给定方法中的以下内部类 IsSomething public class InnerMethod private int x public class Something private int y public
  • 无法在 BlackBerry Playbook 上设置音量

    我在更改黑莓游戏书的音量时遇到问题 首先 我将 Android 应用程序重新打包到 Palybook 应用程序 我需要使用搜索栏更改黑莓剧本的音量 并在搜索监听器中设置音频管理器音量 这是代码 audioManager AudioManag
  • BoneCP 和 Derby - 如何正确关闭

    I have BoneCP CONNECTION POOL CONNECTION POOL getConfig setJdbcUrl jdbc derby database shutdown true Connection connecti
  • 编译时在代码中替换Java静态最终值?

    在java中 假设我有以下内容 fileA java class A public static final int SIZE 100 然后在另一个文件中我使用这个值 fileB java import A class b Object t

随机推荐

  • python人工智能应用实例_90后博士说,从Python到人工智能只差这35个趣味案例,越学越有趣...

    有趣的生活每个人都向往 有趣的Python编程学习方式却不是每个人都体验过 以这35个趣味案例开始 让兴趣成为学习Python最好的动力 看看这35个趣味案例 几乎是每个案例都对应着一个Python的知识点 比如 以照猫画虎的案例 教你剖析
  • mysql中geometry类型的简单使用(搜索附近的人)

    mysql中geometry类型的简单使用 编写本文的目的 让和两天前的我一样的初学者 能够更快的使用geometry类型存储空间点数据 也是为了自己加深印象 更熟练的使用geometry类型 建表脚本 CREATE TABLE z gis
  • 微信小程序云开发教程一

    微信小程序云开发 初学者入门教程一 云开发环境搭建 本教程适合刚刚入门的小白 云开发为开发者提供完整的云端支持 弱化后端和运维概念 无需搭建服务器 使用平台提供的 API 进行核心业务开发 即可实现快速上线和迭代 同时这一能力 同开发者已经
  • Pandas数据分析初学--开始了解数据

    探索Chipotle快餐数据 作为一个Pandas初学者 今天用这道题目练手 分享出来 首先 impotr pandas as pd 1 将数据集存入一个名为chipo的数据框内 iris filename chipotle csv chi
  • SkyWalking链路追踪中Trace概念以及Trace与span的关系

    基本概念 在SkyWalking链路追踪中 Trace 追踪 是指一个请求或者一个操作从开始到结束的完整路径 它涵盖了分布式系统中所有相关组件的调用关系和性能信息 具体来说 Trace包含了一系列的span 跨度 每个span代表了一个组件
  • kibana使用_从kibana迁移到grafana作为elasticsearch的展现

    今天说说 我们为什么会选择从kibana迁移到grafana 并选用grafana作为elasticsearch的图表展现工具 文章中关于kinaba和grafana的对比会有些片面 勿喷 最一开始使用kibana ElasticSearc
  • java 正则表达式_a-z_0-9 validation,掌握Java-Bean Validation

    数据校验虽然简单 但是却是一个繁琐的事 我在无数的代码看到if判断参数 然后错了打日志抛异常 一片一片的这种代码 如果有点重复了 再弄出N个xxUtil来归纳代码 虽然这种做法可以达到效果 但是代码散乱 一个是编写麻烦 一个是不易阅读 Ja
  • Pyqt5设计打开电脑摄像头+拍照(转载)

    本片为利用Pyqt5设计一个可以打开摄像头进行拍照的Demo 我感觉以后可能会有用 记录一下 Demo运行视频 哈哈感觉很好玩 用到的模块安装 库 安装 作用 PyQt5 pip install PyQt5 界面设计 opencv pyth
  • [网络安全自学篇] 三十五.恶意代码攻击检测及恶意样本分析

    本文主要结合作者的 系统安全前沿 作业 论文及绿盟李东宏老师的博客 从产业界和学术界分别详细讲解恶意代码攻击溯源的相关知识 在学术界方面 用类似于综述来介绍攻击追踪溯源的不同方法 在产业界方面 主要参考李东宏老师从企业恶意样本分析的角度介绍
  • 单调递增队列(全过程图文实现 另附习题)

    什么是单调队列 有什么用 不妨用一个问题来说明单调队列的作用和操作 不断地向缓存数组里读入元素 也不时地去掉最老的元素 不定期的询问当前缓存数组里的最小的元素 最直接的方法 普通队列实现缓存数组 进队出队都是O 1 一次查询需要遍历当前队列
  • 手把手教你如何 远程控制另一台电脑 保姆教程

    现在win10可以实现两台电脑之间的远程控制 下面我就分享一下如何利用快速助手进行远程控制另一台电脑 每一步都有截图 实验环境 两台win10系统的电脑 一 打开电脑后 需要设置允许电脑进行远程控制 进入 控制面板 系统和安全 系统 远程控
  • python文件操作图形化——python实战项目:单词练习系统

    python 文件操作与图形化编程 目录 python 文件操作与图形化编程 文件基本操作 图形化界面tkinter 单词练习系统 文件基本操作 D Python example txt 文件路径 D Python 文件名 example
  • 并行计算出现 pickle.PicklingError

    from multiprocessing import Pool def my function x return x x if name main inputs 1 2 3 4 5 with Pool 2 as p results p m
  • Unity面试题

    Unity基础面试题 1 什么是协同程序 2 Unity3D中碰撞器和触发器的区别 3 物体发生碰撞的必要条件 4 ArrayList和list的区别 5 如何安全的在不同工程间迁移Asset 6 OnEnable Awake Start的
  • Dubbo高级应用-服务治理

    目录 1 dubbo admin 2 7 x版本安装部署 1 1 下载源码 1 2 部署访问 2 路由规则 2 1 Dubbo API配置 2 2 管理控制台配置 3 规则动态配置 3 1 应用粒度 3 2 服务粒度 4 服务降级 5 集群
  • 集成 CUDA 实现 GPU 加速 OpenCV 计算机视觉

    特点 详细概述了将 OpenCV 与 CUDA 集成以用于实际应用 理解GPU与CUDA编程 通过一些实际示例 探索使用GPU和CUDA的OpenCV加速 熟悉在 NVIDIA Jetson TX1 上部署 OpenCV 应用程序 介绍了
  • python 类装饰器和函数装饰器区别_Python各种类型装饰器详解说明

    装饰器说明 Python中的装饰器是一种可以装饰其它对象的工具 该工具本质上是一个可调用的对象 callable 所以装饰器一般可以由函数 类来实现 装饰器本身需要接受一个被装饰的对象作为参数 该参数通常为函数 方法 类等对象 装饰器需要返
  • -day15--内置模块与开发规范

    day15 内置模块和开发规范 目标 掌握常见的内置模块的使用及了解软件开发的规范 今日概要 内置模块 json time datetime re 开发规范 主文件 配置文件 数据 附件 业务代码 1 内置模块 1 1 json json模
  • Win10+mingw64条件下编译和使用TBB(环境变量太神奇了!)

    Win10 mingw64 VSCode条件下编译和使用TBB Win10 mingw64条件下编译和使用TBB 编译TBB 环境变量的设置 TBB使用示例 总结与展望 Win10 mingw64条件下编译和使用TBB 本文记录在Win10
  • java中.xlsx或者.xls格式的Excel导入(servlet中处理的)

    1 第一步 在pom xml文件中添加maven依赖