Word 导入导出

news2024/11/15 12:29:20

在实际的开发过程中,也会遇到导入导出的功能,今天就简单的做一下总结。

1.需求:将下面word 数据导入到数据库并进行存储

在Controller中

 

    @RequestMapping(value = "/ImportWord")
    public @RawResponseBody
    Object ImportWord(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws IOException,
        ParseException {
        return gwyjglyjtzBizc.ImportWord(request, file);
    }

在Service的实现类中,

 @Override
    public Object ImportWord(HttpServletRequest request, MultipartFile file) throws ParseException {

        boolean flag = false;
        List<String> rowList;
        String userId = null;
        String userName = null;
        String deptId = null;
        String deptName = null;
        Map<String, String> userMap = DeptUserUtils.getUserDept(request);
        if (userMap instanceof Map) {
            userId = ((Map<?, ?>)userMap).get("userId").toString();
            userName = ((Map<?, ?>)userMap).get("userName").toString();
            deptId = ((Map<?, ?>)userMap).get("deptId").toString();
            deptName = ((Map<?, ?>)userMap).get("deptName").toString();
        }
        String xqlb1 = "";
        String xqdj1 = "";
        String yjbt1 = "";
        try {
            rowList = POIUtils.readYjtzWord(file);
            GwYjglYjtz gwYjglYjtz = new GwYjglYjtz();

            for (int i = 0; i < rowList.size(); i++) {
                if (rowList.get(i).equals("主送单位")) {
                    gwYjglYjtz.setFbdw(rowList.get(++i));
                }

                if (rowList.get(i).contains("预警通知")) {
                    yjbt1 += rowList.get(i);
                }
                if (rowList.get(i).contains("电缆预警")) {
                    yjbt1 += rowList.get(i);
                    gwYjglYjtz.setYjbt(yjbt1);

                }
                if (rowList.get(i).equals("险情类别")) {
                    xqlb1 += rowList.get(++i) + ",";
                    gwYjglYjtz.setXqlb(xqlb1);
                }
                if (rowList.get(i).equals("预警来源")) {

                    gwYjglYjtz.setYjly(rowList.get(++i));
                }
                if (rowList.get(i).equals("预警级别")) {
                    xqdj1 += rowList.get(++i) + ",";
                    gwYjglYjtz.setXqdj(xqdj1);
                }
                if (rowList.get(i).contains("事件概要")) {
                    String string = rowList.get(++i);

                    gwYjglYjtz.setSjgy(string);
                }
                if (rowList.get(i).equals("要求")) {
                    gwYjglYjtz.setYgcsyq(rowList.get(i + 1));
                }
                if (rowList.get(i).equals("影响时间")) {
                    String string = rowList.get(++i);
                    if (string.length() > 0) {
                        String[] split1 = string.split("~");
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                        // 使用SimpleDateFormat来解析日期字符串
                        SimpleDateFormat originalFormat = new SimpleDateFormat("yyyy年MM月dd日HH时mm分");
                        // 创建一个新的SimpleDateFormat来格式化输出
                        SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                        int a = 0;
                        for (String s : split1) {
                            try {
                                Date date = originalFormat.parse(s);
                                // 转换并打印结果
                                String formattedDate = targetFormat.format(date);
                                System.out.println(formattedDate);
                                if (a == 0) {
                                    gwYjglYjtz.setXxkssj(date);
                                } else {
                                    gwYjglYjtz.setXxjssj(date);

                                }
                                a++;

                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    gwYjglYjtz.setDjrid(userId);
                    gwYjglYjtz.setDjr(userName);
                    gwYjglYjtz.setDjdwid(deptId);
                    gwYjglYjtz.setDjdw(deptName);
                    gwYjglYjtz.setCreatetime(new Date());
                }

            }
            super.add(gwYjglYjtz);
            flag = true;
            System.out.print("导入word成功");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return flag;
    }

 在这里需要通过输入流的方式把里面的内容读取出来,然后存储到集合中。

    public static List<String> readYjtzWord(MultipartFile formFile) throws IOException {
        // 检查文件
        checkDocFile(formFile);

        InputStream fis = formFile.getInputStream();

        XWPFDocument document = new XWPFDocument(fis);
        // 创建返回对象,把每行中的值作为一个数组,所有的行作为一个集合返回
        List<String[]> list = new ArrayList<String[]>();
        // 遍历文档中的所有段落
        List<String> list1 = new ArrayList<String>();

        List<XWPFParagraph> paragraphs = document.getParagraphs();
        for (XWPFParagraph paragraph : paragraphs) {
            // 获取并打印段落文本
            String text = paragraph.getText();
            String trim = text.trim();
            String[] lines = trim.split("\n", 2);

            for (String s : lines) {
                list1.add(s);

            }
            System.out.println(trim);
        }

        // 如果需要处理表格,可以这样获取并遍历
        List<XWPFTable> tables = document.getTables();
        for (XWPFTable table : tables) {
            for (XWPFTableRow row : table.getRows()) {
                for (XWPFTableCell cell : row.getTableCells()) {
                    for (XWPFParagraph p : cell.getParagraphs()) {
                        String text = p.getText().trim();
                        list1.add(text);
                        System.out.println(text);
                    }
                }
            }
        }

        // 关闭输入流
        fis.close();

        return list1;
    }

 检查是否是指定文件格式

    public static void checkDocFile(MultipartFile formFile) throws IOException {
        // 判断文件是否存在
        if (null == formFile) {
            logger.error("文件不存在!");
            throw new FileNotFoundException("文件不存在!");
        }
        // 获得文件名
        // String fileName = formFile.getName();
        String fileName = formFile.getOriginalFilename();
        // 判断文件是否是word文件
        if (!fileName.endsWith(DOC) && !fileName.endsWith(DOCX)) {
            logger.error(fileName + "不是word文件!");
            throw new IOException(fileName + "不是word文件!");
        }
    }

导出功能

首先我们需要在word 指定对应的模版,对应的字段需要用占位符,这里需要跟数据库的字段需要保持一致或者是和Map 里面的key 。

最终模版制作完成后,保存时请注意,文件类型。一般是xml ,由于电脑的原因我选择的是html 格式。

用编辑器打开编码一定要选择utf-8,不然将来导出的时候是乱码。

编码格式改后,如果还是出现乱码在head 标签中加入一下内容

<head>
  <!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:TrackMoves>false</w:TrackMoves><w:TrackFormatting/><w:ValidateAgainstSchemas/><w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid><w:IgnoreMixedContent>false</w:IgnoreMixedContent><w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText><w:DoNotPromoteQF/><w:LidThemeOther>EN-US</w:LidThemeOther><w:LidThemeAsian>ZH-CN</w:LidThemeAsian><w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript><w:Compatibility><w:BreakWrappedTables/><w:SnapToGridInCell/><w:WrapTextWithPunct/><w:UseAsianBreakRules/><w:DontGrowAutofit/><w:SplitPgBreakAndParaMark/><w:DontVertAlignCellWithSp/><w:DontBreakConstrainedForcedTables/><w:DontVertAlignInTxbx/><w:Word11KerningPairs/><w:CachedColBalance/><w:UseFELayout/></w:Compatibility><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><m:mathPr><m:mathFont m:val='Cambria Math'/><m:brkBin m:val='before'/><m:brkBinSub m:val='--'/><m:smallFrac m:val='off'/><m:dispDef/><m:lMargin m:val='0'/> <m:rMargin m:val='0'/><m:defJc m:val='centerGroup'/><m:wrapIndent m:val='1440'/><m:intLim m:val='subSup'/><m:naryLim m:val='undOvr'/></m:mathPr></w:WordDocument></xml><![endif]-->
</head>

 引入对应的jar包

Controller

    @RequestMapping(value = "exportMillCertificate", method = RequestMethod.GET)
    @ResponseBody
    public void exportMillCertificate(HttpServletRequest request, HttpServletResponse response, @RequestParam(
        value = "objId") String objId) throws Exception {
        gwyjglyjtzBizc.exportMillCertificate(request, response, objId);
    }

Service 的实现类

 @Override
    public void exportMillCertificate(HttpServletRequest request, HttpServletResponse response, String objId)
        throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat originalFormat = new SimpleDateFormat("yyyy年MM月dd日HH时mm分");

        // TODO Auto-generated method stub
        String sql =
            "select t.yjbt,t.fbdw,t.yjly,t.xqlb,t.xqdj,t.sjgy,t.ygcsyq,to_char(t.xxkssj,'yyyy-MM-dd hh24:mi:ss') as xxkssj,to_char(t.xxjssj,'yyyy-MM-dd hh24:mi:ss') as xxjssj  from  GW_GL_T t  where t.obj_id=?";
        List<Map<String, String>> list = this.hibernateDao.queryForListWithSql(sql, new String[] {objId});
        Map<String, String> map0 = new HashMap<String, String>();
        Map<String, String> map = new HashMap<String, String>();
        if (!Tool.isEmptyList(list)) {
            map0 = list.get(0);
            // 应急标题
            if (Tool.isEmptyStr(map0.get("yjbt"))) {
                map.put("yjbt", "");
            } else {
                map.put("yjbt", map0.get("yjbt"));
            }
            // 发布单位
            if (Tool.isEmptyStr(map0.get("fbdw"))) {
                map.put("fbdw", "");
            } else {
                map.put("fbdw", map0.get("fbdw"));
            }
            // 预警来源
            if (Tool.isEmptyStr(map0.get("yjly"))) {
                map.put("yjly", "");
            } else {
                map.put("yjly", map0.get("yjly"));
            }
            // 险情类别
            if (Tool.isEmptyStr(map0.get("xqlb"))) {
                map.put("xqlb", "");
            } else {
                map.put("xqlb", map0.get("xqlb"));
            }
            // 预警级别
            if (Tool.isEmptyStr(map0.get("xqdj"))) {
                map.put("xqdj", "");
            } else {
                map.put("xqdj", map0.get("xqdj"));
            }
            // 影响时间
            if (Tool.isEmptyStr(map0.get("xxkssj"))) {
                map.put("yxsj", "");
            } else {
                String string = map0.get("xxkssj");
                String string1 = map0.get("xxjssj");
                Date parse = sdf.parse(string);
                Date parse1 = sdf.parse(string1);
                String format1 = originalFormat.format(parse);
                String format2 = originalFormat.format(parse1);
                map.put("yxsj", format1 + "~" + format2);
            }
            // 事件概要
            if (Tool.isEmptyStr(map0.get("sjgy"))) {
                map.put("sjgy", "");
            } else {
                map.put("sjgy", map0.get("sjgy"));
            }
            // 有关措施要求
            if (Tool.isEmptyStr(map0.get("ygcsyq"))) {
                map.put("ygcsyq", "");
            } else {
                map.put("ygcsyq", map0.get("ygcsyq"));
            }
        } else {
            map.put("yjbt", "");
            map.put("fbdw", "");
            map.put("yjly", "");
            map.put("xqlb", "");
            map.put("xqdj", "");
            map.put("yxsj", "");
            map.put("sjgy", "");
            map.put("ygcsyq", "");

        }
        // map.put("yxsj", "");
        String yjbt = map0.get("yjbt");
        WordUtils.exportWord(request, response, map, "yjglyjtzmb.ftl", yjbt);

调用工具类的方法生成Word文档

    public static void exportWord(HttpServletRequest request, HttpServletResponse response, Map<String, String> map,
        String templateName, String fileName) throws IOException {
        String pathString = request.getSession().getServletContext().getRealPath("/WEB-INF/templete/");
        logger.info("获取到的模板路径是:templetePath------->" + pathString);
        configuration.setDirectoryForTemplateLoading(new File(pathString));

        Template freemarkerTemplate = configuration.getTemplate(templateName);
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;
        try {
            // 调用工具类的createDoc方法生成Word文档
            file = createDoc(map, freemarkerTemplate);
            fin = new FileInputStream(file);

            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");
            // 设置浏览器以下载的方式处理该文件名
            // + DateUtil.currentDateToString()
            fileName = fileName + ".doc";
            response.setHeader("Content-Disposition",
                "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));

            out = response.getOutputStream();
            byte[] buffer = new byte[512]; // 缓冲区
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while ((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } finally {
            if (fin != null)
                fin.close();
            if (out != null)
                out.close();
            if (file != null)
                file.delete(); // 删除临时文件
        }

    }
    private static File createDoc(Map<String, String> dataMap, Template template) {
        String name = ".doc";
        File f = new File(name);
        Template t = template;
        try {
            // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }

最终效果图与导入的是一致里,今天就先到这,在开发过程中不一定会遇到这些,但是觉得还不错那就点赞收藏一波哈,万一哪天用到里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1946406.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么将jpg图片转换为pdf?将jpg图片转换为pdf的几种方法介绍

怎么将jpg图片转换为pdf&#xff1f;转换jpg图片为PDF是一项常见的任务&#xff0c;无论是个人用户还是商业环境中都经常会遇到这种需求。将多张jpg图像合并成一个单一的PDF文件可以带来诸多便利&#xff0c;例如便于存档、分享和打印。这种转换不仅简化了文件管理流程&#xf…

萝卜快跑:自动驾驶的先锋与挑战

萝卜快跑&#xff1a;自动驾驶的先锋与挑战 近段时间&#xff0c;由萝卜快跑引发的自动驾驶事件如火如荼&#xff0c;成为科技领域的热门话题。萝卜快跑作为自动驾驶领域的重要参与者&#xff0c;其最新事件引发了广泛的关注和讨论。 萝卜快跑是百度推出的自动驾驶出行服务平台…

计算机网络基础:4.HTTP与HTTPS

一、回顾设定 想象你在经营一家繁忙的餐厅&#xff0c;顾客们通过点餐系统&#xff08;网卡&#xff09;下单&#xff0c;订单被前台&#xff08;路由器&#xff09;接收并分发到各个厨房区域&#xff08;网络设备&#xff09;。光猫像是食材供应商&#xff0c;通过高效的物流系…

2、LangChain —— RAG基本架构

文章目录 一、概述二、什么是 RAG三、概念1、Indexing2、Retrieval and generation 四、设置1、下载安装 langchain2、LangSmith 五、一个简单的RAG后端1、Load2、Split3、Embedding and Store4、Retrieval5、Generate 一、概述 LLM 支持的最强大的应用程序之一是 复杂的问答 (…

MySQL中实现动态表单中JSON元素精准匹配的方法

目录 前言 一、动态表单技术 1、包含的主要信息 2、元素属性设置 3、表单内容 二、表单数据存储和查询 1、数据存储 2、数据的查询 3、在5.7版本中进行JSON检索 4、8.0后的优化查询 三、总结 前言 在很多有工作流设置的地方、比如需要在不同的流程中&#xff0c;需要…

【八股系列】JavaScript如何判断一个对象是否属于某个类?

&#x1f389; 博客主页&#xff1a;【剑九 六千里-CSDN博客】 &#x1f3a8; 上一篇文章&#xff1a;【探索扫描二维码登录的奥秘&#xff1a;从前端到后端的无缝连接】 &#x1f3a0; 系列专栏&#xff1a;【面试题-八股系列】 &#x1f496; 感谢大家点赞&#x1f44d;收藏⭐…

基于单片机控制的家电产品硬件故障诊断

摘要&#xff1a; 在现阶段家用电子产品生产制造的过程中&#xff0c;需要应用到非常多的单片机以及单片机控制技术&#xff0c;单片机凭借着自身体积小、反应快、功耗低的优势迅速抢占了家电产品的市场。并且在单片机实际的应用过程中&#xff0c;通过对单片机控制技术的掌握可…

HarmonyOS 本地真机运行

目录 官网地址 1.开发工具设置签名 2.手机开启开发者模式 3.使用USB连接方式 4.使用无线调试连接方式 5.常见的问题 官网地址 使用真机运行应用 使用本地真机运行应用/服务 1.开发工具设置签名 官网应用/服务签名 1.左上角文件--项目结构-勾选自动生成签名-Sign in登录 2…

【Vue3】watch 监视 reactive 定义的数据

【Vue3】watch 监视 reactive 定义的数据 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经…

Binius-based zkVM:为Polygon AggLayer开发、FPGA加速的zkVM

1. 引言 近日&#xff0c;ZK硬件加速巨头Irreducible和Polygon团队宣布联合开发生产级的Binius-based zkVM&#xff0c;用于助力Polygon AggLayer&#xff0c;实现具有低开销、硬件加速的binary proofs。 Irreducible&#xff08;曾用名为Ulvetanna&#xff09;团队 Benjamin …

如何在 Spring Boot 中开发一个操作日志系统

文章目录 前言添加依赖配置日志存储创建实体类创建仓库接口创建AOP切面配置日志级别测试日志系统 前言 在开发企业级应用时&#xff0c;记录用户操作日志是非常重要的。这不仅能帮助开发者监控系统的行为&#xff0c;还能在出现问题时进行追踪。在这篇文章中&#xff0c;我们将…

线性代数|机器学习-P25线性规划和两人零和博弈

文章目录 0. 概述1. 线性规划问题1.1 定义1.2 举例 2. 线性规划中的对偶问题3. 最大流 - 最小割问题4. 两人零和博弈 MIT教授教学视频&#xff0c;讲得比较泛&#xff0c;需要另外学习很多知识补充 0. 概述 线性规划[LP]问题 线性规划是问题为线性求最值&#xff0c;约束也是求…

前端调试合集(包含移动端/内嵌h5)

代码内使用方法 alert/console alert和console.log作为JS最基本的调试能力&#xff0c;提供了简易版的断点 (只能断一下) 和输出 (只能输出字符串) 能力&#xff0c;可以在代码运行到预期的位置输出预期的log&#xff0c;通过对不同流程下写入alert&#xff0c;输出变量的值来…

普元EOS学习笔记-EOS的ide开发工具的介绍

前言 普元EOS开发包括低开和高开。 EOS低开&#xff0c;直接在浏览器操作即可&#xff0c;不需要编码。 EOS高开&#xff0c;需要使用EOS的ide工具&#xff0c;进行编码开发。 EOS的ide工具是普元在Eclipse基础上进行的扩展&#xff0c;添加了若干插件&#xff0c;专门用于…

Redis 7.x 系列【29】集群原理之自动故障转移

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 案例演示3. 工作原理3.1 故障检测3.2 排名3.3 延迟等待3.4 投票3.5 上位 1.…

LeetCode:对称的二叉树(C语言)

1、问题概述&#xff1a;给一个二叉树&#xff0c;看是否按轴对称 2、示例 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 3、分析 &#xff08;1&a…

MATLAB和Python零模型社会生物生成式结构化图

&#x1f3af;要点&#x1f3af;要点&#x1f3af;启发式方法无标度和前馈拓扑的网络编码&#x1f3af;随机遗传模型使用布线规则&#x1f3af;随机遗传算法测试连接组模型&#x1f3af;确定性地生成分支树和分层网络&#xff0c;同质偏好规则的联系&#x1f3af;生成随机网络节…

无涯·问知财报解读,辅助更加明智的决策

财报解读就像是给公司做一次全面的体检&#xff0c;是理解公司内部运作机制和市场表现的一把钥匙&#xff0c;能够有效帮助投资者、分析师、管理层以及所有市场参与者判断一家公司的健康程度和发展潜力。 星环科技无涯问知的财经库内置了企业年报及财经类信息&#xff0c;并对…

GateWay网关微服务定位和理论知识

微服务架构的网关在哪里&#xff1f; 概念 SPring Cloud Gateway组件的核心是一系列的过滤器&#xff0c;通过这些过滤器可以将客户端发送的请求转发&#xff08;路由&#xff09;到对应的微服务。Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器&#xff0c;隐藏…

linux离线安装mysql8(单机版)

文章目录 一、检查服务器是否有残留mysql资源&#xff0c;有的话就全删除1.1、查询mysql已安装的相关依赖&#xff1a;1.2、查找含有MySQL的目录 二、安装2.1、上传mysql安装包到文件夹下并解压2.2、移动及重命名2.3、mysql用户2.4、配置mysql所需的my.cnf文件2.5、给my.cnf配置…