需要将 style-tag 放在 XPages 的 head 部分,输出到 Excel
Need to put style-tag in head section in XPages, output goes to Excel
我有一个允许选择查询文档的 XPage。它内部的全文查询从数据库中搜索文档,进行一些计算并将它们显示为屏幕上的视图。屏幕上还有一个设置 requestScope.showExcel=true 并进行完全重新加载的按钮,以便将数据直接下载到 Excel(使用 .setHeader("Content-disposition", "inline; myfile.xls")。它只不过是一个带有 tr 和 td 标签的简单 table。到目前为止还不错。
可以为每列设置列属性(高度、宽度、颜色),这些属性存储在查询文档中(这是一个单独的文档,不是搜索结果的一部分)。这些属性被放入使用 xp:text 控件集创建的 style-tag 元素中以创建 html 输出。
一切正常,除了一件事:Excel 和 OpenOffice 或 LibreOffice Calc 不喜欢正文中的样式部分。当我保存输出并将样式移动到头部时,文件在 Excel.
中加载正常
所以我出去把我们计算的样式放在头部。我找到了 styleSheet 资源及其计算的内容参数。它确实生成了我输入的一些 CSS,但不是全部。事实证明,内容是在加载时计算的,而不是动态计算的。上面提到的按钮会完全刷新页面,这让我假设样式也会更新。
唉,没有。样式表内容似乎是固定的。
我的问题:
有没有办法把inline CSS 动态的放在head section的style section中,这样在页面重新加载的时候重新计算(全更新)?
是否有某种控件可以让我向头部部分添加任意内容?
或者Java有没有动态调整头部的方法??
感谢您的帮助!
只需为您的 header 资源创建您自己的渲染器:
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);
}
}
}
要激活渲染器,您必须覆盖 faces-config 中现有的渲染器。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>
然后,在名称为“content”的参数中添加您想要的动态内容:
<?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>
我有一个允许选择查询文档的 XPage。它内部的全文查询从数据库中搜索文档,进行一些计算并将它们显示为屏幕上的视图。屏幕上还有一个设置 requestScope.showExcel=true 并进行完全重新加载的按钮,以便将数据直接下载到 Excel(使用 .setHeader("Content-disposition", "inline; myfile.xls")。它只不过是一个带有 tr 和 td 标签的简单 table。到目前为止还不错。
可以为每列设置列属性(高度、宽度、颜色),这些属性存储在查询文档中(这是一个单独的文档,不是搜索结果的一部分)。这些属性被放入使用 xp:text 控件集创建的 style-tag 元素中以创建 html 输出。
一切正常,除了一件事:Excel 和 OpenOffice 或 LibreOffice Calc 不喜欢正文中的样式部分。当我保存输出并将样式移动到头部时,文件在 Excel.
中加载正常所以我出去把我们计算的样式放在头部。我找到了 styleSheet 资源及其计算的内容参数。它确实生成了我输入的一些 CSS,但不是全部。事实证明,内容是在加载时计算的,而不是动态计算的。上面提到的按钮会完全刷新页面,这让我假设样式也会更新。
唉,没有。样式表内容似乎是固定的。
我的问题:
有没有办法把inline CSS 动态的放在head section的style section中,这样在页面重新加载的时候重新计算(全更新)?
是否有某种控件可以让我向头部部分添加任意内容?
或者Java有没有动态调整头部的方法??
感谢您的帮助!
只需为您的 header 资源创建您自己的渲染器:
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);
}
}
}
要激活渲染器,您必须覆盖 faces-config 中现有的渲染器。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>
然后,在名称为“content”的参数中添加您想要的动态内容:
<?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>