Java导出Word(导出图片,类,List)

这里写自定义目录标题

  • 一、Java导出一个List或者类
  • 一、Java导出图片

一、Java导出一个List或者类

具体步骤如下:
首先需要创建一个模板
创建模板步骤:
(1)创建想要导出的表格或者区域
在这里插入图片描述
(2)在空白处按ctrl+f9
(3)右击这个大括号里面选择编辑域
(4)点击邮件合并并操作其代码域
Java导出Word(导出图片,类,List)_第1张图片

注:Class.name为存在你要导出的类中的对应变量名称为name的变量,Class.变量名,此变量名和类中的变量名要对应。
(5)点击确定并重复操作

编写具体代码
具体步骤如下:
(1)将下面代码复制到你想要写在的类中

 public void exportWord HttpServletResponse response)
            throws IOException, XDocReportException {
    //param中存放着你要打印的数据,它可以是一个List或者一个类
    Object param = new Object;
    Map<String, Object> map = new HashMap<>();
    map.put("Class", param);
    String outFileName = URLEncoder.encode("导出的Word文件的名字", "UTF-8").replaceAll("\\+", "%20");       
    String fileName = "模板的名字";
    response.setCharacterEncoding("UTF-8");
    response.setContentType("application/docx;charset=UTF-8");
    response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + outFileName + ".docx");
    //模板默认放在resource/template下
    InputStream inputStream = new ClassPathResource("/template/" + fileName).getInputStream();   
    //得到流,生成表
    ServletOutputStream outputStream = response.getOutputStream();
    WordUtils.generateWord(map, inputStream, outputStream,"Class",Object.class,listType);
    //清空输出流
     outputStream.flush();   
    }
    /**
     * 原则上导出word用此方法,此方法写在类WordUtils中
     *
     * @param context         所要打印的数据对象
     * @param inputStream     输入的模板
     * @param outputStream    输出流
     * @param exportParamName 类的名字,在模板中域名的前缀
     * @param exportParam     所要打印数据对象的类的类型
     * @param listType        是否是一个List
     */
    public static void generateWord(Map<String, Object> context, InputStream inputStream, OutputStream outputStream,
                                    String exportParamName, Class<?> exportParam, boolean listType)
            throws IOException, XDocReportException {
        //获取Word模板,模板存放路径在项目的resources目录下
        //InputStream ins = this.getClass().getResourceAsStream("/模板.docx");
        //注册xdocReport实例并加载FreeMarker模板引擎
        IXDocReport report = XDocReportRegistry.getRegistry().loadReport(inputStream, TemplateEngineKind.Freemarker);
        //创建字段元数据
        FieldsMetadata fm = report.createFieldsMetadata();
        //Word模板中的表格数据对应的集合类型
        fm.load(exportParamName, exportParam, listType);
        report.process(context, outputStream);
    }

(2)对代码中的变量进行更改
param:在代码段第4行,此变量为你要导出的数据存放的类或List,需要你对其进行创建和实例化。
导出的Word文件的名字:在代码段第7行,为你想要导出的word的文件的名字。
模板的名字:在代码段第8行,为你存放在template下的模板的名字。
Object.class:在代码段第16行,Object.class要换成你创建的类的类型.class。如果要传一个List,则变成<泛型>,泛型.class。
listType:在代码第16行,如果是List则传入true,否则传入false

注:
(1)模板中的${Class.变量名}中的Class和代码中map,中的Class的是一个名字即可,这个名字可以变。
(2)如果传入List,则导出的时候按照顺序自动导出List中每个对象的数据。
(3)函数generateWord()一般写在WordUtils类中。
(4)获得模板的路径根据你放的模板位置进行更改

一、Java导出图片

具体步骤如下:
1、首先需要创建一个模板
创建模板步骤:
在插入的区域先插入一个图片
点击图片,然后点击插入,找到插入书签
Java导出Word(导出图片,类,List)_第2张图片

2、具体代码如下:

 public void exportWordPicture(HttpServletResponse response)
            throws IOException, XDocReportException {
//获取模板,模板默认放在resource/template下
String fileName = "模板的名字";
        InputStream in = new ClassPathResource("/template/" + fileName).getInputStream();
        IXDocReport report = XDocReportRegistry.getRegistry().loadReport(
                in, TemplateEngineKind.Freemarker);
        //Create fields metadata to manage image
        FieldsMetadata metadata = new FieldsMetadata();
        metadata.addFieldAsImage("logo");
        report.setFieldsMetadata(metadata);
        //Create context Java model
        IContext context = report.createContext();
        //获得图片文件
        File file = new File("图片的路径");
        IImageProvider logo = new FileImageProvider(file, false);
        context.put("logo", logo);
        //context.put("Class", param);
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/docx;charset=UTF-8");
        String outFileName = URLEncoder.encode("导出文件名字", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + outFileName + ".docx");
        ServletOutputStream outputStream = response.getOutputStream();
        report.process(context, outputStream);
        outputStream.flush();

(2)对代码中的变量进行更改
导出的Word文件的名字:在代码段第21行,为你想要导出的word的文件的名字。
模板的名字:在代码段第4行,为你存放在template下的模板的名字。
图片路径:在代码段第15行,为存放图片的路径。
图片大小:在代码段第16行,如果想让图片与模板中图片大小一样,参数则改为false。如果想按照图片原来大小则改为true,代码中默认为false。


(1)如果想同时导出对象或者List,则按照先前的方法创建模板中的代码域,然后将类创建并且实现好之后,加上代码段第18行即可。
(2)标签中的名字(logo),与代码段中的名字(logo)要一致。

你可能感兴趣的:(java,word,list)