代码之家  ›  专栏  ›  技术社区  ›  D.Bugger

需要将样式标记放在XPages的头部分,输出到Excel

  •  0
  • D.Bugger  · 技术社区  · 7 年前

    我有一个XPage,可以选择查询文档。其中的全文查询从数据库中搜索文档,进行一些计算,并将其显示为屏幕上的视图。屏幕上还有一个设置requestScope的按钮。showExcel=true并进行完全重新加载,以便将数据直接下载到Excel中(使用.setHeader(“Content disposition”,“inline;myfile.xls”)。它只不过是一个带有tr和td标记的简单表。到现在为止,一直都还不错。

    除了一件事:Excel和OpenOffice或LibreOffice Calc不喜欢正文中的样式部分,所有这些都可以工作。当我保存输出并将样式移动到标题部分时,文件可以在Excel中正常加载。

    所以我出去把我们的电脑造型放在头部。我找到了样式表资源及其计算的内容参数。它确实生成了我输入的一些CSS,但不是全部。事实证明,内容是在加载时计算的,而不是动态计算的。上面提到的按钮完全刷新了页面,这让我假设样式也会被更新。

    唉,没有。样式表内容似乎是固定的。

    我的问题:

    • 有没有一种方法可以将内联CSS以动态方式放置在标题部分的样式部分中,以便在页面重新加载(完全更新)时重新计算?

    • 是否有一些控件可以让我在head部分添加任意内容?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Sven Hasselbach    7 年前

    只需为标题资源创建自己的渲染器:

    package ch.hasselba.xpages.renderkit;
    
    import com.ibm.commons.util.StringUtil;
    import com.ibm.xsp.complex.Parameter;
    import com.ibm.xsp.render.ResourceRenderer;
    import com.ibm.xsp.resource.GenericHeadResource;
    import com.ibm.xsp.resource.Resource;
    import com.ibm.xsp.util.JSUtil;
    import java.io.IOException;
    import java.util.List;
    import javax.faces.component.UIComponent;
    import javax.faces.context.FacesContext;
    import javax.faces.context.ResponseWriter;
    
    public class GenericHeadResourceRenderer extends ResourceRenderer {
        public void encodeResource(FacesContext fc, UIComponent uiComponent,
                Resource res) throws IOException {
            GenericHeadResource headRes = (GenericHeadResource) res;
            ResponseWriter rw = fc.getResponseWriter();
    
            String tagName = headRes.getTagName();
            if (StringUtil.isNotEmpty(tagName)) {
    
                rw.startElement(tagName, uiComponent);
    
                List<Parameter> params = headRes.getAttributes();
                if (params != null) {
                    for (Parameter param : params) {
                        String name = param.getName();
                        if (StringUtil.isNotEmpty(name)) {
                            String value = param.getValue();
                            if (value == null) {
                                value = "";
                            }
                            if( "content".equals( name ) ){
                                rw.write( value );
                            }else{
                                rw.writeAttribute(name, value, name);
                            }
                        }
                    }
                }
                rw.endElement(tagName);
                JSUtil.writeln(rw);
            }
        }
    }
    

    要激活渲染器,必须覆盖 面配置。xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <faces-config version="1.2" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
    
        <render-kit>
            <renderer>
                <component-family>com.ibm.xsp.resource.Resource</component-family>
                <renderer-type>com.ibm.xsp.resource.GenericHead</renderer-type>
                <renderer-class>ch.hasselba.xpages.renderkit.GenericHeadResourceRenderer</renderer-class>
            </renderer>
        </render-kit>
    
    </faces-config>
    

    所容纳之物 ":

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    
         <xp:this.resources>
             <xp:headTag tagName="style">
                 <xp:this.attributes>
                     <xp:parameter name="type" value="text/css" />
                     <xp:parameter name="content"
                        value="#{javascript:java.lang.System.currentTimeMillis()}" />
                 </xp:this.attributes>
             </xp:headTag>
        </xp:this.resources>
    
    </xp:view>