时间很长;现在很短;距离很长;相遇很短
Friday September 10th 2010

Posts Tagged ‘xsl’

Java:利用XML生成Word文档

Word 2003后提供了一种xml的文档格式。可以利用这一点方便的生成doc文档

Word 2007更完全使用xml与数据压缩包的方式存储,使得用类似的方法处理附件也变为可能。

相关demo下载 doc-creator

概述

实现步骤如下:

  1. 定义Word文档样式,存为xml文档。
  2. 定义数据xml格式,生成样本数据。
  3. 修改word文档样式xml文件,制作xsl模板文件。
  4. 编程实现:数据->xml数据->模板转换->doc文档

创建模板

打开Word文档,另存为:Word 2003 xml格式。

使用xsl编辑器 (如 Stylus Studio)或手工编辑,创建XSL模板 。

   

   

相关XSL问题可以参考 http://www.w3schools.com/xsl/

利用dom4j处理相关xml操作

下面是一些基础实现方法

    /*
     * (non-Javadoc)
     *
     * @see cn.ccb.sarm.bizprocess.assetdeal.exam.approve.bizservice.IWfConferenceBS#writeXML(java.io.OutputStream,
     *      cn.ccb.sarm.bizprocess.assetdeal.exam.approve.common.bo.TaskVO,
     *      java.util.List, cn.ccb.sarm.common.model.bo.WfConferenceBO,
     *      cn.ccb.sarm.common.model.bo.WfConfBpBO)
     */
    public void writeXML(OutputStream output, TaskVO task, List opinionList, WfConferenceBO conf,
            WfConfBpBO confBP) throws IOException, IllegalAccessException,
            InvocationTargetException, NoSuchMethodException {
        Document doc = DocumentHelper.createDocument();
        Element root = doc.addElement("conference");
        Element taskNode = root.addElement("task");
        addBeanProp(task, taskNode);
        Element confNode = root.addElement("conferenceInfo");
        addBeanProp(conf, confNode);
        Element confBpNode = root.addElement("confBPInfo");
        addBeanProp(confBP, confBpNode);
        Element approveNode = root.addElement("approvers");

        addListMapEntry(opinionList, approveNode);

        XMLWriter writer = new XMLWriter(output);
        writer.write(doc);

    }

    /**
     * 转换list对象为多个元素
     *
     * @param list
     *            对象list
     * @param node
     *            父节点
     */
    private void addListMapEntry(List list, Element node) {
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Map map = (Map) it.next();
            Element approveNode = node.addElement("approver");
            addMapEntry(map, approveNode);
        }
    }

    /**
     * 转换bean为xml
     *
     * @param bean
     *            对象bean
     * @param node
     *            父节点
     * @throws IllegalAccessException
     * @throws InvocationTargetException
     * @throws NoSuchMethodException
     */
    private void addBeanProp(Object bean, Element node) throws IllegalAccessException,
            InvocationTargetException, NoSuchMethodException {
        Map propMap = BeanUtils.describe(bean);
        addMapEntry(propMap, node);
    }

    /**
     * 转换map对象为xml
     *
     * @param map
     *            数据对象
     * @param node
     *            父节点
     */
    private void addMapEntry(Map map, Element node) {
        Set entrySet = map.entrySet();
        Iterator it = entrySet.iterator();
        while (it.hasNext()) {
            Map.Entry e = (Entry) it.next();
            node.addElement(e.getKey().toString()).addText(
                    (e.getValue() == null ? "" : e.getValue().toString()));
        }
    }

    /*
     * (non-Javadoc)
     *
     * @see cn.ccb.sarm.bizprocess.assetdeal.exam.approve.bizservice.IWfConferenceBS#transformDocument(java.io.OutputStream,
     *      java.io.FileInputStream, java.io.FileInputStream)
     */
    public void transformDocument(OutputStream out, InputStream data, InputStream template)
            throws TransformerException {
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transform = factory.newTransformer(new StreamSource(template));

        Result result = new StreamResult(out);
        transform.transform(new StreamSource(data), result);
    }

测试代码

    public void testWriteXML() throws Exception {
        IWfConferenceBS conferenceBS = new WfConferenceBS();
        TaskVO task = new TaskVO();
        task.setBizTypeName("测试业务类型");
        List opinionList = new ArrayList();
        Map m = new HashMap();
        m.put("userName", "testUser");
        m.put("userConfRole", "testUserRole");
        m.put("approverOpinion", "approverOpinion");
        m.put("lastChangeTime", "time");
        opinionList.add(m);
        WfConferenceBO conf = new WfConferenceBO();
        conf.setConfPlace("place");
        WfConfBpBO confBP = new WfConfBpBO();
        confBP.setConfResult("testResult");
        confBP.setConfOpinion("confOpinion");
        File tempOutputFile = File.createTempFile("specialApproveTemp", ".xml");
        OutputStream output = new FileOutputStream(tempOutputFile);
        conferenceBS.writeXML(output, task, opinionList, conf, confBP);
        output.flush();
        output.close();

        OutputStream out = new FileOutputStream(File.createTempFile("specialApproveTemp", ".doc"));
        File template = ResourceUtils
                .getFile("classpath:cn/ccb/clpm/wf/common/specialApproveTemplate.xsl");
        conferenceBS.transformDocument(out, new FileInputStream(tempOutputFile),
                new FileInputStream(template));
        output.flush();
        output.close();

    }

