具体步骤如下:
首先需要创建一个模板
创建模板步骤:
(1)创建想要导出的表格或者区域
(2)在空白处按ctrl+f9
(3)右击这个大括号里面选择编辑域
(4)点击邮件合并并操作其代码域
注: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
(2)如果传入List,则导出的时候按照顺序自动导出List中每个对象的数据。
(3)函数generateWord()一般写在WordUtils类中。
(4)获得模板的路径根据你放的模板位置进行更改
具体步骤如下:
1、首先需要创建一个模板
创建模板步骤:
在插入的区域先插入一个图片
点击图片,然后点击插入,找到插入书签
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)要一致。