当社区在思考如何为 xhtml 模板的内容交付进行 JSF 无头渲染的问题时,我开始计划如何使 Seam 2 的以 Excel 为中心的电子表格模块在即将推出的 Seam 3 版本中更加通用。这篇博客只是记录了我的头脑风暴过程,我呼吁大家提供反馈,所以如果你在阅读完毕后觉得没有学到什么新东西,请不要惊慌。
模型
在 Seam 2 中,Excel 生成并没有那么多的模型。各种 UI 标签基本上直接与渲染库交互,因此更通用的解决方案的第一步是为电子表格创建一个模型。那么,电子表格应用程序是什么样子呢?答案当然是“这取决于电子表格应用程序”,但大多数应用程序都有一个命名的工作表集合,其中包含各种格式化的单元格集合。让我们从工作簿开始(为了简洁,省略了 getter/setter)
public class Workbook { private List<Worksheet> worksheets = new ArrayList<Worksheet>(); private List<FormattingRule> formattingRules = new ArrayList<FormattingRule>(); }
我们稍后会讨论格式化规则。现在,让我们看看工作表
public class Worksheet { private String name; private List<Cell> cells = new ArrayList<Cell>(); private List<FormattingRule> formattingRules = new ArrayList<FormattingRule>(); }
和单元格
public class Cell { private Coordinate coordinate; private CellSpan span; private CellFormatting formatting; }
坐标是一个类,用于建模(列,行)元组
public class Coordinate { private int column; private int row; }
和单元格跨度用于建模列/行跨度
public class CellSpan { private int columnSpan; private int rowSpan; }
格式化
现在,让我们谈谈格式化。这是由 CellFormatting 类建模的
public class CellFormatting { public enum Type { CASCADING, ABSOLUTE } public Type type = Type.CASCADING; // Lots of formatting objects for Fonts, Borders, Backgrounds etc... }
其中枚举用于标记格式化应该是绝对的还是与之前的规则合并/级联。之前的规则是什么?这就是我在谈论工作簿类时提到的。工作簿和电子表格可以有一个格式化规则列表,这些规则是级联的
public interface FormattingRule { public abstract boolean appliesTo(Cell cell); public abstract CellFormatting getCellFormatting(); }
因此,如果您想使整个工作簿中的所有单元格都具有特定的字体,您需要在工作簿中放置一个FormattingRule的实现,使其适用于所有单元格并返回该字体的格式。然后,如果您想在某个工作表中具有灰色背景的交替行,您可以在该工作表中放置一个FormattingRule的实现,将其应用于单元格.getCoordinate().getRow(),这些行是奇数并返回灰色背景的格式。对于单元格的最后调整,它还可以具有一些合并到最终结果中的格式。
生成模型
当然,您可以手动组装一个Workbook模型,但这会有些繁琐,所以当然会有构建类,可以将JSF表格(带有ICEfaces/RichFaces变体以提供闪亮支持)转换为Workbook。另一个工具是从JavaBean构建器生成的Workbook,它接受Iterable
导入和导出
那么我们该做什么呢?当然,导入和导出。我们可以使用以下方法读取工作簿:
public interface SpreadsheetReader { public abstract Workbook readWorkbook(byte[] data); }
使用以下方法写入工作簿:
public interface SpreadsheetWriter { public abstract byte[] writeWorkbook(Workbook workbook); public abstract byte[] writeWorkbook(Workbook workbook, byte[] template); }
这意味着我们可以有不同的实现,执行不同的任务。可以实现如下:
@Inject SpreadsheetWriter write;
或者
@Inject @Excel SpreadsheetWriter write;
或者
@Inject @OpenOffice SpreadsheetWriter write;
或者,在多个实现的情况下
@Inject @Excel(implementation="jxl") SpreadsheetWriter write;
然后,可以将从这些实现中得出的输出放入数据库、写入用户、发送邮件等。
待解决问题
它是否工作?关于Seam 2模板中的EL内容,是否都可以映射到FormattingRules?关于使用&qquot;rendered&qquot;属性?还有其他内容吗?欢迎您的反馈!