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

Java 需要将样式标记放在XPages的头部分,输出到Excel,java,xpages,Java,Xpages,我有一个XPage,可以选择查询文档。其中的全文查询从数据库中搜索文档,进行一些计算,并在屏幕上显示为视图。屏幕上还有一个按钮,用于设置requestScope.showExcel=true并进行完全重新加载,以便将数据直接下载到Excel(使用.setHeader(“Content disposition”,“inline;myfile.xls”)。它只不过是一个带有tr和td标记的简单表。到目前为止还不错 可以为每列设置列属性(高度、宽度、颜色),这些属性存储在查询文档中(这是一个单独的文档

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

可以为每列设置列属性(高度、宽度、颜色),这些属性存储在查询文档中(这是一个单独的文档,不是搜索结果的一部分)。这些属性被放入使用xp:text控件集创建的样式标记元素中,以创建html输出

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

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

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

我的问题是:

  • 是否有一种方法可以将内联CSS以动态方式放入head部分的样式部分,以便在重新加载页面(完全更新)时重新计算它

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

  • 或者Java中有没有一种方法可以动态调整头部部分


感谢您的帮助!

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

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);
        }
    }
}
包ch.hasselba.xpages.renderkit;
导入com.ibm.commons.util.StringUtil;
导入com.ibm.xsp.complex.Parameter;
导入com.ibm.xsp.render.ResourceRenderer;
导入com.ibm.xsp.resource.GenericHeadResource;
导入com.ibm.xsp.resource.resource;
导入com.ibm.xsp.util.JSUtil;
导入java.io.IOException;
导入java.util.List;
导入javax.faces.component.UIComponent;
导入javax.faces.context.FacesContext;
导入javax.faces.context.ResponseWriter;
公共类GenericHeadResourceRenderer扩展了ResourceRenderer{
公共资源(FacesContext fc、UIComponent、UIComponent、,
资源(res)抛出IOException{
GenericHeadResource头枕=(GenericHeadResource)res;
ResponseWriter rw=fc.getResponseWriter();
字符串标记名=headles.getTagName();
if(StringUtil.isNotEmpty(标记名)){
rw.startElement(标记名,uiComponent);
List params=headles.getAttributes();
如果(参数!=null){
用于(参数参数:params){
字符串名称=param.getName();
if(StringUtil.isNotEmpty(名称)){
字符串值=param.getValue();
如果(值==null){
value=“”;
}
如果(“内容”。等于(名称)){
rw.写入(值);
}否则{
rw.writeAttribute(名称、值、名称);
}
}
}
}
rw.endElement(标记名);
JSUtil.writeln(rw);
}
}
}
要激活渲染器,必须覆盖faces-config.xml中的现有渲染器:


com.ibm.xsp.resource.resource
com.ibm.xsp.resource.generihead
ch.hasselba.xpages.renderkit.GenericHeadResourceRenderer
然后,在名为“content”的参数中添加所需的动态内容:


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

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);
        }
    }
}
包ch.hasselba.xpages.renderkit;
导入com.ibm.commons.util.StringUtil;
导入com.ibm.xsp.complex.Parameter;
导入com.ibm.xsp.render.ResourceRenderer;
导入com.ibm.xsp.resource.GenericHeadResource;
导入com.ibm.xsp.resource.resource;
导入com.ibm.xsp.util.JSUtil;
导入java.io.IOException;
导入java.util.List;
导入javax.faces.component.UIComponent;
导入javax.faces.context.FacesContext;
导入javax.faces.context.ResponseWriter;
公共类GenericHeadResourceRenderer扩展了ResourceRenderer{
公共资源(FacesContext fc、UIComponent、UIComponent、,
资源(res)抛出IOException{
GenericHeadResource头枕=(GenericHeadResource)res;
ResponseWriter rw=fc.getResponseWriter();
字符串标记名=headles.getTagName();
if(StringUtil.isNotEmpty(标记名)){
rw.startElement(标记名,uiComponent);
List params=headles.getAttributes();
如果(参数!=null){
用于(参数参数:params){
字符串名称=param.getName();
if(StringUtil.isNotEmpty(名称)){
字符串值=param.getValue();
如果(值==null){
value=“”;
}
如果(“内容”。等于(名称)){
rw.写入(值);
}否则{
rw.writeAttribute(名称、值、名称);
}
}
}
}
rw.endElement(标记名);
JSUtil.writeln(rw);
}
}
}
要激活渲染器,您必须
<?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>