Skip to content

Commit

Permalink
support merge cells
Browse files Browse the repository at this point in the history
  • Loading branch information
Chao Yang committed Nov 20, 2020
1 parent c9f4cf8 commit f83c6d7
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 2 deletions.
10 changes: 10 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,16 @@ header {
</@style>
```

### merge cells

```
<@c colspan=2></@c>
```

```
<@c rowspan=4></@c>
```

### Hyperlink

// TODO
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/ooxml/CellDirective.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,17 @@ public void execute(Environment env, Map params, TemplateModel[] loopVars, Templ

StringModel model = ((StringModel) env.getDataModel().get("workbook"));
Workbook workbook = (Workbook) model.getWrappedObject();
StringModel worksheetmodel = ((StringModel) env.getDataModel().get("worksheet"));
Worksheet worksheet = (Worksheet) worksheetmodel.getWrappedObject();

if(params.get("rowspan") != null) {
int rowspan = Integer.parseInt(((SimpleScalar) params.get("rowspan")).getAsString());
worksheet.createRowSpan(row, column, rowspan);
}
if(params.get("colspan") != null) {
int colspan = Integer.parseInt(((SimpleScalar) params.get("colspan")).getAsString());
worksheet.createColSpan(row, column, colspan);
}

StringWriter writer = new StringWriter();

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/ooxml/Workbook.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ public File render() throws IOException, TemplateException {
Map<String, Object> context = new HashMap<>();
context.put("data", worksheet.getData());
context.put("workbook", this);
context.put("worksheet", worksheet);
context.put("mergeCells", worksheet.getMergeCells());
context.put("si", new SharedStringDirective()); // custom directive
context.put("c", new CellDirective()); // custom directive
template.process(context, new FileWriter(tmp.toString() + "/xl/worksheets/sheet" + i +".xml"));
Expand Down
60 changes: 59 additions & 1 deletion src/main/java/ooxml/Worksheet.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,12 @@
import lombok.RequiredArgsConstructor;
import lombok.Setter;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

import static java.lang.String.format;
import static ooxml.Cell.FORMULA;
import static ooxml.Cell.NUMBER;
import static ooxml.Cell.SHARED_STRING;
Expand All @@ -20,7 +23,62 @@ public class Worksheet<T> {
private final Workbook workbook;
private final String name;
@Setter
private List<T> data = new LinkedList<>();
private List<T> data = new ArrayList<>();

private List<String> mergeCells = new ArrayList<>();

void createColSpan(int row, int col, int colSpan) {
createColSpan(row, String.valueOf(CHARS.charAt(col-1)), colSpan);
}

void createColSpan(int row, String col, int colSpan) {
mergeCells.add(format("%s%d:%s%d", col, row, nextCol(col, colSpan - 1), row));
}

void createRowSpan(int row, int col, int rowSpan) {
createRowSpan(row, String.valueOf(CHARS.charAt(col-1)), rowSpan);
}

void createRowSpan(int row, String col, int rowSpan) {
mergeCells.add(format("%s%d:%s%d", col, row, col, row + rowSpan - 1));
}

private final static String CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

private final static String nextCol(String col, int delta) {
for(int i = 0; i < delta; ++i) {
col = nextCol(col);
}
return col;
}

private final static String nextCol(String col) {
String reverse = new StringBuilder(col).reverse().toString();
char[] chars = reverse.toCharArray();
int remaining = 1;
for(int i = 0; i < chars.length; ++i) {
char ch = chars[i];
int index = CHARS.indexOf(ch);
if(remaining == 1) {
if(ch != 'Z') {
chars[i] = CHARS.charAt(index + 1);
return new StringBuilder(String.valueOf(chars)).reverse().toString();
}
chars[i] = 'A';
remaining = 1;
}
}
return "A" + new StringBuilder(String.valueOf(chars)).reverse().toString();
}

public static void main(String[] args) {
System.out.println(nextCol("B"));
System.out.println(nextCol("Z"));
System.out.println(nextCol("AB"));
System.out.println(nextCol("AZ"));
System.out.println(nextCol("BB"));
System.out.println(nextCol("BZ"));
System.out.println(nextCol("ABD"));
System.out.println(nextCol("ABZ"));
}
}
5 changes: 4 additions & 1 deletion src/test/resources/sheet1.xml.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@
${row.doubleTime}
</@c>

<@c t="str" s="5" r="${i}" c="5" f="SUM(B${i}:D${i})">
<@c t="str" s="5" r="${i}" c="5" f="SUM(B${i}:D${i})" colspan="3">
${row.total}
</@c>
</row>
Expand All @@ -151,6 +151,9 @@
</sheetData>
<mergeCells>
<mergeCell ref="B1:D1"/>
<#list mergeCells as mergeCell>
<mergeCell ref="${mergeCell}"/>
</#list>
</mergeCells>
<hyperlinks>
<hyperlink ref="E1" r:id="rId2"/>
Expand Down

0 comments on commit f83c6d7

Please sign in to comment.