Skip to content

Commit 890e003

Browse files
VedranVedran
Vedran
authored and
Vedran
committed
#20 absolute positioning added
1 parent 945469a commit 890e003

31 files changed

+688
-110
lines changed

README.md

+15-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Latest version [here](https://github.com/Vatavuk/vgv-xls/releases)
3333
Java version required: 1.8+.
3434

3535

36-
## Example
36+
## Create spreadsheet
3737
```java
3838
new XsWorkbook(
3939
new XsSheet(
@@ -56,13 +56,26 @@ new XsWorkbook(
5656
)
5757
)
5858
)
59-
.with(new XsProps<>(new Height((short) 20)))
59+
.with(new XsProps<>(new Height((short) 500)))
6060
)
6161
).saveTo("Test.xlsx");
6262
```
6363
This is how the result looks like:
6464
<img src="https://i.imgur.com/3hUJkJ2.png"/>
6565

66+
## Read and modify spreadsheet
67+
Read from "Test.xlsx" file and modify cell int the second row/first column.
68+
```java
69+
new XsWorkbook("Test.xlsx")
70+
.with(new XsSheet.ReadFrom(0)
71+
.with(
72+
new XsRow(2,
73+
new TextCell(0, "UPDATED")
74+
)
75+
)
76+
).saveTo("Updated.xlsx");
77+
```
78+
6679
## Custom styles
6780
You can create custom cells/rows/sheets:
6881
```java

src/main/java/com/vgv/xls/ECell.java

-22
Original file line numberDiff line numberDiff line change
@@ -38,28 +38,6 @@
3838
@SuppressWarnings("PMD.AvoidUsingShortType")
3939
public interface ECell {
4040

41-
/**
42-
* Empty cell.
43-
*/
44-
ECell EMPTY = new ECell() {
45-
@Override
46-
public Cell attachTo(final Row row) {
47-
final short index = row.getLastCellNum();
48-
final int position;
49-
if ((int) index < 0) {
50-
position = 0;
51-
} else {
52-
position = (int) index;
53-
}
54-
return row.createCell(position);
55-
}
56-
57-
@Override
58-
public ECell with(final Style style) {
59-
return new ECell.WithStyle(this, style);
60-
}
61-
};
62-
6341
/**
6442
* Attach cell to a row.
6543
* @param row Row

src/main/java/com/vgv/xls/ERow.java

-7
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,6 @@ public interface ERow {
5555
*/
5656
ERow with(ECell... cells);
5757

58-
/**
59-
* Add cell to the row.
60-
* @param cell Cell
61-
* @return Row
62-
*/
63-
ERow with(ECell cell);
64-
6558
/**
6659
* Add cells to the row.
6760
* @param cells Cells

src/main/java/com/vgv/xls/ESheet.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
*/
2424
package com.vgv.xls;
2525

26+
import java.io.IOException;
2627
import org.apache.poi.ss.usermodel.Sheet;
2728
import org.apache.poi.ss.usermodel.Workbook;
2829

@@ -38,8 +39,9 @@ public interface ESheet {
3839
* Attach sheet to a workbook.
3940
* @param workbook Workbook
4041
* @return Sheet
42+
* @throws IOException If fails
4143
*/
42-
Sheet attachTo(Workbook workbook);
44+
Sheet attachTo(Workbook workbook) throws IOException;
4345

4446
/**
4547
* Add row to the sheet.

src/main/java/com/vgv/xls/XsRow.java

+44-13
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,19 @@
3434
*
3535
* <p>This is how you can use it:</p>
3636
*
37-
* new XsRow(new TextCell("txt"), new NumberCell(2))
38-
*
37+
* new XsRow(new TextCell("txt"), new NumberCell(2))
3938
* @author Vedran Grgo Vatavuk (123vgv@gmail.com)
4039
* @version $Id$
4140
* @since 0.1
4241
*/
4342
@SuppressWarnings("PMD.TooManyMethods")
4443
public final class XsRow implements ERow {
4544

45+
/**
46+
* Row position.
47+
*/
48+
private final int index;
49+
4650
/**
4751
* Array of cells.
4852
*/
@@ -56,17 +60,36 @@ public XsRow(final ECell... elements) {
5660
this(new Array<>(elements));
5761
}
5862

63+
/**
64+
* Ctor.
65+
* @param position Row position
66+
* @param elements Cells
67+
*/
68+
public XsRow(final int position, final ECell... elements) {
69+
this(position, new Array<>(elements));
70+
}
71+
5972
/**
6073
* Ctor.
6174
* @param elements Cells
6275
*/
6376
public XsRow(final Iterable<ECell> elements) {
77+
this(-1, new Array<>(elements));
78+
}
79+
80+
/**
81+
* Ctor.
82+
* @param position Row position
83+
* @param elements Cells
84+
*/
85+
public XsRow(final int position, final Iterable<ECell> elements) {
86+
this.index = position;
6487
this.cells = new Array<>(elements);
6588
}
6689

6790
@Override
6891
public Row attachTo(final Sheet sheet) {
69-
final Row row = sheet.createRow(sheet.getLastRowNum() + 1);
92+
final Row row = this.createRow(sheet);
7093
for (final ECell cell : this.cells) {
7194
cell.attachTo(row);
7295
}
@@ -87,11 +110,6 @@ public ERow with(final ECell... elements) {
87110
return new XsRow(this.cells.with(new Array<>(elements)));
88111
}
89112

90-
@Override
91-
public ERow with(final ECell cell) {
92-
return new XsRow(this.cells.with(cell));
93-
}
94-
95113
@Override
96114
public ERow with(final ECells elements) {
97115
return new XsRow(this.cells.with(elements.asArray()));
@@ -103,6 +121,24 @@ public XsRow.WithProps with(final Props<Row> props) {
103121
return new XsRow.WithProps(this, props);
104122
}
105123

124+
/**
125+
* Create new row.
126+
* @param sheet Sheet
127+
* @return Row Row
128+
*/
129+
private Row createRow(final Sheet sheet) {
130+
Row row;
131+
if (this.index == -1) {
132+
row = sheet.createRow(sheet.getLastRowNum() + 1);
133+
} else {
134+
row = sheet.getRow(this.index);
135+
if (row == null) {
136+
row = sheet.createRow(this.index);
137+
}
138+
}
139+
return row;
140+
}
141+
106142
/**
107143
* Row with additional properties.
108144
*/
@@ -145,11 +181,6 @@ public ERow with(final ECell... cells) {
145181
return this.origin.with(cells);
146182
}
147183

148-
@Override
149-
public ERow with(final ECell cell) {
150-
return this.origin.with(cell);
151-
}
152-
153184
@Override
154185
public ERow with(final ECells cells) {
155186
return this.origin.with(cells);

src/main/java/com/vgv/xls/XsSheet.java

+73-1
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@
2424
package com.vgv.xls;
2525

2626
import com.jcabi.immutable.Array;
27+
import java.io.IOException;
2728
import java.util.ArrayList;
2829
import java.util.List;
2930
import org.apache.poi.ss.usermodel.Sheet;
3031
import org.apache.poi.ss.usermodel.Workbook;
32+
import org.cactoos.Func;
33+
import org.cactoos.func.IoCheckedFunc;
3134

3235
/**
3336
* Sheet in an excel table.
@@ -154,7 +157,7 @@ public WithProps(final ESheet sheet, final Props<Sheet> properties) {
154157
}
155158

156159
@Override
157-
public Sheet attachTo(final Workbook workbook) {
160+
public Sheet attachTo(final Workbook workbook) throws IOException {
158161
final Sheet sheet = this.origin.attachTo(workbook);
159162
this.props.accept(sheet);
160163
return sheet;
@@ -170,4 +173,73 @@ public ESheet with(final Style style) {
170173
return this.origin.with(style);
171174
}
172175
}
176+
177+
/**
178+
* Read sheet from existing one by title or index.
179+
*/
180+
public static final class ReadFrom implements ESheet {
181+
182+
/**
183+
* Func.
184+
*/
185+
private final Func<Workbook, Sheet> func;
186+
187+
/**
188+
* Array of rows.
189+
*/
190+
private final Array<ERow> rows;
191+
192+
/**
193+
* Ctor.
194+
* @param title Title
195+
*/
196+
public ReadFrom(final String title) {
197+
this(workbook -> workbook.getSheet(title), new Array<>());
198+
}
199+
200+
/**
201+
* Ctor.
202+
* @param index Index
203+
*/
204+
public ReadFrom(final int index) {
205+
this(workbook -> workbook.getSheetAt(index), new Array<>());
206+
}
207+
208+
/**
209+
* Ctor.
210+
* @param function Function
211+
* @param elements Elements
212+
*/
213+
public ReadFrom(final Func<Workbook, Sheet> function,
214+
final Iterable<ERow> elements) {
215+
this.func = function;
216+
this.rows = new Array<>(elements);
217+
}
218+
219+
@Override
220+
public Sheet attachTo(final Workbook workbook) throws IOException {
221+
final Sheet sheet = new IoCheckedFunc<>(this.func).apply(workbook);
222+
if (sheet == null) {
223+
throw new IOException("Sheet not found on specified index");
224+
}
225+
for (final ERow row : this.rows) {
226+
row.attachTo(sheet);
227+
}
228+
return sheet;
229+
}
230+
231+
@Override
232+
public ESheet with(final ERow row) {
233+
return new XsSheet.ReadFrom(this.func, this.rows.with(row));
234+
}
235+
236+
@Override
237+
public ESheet with(final Style style) {
238+
final List<ERow> elements = new ArrayList<>(this.rows.size());
239+
for (final ERow row : this.rows) {
240+
elements.add(row.with(style));
241+
}
242+
return new XsSheet.ReadFrom(this.func, elements);
243+
}
244+
}
173245
}

src/main/java/com/vgv/xls/XsWorkbook.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,9 @@ public EWorkbook with(final Style style) {
160160
/**
161161
* Attach sheets.
162162
* @param wbook Workbook
163+
* @throws IOException If fails
163164
*/
164-
private void attachSheets(final Workbook wbook) {
165+
private void attachSheets(final Workbook wbook) throws IOException {
165166
for (final ESheet sheet : this.sheets) {
166167
sheet.attachTo(wbook);
167168
}

src/main/java/com/vgv/xls/cells/CalendarCell.java

+16-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
*/
2424
package com.vgv.xls.cells;
2525

26-
import com.vgv.xls.ECell;
2726
import java.util.Calendar;
2827
import org.apache.poi.ss.usermodel.Cell;
2928
import org.apache.poi.ss.usermodel.Row;
@@ -36,6 +35,11 @@
3635
*/
3736
public final class CalendarCell extends AbstractStyleableCell {
3837

38+
/**
39+
* Cell position.
40+
*/
41+
private final int position;
42+
3943
/**
4044
* Calendar value.
4145
*/
@@ -46,13 +50,23 @@ public final class CalendarCell extends AbstractStyleableCell {
4650
* @param calendar Calendar
4751
*/
4852
public CalendarCell(final Calendar calendar) {
53+
this(-1, calendar);
54+
}
55+
56+
/**
57+
* Ctor.
58+
* @param column Cell position
59+
* @param calendar Calendar
60+
*/
61+
public CalendarCell(final int column, final Calendar calendar) {
4962
super();
63+
this.position = column;
5064
this.value = calendar;
5165
}
5266

5367
@Override
5468
public Cell attachTo(final Row row) {
55-
final Cell cell = ECell.EMPTY.attachTo(row);
69+
final Cell cell = new EmptyCell(this.position).attachTo(row);
5670
cell.setCellValue(this.value);
5771
return cell;
5872
}

0 commit comments

Comments
 (0)