Dynamic Language and DSL

这是一篇技术评论,呃,请自行掠过

早上拜读了Martin Fowler老人家的BLOG Groovy or Ruby ,兴致勃勃的看这个时尚的家伙对动态语言的高谈阔论。下午就在InfoQ看到了对其新书的点评——Martin Fowler unveils details of his upcoming DSL book. 两样东西放到一起很有意思。动态语言与领域语言(Domain-Specific Language)。

MF的书中是这样介绍的。

如果我们把XSLT看成是专门格式化XML的语言,那么XSLT就是XML的DSL。

那么DSL有什么用呢?

根据MF的论述 Domain-Specific Language

DSL与通用语言相区别,是为特定目的而生的语言,它并不是什么新东西,历史几乎和计算机的历史一样长。

比如Windows的批处理文件,再比如HTML(某种意义上)。处理它们的程序和普通的应用程序不一样,这些程序并不知道这些语言具体描述了什么,却知道他们到最后大概是什么样子。但我们也不能把这些应用程序归结为系统程序,毕竟,你不能用这些动态语言写成任何一个通常意义上的程序。这些语言轻巧灵活,惹人喜爱,却长期处于没人在乎的地位。几乎没有任何一个大学开设JavaScript或者BAT的课程。然而,用它们开发的程序铺天盖地,甚至有些开发者都没有意识到他们在写程序。

我们到底有多少DSL,没有人说的清楚,甚至怎么界定都没有标准。然而这种工具的确越来越受重视。大型的软件通常都有自己的工具语言,比如SAP,比如PepleSoft,比如MathLib,比如SAS,掌握这些工具通常意味着熟练应用这些语言与相关的领域知识。而由于他们之间毫无联系,同种软件之间有着高昂的替换成本。变相垄断使得DSL由最初的简化用户操作变成了对抗新来者的武器。

标准化是由混乱走向秩序的利器。工业化也是软件行业一直追求的目标。让我们看看工业界是怎么做的,他们拥有流水线,有很好的设计,生产,销售流程。我们常常抱怨软件的变化,生产没有变化吗?现在工业可以高效的适应变化,依靠的就是对领域的深切理解,对规则的灵活掌握。

对标准的无尽追寻是业界走向成熟的重要标志。不妨设想,今后的某天,所有的财务软件都有统一的口径标准,统一的数据格式处理流程。集团化,高质量的软件生产和部署使我们更加有序的获取所需的功能。然而这一切,依靠的就是对DSL领域的入侵。Ruby的流行正式反映了这种入侵,当其追逐者不断的在各种平台上实现这门语言的时候,我们也看到了传统语言正积极的调整。Java向.net学习多语言支持。.net努力的靠近开源社区的标准。

我们说GOP,说AOP,无非就是想把领域问题(Domain Problem)从应用问题里面解离,我们需要成熟的软件产品,需要的是真正模块化的组件,而不是某个既成事实。被巨头们忽悠着团团转的我们,也只能等到他们被迫合作的时候,才能轻松一点。

Latest Topics

光打雷不下雨

光打雷不下雨

最近诸事纷杂,熬夜加班不断,不过没有任何产出…… 悲剧~ Good [Read More]

30YEAR

30YEAR

今天是深圳特区30周年庆祝大会; 于是今天下班全市大堵车; [Read More]

iPad充电

iPad充电

iPad充电是一件诡异的事情~ 总结一下:1A的变压器是不行的,要2.1A的 [Read More]

mac|iOS|apns|php

mac|iOS|apns|php

啥都不说了,明天背着mac去公司学写iOS程序去。。 顺便推荐很有诚意的财经媒体的RSS [Read More]

iWork套件与Microsoft Office兼容性的问题

iWork套件与Microsoft Office兼容性的问题

用了MacBook,一定要用MacOS; [Read More]

Recent Comments

E had this to say

Read the post

继续说Apache的优化 | Himmel had this to say

Read the post

性能调优:MySql Server at Linux | Himmel had this to say

« The War of SQL 继续说Apache的优化 Read the post

安静一点 | Himmel had this to say

« RESTful Ave7.net 某咖啡店照片 Read the post

某L had this to say

没用的,那种也不是没有丢过…… 规律的生活与我无缘 Read the post