package com.oscer.util.html;
interface HTMLRendable {
String beginTag();
String renderBody();
String endTag();
String render();
}
class HTMLTable implements HTMLRendable {
// html style="xxx:bbb,ccc:aaa"
Map style = new LinkedHashMap();
// Row -> Columns
Map> sheet = new LinkedHashMap();
// constructor
// methods
public void insert(int rowNumber, int columnNumber, Cell cell) {
// 表格自动处理大小,自动扩展行列
}
public void insert(int rowNumber, int colNumber, String cellValue, String styles) {
// 接受String数据值,styles形式的样式
}
public Cell getCell(int rowNumber, int colNumber) {
}
public void setGlobaCellStyle(Map styles) {
// 全局 cell 单元格默认样式
}
public String beginTag() {
StringBuilder sb = new ...;
sb.append("
foreach style -> k
sb.append(k + ":" + style.get(k).toString() + ";");
}
public String renderBody() {
StringBuilder sb = new ...;
foreach sheet -> row
sb.append("
");foreach row -> cell
sb.append(cell.render());
sb.append(
);return sb.toString();
}
public String endTag() {
return "
"}
public String render() {
StringBuilder sb = new ...;
sb.append(this.beginTag);
sb.renderBody();
sb.endTag();
}
}
class Cell implements HTMLRendable {
Map style = new LinkedHashMap();
String title;
Object value;
// constructor
// methods
// bean getter/setter
public String beginTag() {
StringBuilder sb = new ...;
sb.append("
foreach style -> k
sb.append(k + ":" + style.get(k).toString() + ";");
}
public String renderBody() {
return value != null ? value.toString() : "";
}
public String endTag() {
return "
"}
public String render() {
StringBuilder sb = new ...;
sb.append(this.beginTag);
sb.renderBody();
sb.endTag();
}
}
// test
HTMLTable t = new HTMLTable();
t.insert(0,0, "User1", "color:red;font-weight: bold");
t.insert(0,1, "oschina.net", "color:blue,text-decoration:underline");
String html = t.render();
System.out.println(html);
手写的,伪代码不可避免,但是看懂了就觉得毫无逻辑复杂度可言。