zoukankan      html  css  js  c++  java
  • JAVAWEB导出word文档,遍历表格数据,导出图片

    这是写的另一个导出word方法:https://www.cnblogs.com/pxblog/p/12790904.html 

    本次使用的是easypoi框架

    官方教程:https://opensource.afterturn.cn/doc/easypoi.html

    gitee地址:https://gitee.com/tianj/easypoi

    引入maven依赖

    <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-base</artifactId>
                <version>3.3.0</version>
            </dependency>
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-web</artifactId>
                <version>3.3.0</version>
            </dependency>
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-annotation</artifactId>
                <version>3.3.0</version>
            </dependency>
            <!--注意:word中要使用循环等标签必须单独导入以下依赖-->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>ooxml-schemas</artifactId>
                <version>1.1</version>
            </dependency>

    word模板内容

     参数说明:$fe:jobs(jobs:java代码中集合名称),t.属性名(t表示集合中单个对象)

    EasyPoi 模板 表达式支持

    • 空格分割
    • 三目运算 {{test ? obj:obj2}}
    • n: 表示 这个cell是数值类型 {{n:}}
    • le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
    • fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
    • fn: 格式化数字 {{fn:(obj;###.00)}}
    • fe: 遍历数据,创建row
    • !fe: 遍历数据不创建row
    • $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
    • !if: 删除当前列 {{!if:(test)}}
    • 单引号表示常量值 '' 比如'1' 那么输出的就是 1
    • &NULL& 控制
    • ]] 换行符

    工具类

    WordUtil.java

    package com.example.demo.utils;
    
    import cn.afterturn.easypoi.word.WordExportUtil;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.util.Map;
    
    public class WordUtil {
    
        /**
         * 导出word(2007版本docx)
         *
         * @param templateWordPath
         * @param dataMap
         * @return
         * @throws Exception
         */
        public static byte[] exportWord(String templateWordPath, Map<String, Object> dataMap) throws Exception {
            File tf = new File(templateWordPath);
            if (!tf.exists() || !tf.isFile()) {
                throw new RuntimeException("File [" + templateWordPath + "] Not Found Or Not File.");
            }
            XWPFDocument document = WordExportUtil.exportWord07(templateWordPath, dataMap);
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            document.write(bos);
            return bos.toByteArray();
        }
    
    
    }

    控制器方法

    package com.example.demo.controller;
    
    import cn.afterturn.easypoi.word.entity.WordImageEntity;
    import com.example.demo.utils.WordUtil;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @Controller
    public class TestController {
    
        @RequestMapping(value = "/export")
        public void export(HttpServletResponse response){
            try {
                //
                Map<String, Object> dataMap = new HashMap<>();

                 //导出单个数据
                 dataMap.put("title","我是导出文档的标题");

    //导出对象
                Map<String, String> user = new HashMap<>();
                user.put("name", "姓名");
                user.put("age", "443");
                user.put("address", "地址");
                user.put("other", "我不知道");
                dataMap.put("user", user);
    
                //导出图片
                WordImageEntity image = new WordImageEntity();
                //设置图片尺寸
                image.setHeight(500);
                image.setWidth(500);
                //图片地址,需要是本地项目中图片,如果是第三方的需要把图片先下载下来
                image.setUrl("C:\Users\Fr\Pictures\11163144hqk4.JPG");
                image.setType(WordImageEntity.URL);
                dataMap.put("images", image);
    
                List<Map<String, Object>> jobs = new ArrayList<>();
    
                //导出列表
                Map<String, Object> job;
                for (int i = 0; i < 5; i++) {
                    job = new HashMap<>();
                    job.put("id", "ID-" + i);
                    job.put("name", "姓名:" + i);
                    jobs.add(job);
                }
    
                dataMap.put("jobs", jobs);
    
                // “D:/word-template-test.docx”是word模板所在位置
                byte[] doc = WordUtil.exportWord("D:/word-template-test.docx", dataMap);
    
                response.setContentType("application/vnd.ms-word;charset=utf-8");
                response.setHeader("Content-Disposition",
                        "attachment;filename="" + new String("word文档导出".getBytes("gb2312"), "ISO8859-1")+".docx");  //文件名中文需进行格式转换,不然可能出现乱码
                OutputStream out = response.getOutputStream();
                out.write(doc);
                out.flush();
    
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

    导出效果

  • 相关阅读:
    Rust started
    修改cargo镜像源
    如何激发团队潜能?
    JVM 09.5 运行时数据区 堆 堆时对象分配的唯一选择吗 逃逸分析
    JVM 09.5 运行时数据区 堆 相关参数设置总结
    JVM 09.4 运行时数据区 堆 线程独占区域 TLAB
    JVM 09.3 运行时数据区 堆 调优/垃圾回收/小结
    JVM 09.2 运行时数据区 堆 年轻带/老年代/对象分配过程
    JVM 09.1 运行时数据区 堆 核心概述
    JVM 08 运行时数据区 本地方法栈
  • 原文地址:https://www.cnblogs.com/pxblog/p/13072711.html
Copyright © 2011-2022 走看看