C# 处理Word自动生成报告 一、概述

C# 处理Word自动生成报告 一、概述

Java 对Word文件的生成(基于Apache POI)

Apache POI 是一个开源的跨平台的对Microsoft Office格式档案具有读和写功能工具。
在Github上有一个开源的Word模版引擎poi-tl ,这个模版引擎是基于Apache POI。主要是为了解决下面的问题:

  • java操作word使用apache poi的复杂性
  • 使用freemarker,转化为xml操作word的难度
  • 依赖服务器上安装软件openoffice来调用转化
  • 依赖windows的word lib库,不具有跨平台性

注意!
HSSF - 提供读写Microsoft Excel XLS格式档案的功能。(*.doc),HWPFDocument类
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。(*.docx),XWPFDocument类
因为这个模版引擎是只使用XWPFDocument类,所以只对*.docx文档生效。

C# 处理Word自动生成报告 一、概述

C# 处理Word自动生成报告 二、数据源例子

poi-tl demo

C# 处理Word自动生成报告 二、数据源例子

C# 处理Word自动生成报告 三、设计模板

调用方法

/*
* datas 是你要渲染的数据
* datas 可以是JavaBean,也可以是Map<String, Object>
*/
XWPFTemplate template = XWPFTemplate.compile("~/file.docx").render(datas);

除了传入模版文件路径,还可以传入模版文件输入流

public static XWPFTemplate compile(InputStream inputStream) {
    .....
    }

C# 处理Word自动生成报告 三、设计模板

C# 处理Word自动生成报告 四、程序处理

datas TO Map<String, Object>

看看数据类转Map的实现

private static Map<String, Object> convert2Map(Object dataSrouce) {
        Map<String, Object> ret = new HashMap<String, Object>();
        try {
            Class<?> clazz = dataSrouce.getClass();
            while (clazz != Object.class) {
                Field[] fields = clazz.getDeclaredFields();
                PropertyDescriptor pd = null;
                for (Field f : fields) {
                    pd = new PropertyDescriptor(f.getName(), dataSrouce.getClass());
                    Name annotation = f.getAnnotation(Name.class);
                    Object value = pd.getReadMethod().invoke(dataSrouce);
                    ret.put(null == annotation ? f.getName() : annotation.value(), value);
                }
                clazz = clazz.getSuperclass();
            }
        } catch (Exception e) {
            logger.error("Convert datasource failed.", e);
            throw new RenderException("Convert datasource failed.");
        }
        return ret;
    }

利用反射,把datas类和它的父类的字段属性转成Map<String, Object>,Object除外。所以我们传的参数是JavaBean或Map<String, Object>就可以了(传Map参数,会调用同名的的重载方法)。

C# 处理Word自动生成报告 四、程序处理

 

语法

    经常遇到这样的需求, 生成Word格式的报告, 而不是单纯的一张表格的报表.  就像体检报告一样.

现在说一下程序处理部分,有点长

普通文本

数据来源部分决定采用一个存储过程返回Dataset的方式, 整张报告的数据来源于此Dataset的多个Datatable.

本来是想做针对doc和docx的模板两个版本, 后来想到可以在生成的时候saveas里设置格式,

渲染数据为String或者TextRenderData

模版文件中使用:{{template}}

...
Map<String, Object> datas = new HashMap<String, Object>();
datas.put("template", "我是渲染的数据");
// 参数1:颜色 9d55b8;参数2:文本内容
datas.put("title", new TextRenderData("9d55b8", "Deeply in love with the things you love,n just deepoove."));

...         
  • 文本中可用n 来进行换行

首先通过配置文件遍历Dataset生成Word文档, 但这就意味着要配置的内容好多, 主要是样式方面的, 例如字体、表格的宽高、对齐方式、页眉页脚等等.

所以此版只支持对docx的模板处理,

图片

太麻烦了, 后来小罗决定采取修改的方式, 先制作一个报告的word模板, 再通过配置更新模板内容. 

本文由糖果派对电玩城发布于用户体验,转载请注明出处:C# 处理Word自动生成报告 一、概述

您可能还会对下面的文章感兴趣: