JAVAWEB导出word文档,遍历表格数据,导出图片

时间:2024-02-16 18:01:16

 

这是写的另一个导出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();
        }
    }

}

 

导出效果