Seam 3 中的电子表格

作者:    |       Seam

当社区在思考如何为 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和字段名String[]数组,并从这些内容生成工作簿(通过内部游标跟踪坐标)等。

导入和导出

那么我们该做什么呢?当然,导入和导出。我们可以使用以下方法读取工作簿:

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;属性?还有其他内容吗?欢迎您的反馈!


返回顶部