XLSReader 추가(진행 중)

master
mjkhan21 6 months ago
parent a765f9f288
commit 858a3fdb95

@ -4,6 +4,8 @@ import org.apache.poi.ooxml.POIXMLDocumentPart.RelationPart;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.xssf.streaming.SXSSFDrawing;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFComment;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFRelation;
@ -32,7 +34,8 @@ public class Comment {
*/
public Comment(XLS writer) {
this.xlsx = writer;
workbook = this.xlsx.workbook.getXSSFWorkbook();
if (this.xlsx.workbook instanceof SXSSFWorkbook swb)
workbook = swb.getXSSFWorkbook();
factory = workbook.getCreationHelper();
anchor = factory.createClientAnchor();
image = new XLS.Image(this.xlsx);
@ -50,7 +53,7 @@ public class Comment {
anchor.setCol1(col);
anchor.setCol2(col + 6);
SXSSFDrawing drawing = xlsx.worksheet.createDrawingPatriarch();
SXSSFDrawing drawing = xlsx.worksheet instanceof SXSSFSheet sst ? sst.createDrawingPatriarch() : null;
XSSFComment comment = (XSSFComment)drawing.createCellComment(anchor);
comment.setString(str);
xlsx.cell.setCellComment(comment);
@ -64,7 +67,7 @@ public class Comment {
public void setBackgroundImage(String title, String path) {
int picIndex = image.add(path);
XSSFPictureData pic = workbook.getAllPictures().get(picIndex);
XSSFVMLDrawing vml = xlsx.worksheet.getVMLDrawing(true);
XSSFVMLDrawing vml = xlsx.worksheet instanceof SXSSFSheet sst ? sst.getVMLDrawing(true) : null;
RelationPart rp = vml.addRelation(null, XSSFRelation.IMAGES, pic);
int row = xlsx.cell.getRowIndex();

@ -4,8 +4,10 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@ -21,13 +23,13 @@ public abstract class XLS extends AbstractComponent {
/**메모리에 적재하는 row의 갯수*/
protected int rowAccessWindowSize = 128;
/**워크북*/
protected SXSSFWorkbook workbook;
protected Workbook workbook;
/**현재 처리 중인 워크시트*/
protected SXSSFSheet worksheet;
protected Sheet worksheet;
/**현재 처리 중인 row*/
protected SXSSFRow row;
protected Row row;
/**현재 처리 중인 cell*/
protected SXSSFCell cell;
protected Cell cell;
/** InputStream .
* @param <T> XLS
@ -59,13 +61,14 @@ public abstract class XLS extends AbstractComponent {
/** .
* @return
*/
public SXSSFWorkbook workbook() {
public Workbook workbook() {
if (workbook != null)
return workbook;
try {
workbook = newWorkbook(null);
workbook.setCompressTempFiles(true);
if (workbook instanceof SXSSFWorkbook swb)
swb.setCompressTempFiles(true);
return workbook;
} catch (Exception e) {
throw runtimeException(e);
@ -76,10 +79,8 @@ public abstract class XLS extends AbstractComponent {
* @return
* @throws Exception
*/
protected SXSSFWorkbook newWorkbook(InputStream input) throws Exception {
return input == null ?
new SXSSFWorkbook(rowAccessWindowSize) :
new SXSSFWorkbook(new XSSFWorkbook(input), rowAccessWindowSize);
protected Workbook newWorkbook(InputStream input) throws Exception {
return new XSSFWorkbook(input);
}
/** .
@ -88,12 +89,13 @@ public abstract class XLS extends AbstractComponent {
* @return
*/
public XLS worksheet(int index) {
SXSSFSheet sheet = null;
Sheet sheet = null;
try {
sheet = workbook().getSheetAt(index);
} catch (Exception e) {
sheet = workbook().createSheet();
sheet.setRandomAccessWindowSize(rowAccessWindowSize);
if (sheet instanceof SXSSFSheet sst)
sst.setRandomAccessWindowSize(rowAccessWindowSize);
}
if (!sheet.equals(worksheet)) {
@ -110,13 +112,14 @@ public abstract class XLS extends AbstractComponent {
* @return
*/
public XLS worksheet(String name) {
SXSSFSheet sheet = null;
Sheet sheet = null;
try {
SXSSFWorkbook wb = workbook();
Workbook wb = workbook();
sheet = wb.getSheet(name);
if (sheet == null) {
sheet = wb.createSheet(name);
sheet.setRandomAccessWindowSize(rowAccessWindowSize);
if (sheet instanceof SXSSFSheet sst)
sst.setRandomAccessWindowSize(rowAccessWindowSize);
}
if (!sheet.equals(worksheet)) {

@ -0,0 +1,60 @@
package cokr.xit.base.docs.xls;
import java.io.File;
import java.io.InputStream;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
public class XLSReader extends XLS {
public XLSReader open(InputStream input) {
load(input);
return this;
}
public XLSReader open(File file) {
load(file);
return this;
}
@Override
public XLSReader worksheet(int index) {
super.worksheet(index);
return this;
}
@Override
public XLSReader worksheet(String name) {
super.worksheet(name);
return this;
}
@Override
public XLSReader row(int index) {
super.row(index);
return this;
}
@Override
public XLSReader col(int index) {
super.col(index);
return this;
}
@Override
public XLSReader cell(int row, int col) {
return row(row).col(col);
}
public String valueOf(Cell cell) {
return switch (cell.getCellType()) {
case STRING -> cell.getStringCellValue();
case NUMERIC -> DateUtil.isCellDateFormatted(cell) ?
cell.getDateCellValue().toString() :
String.valueOf(cell.getNumericCellValue());
case BOOLEAN -> String.valueOf(cell.getBooleanCellValue());
case FORMULA -> cell.getCellFormula();
default -> "";
};
}
}

@ -15,7 +15,11 @@ import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import cokr.xit.foundation.Downloadable;
@ -43,6 +47,13 @@ public class XLSWriter extends XLS {
return this;
}
@Override
protected Workbook newWorkbook(InputStream input) throws Exception {
return input == null ?
new SXSSFWorkbook(rowAccessWindowSize) :
new SXSSFWorkbook(new XSSFWorkbook(input), rowAccessWindowSize);
}
@Override
public XLSWriter worksheet(int index) {
super.worksheet(index);
@ -327,8 +338,8 @@ public class XLSWriter extends XLS {
* @return XLSWriter
*/
public XLSWriter trackWidth(int... cols) {
if (!isEmpty(cols))
worksheet.trackColumnsForAutoSizing(trackWidths = IntStream.of(cols).boxed().collect(Collectors.toCollection(LinkedHashSet<Integer>::new)));
if (!isEmpty(cols) && worksheet instanceof SXSSFSheet sst)
sst.trackColumnsForAutoSizing(trackWidths = IntStream.of(cols).boxed().collect(Collectors.toCollection(LinkedHashSet<Integer>::new)));
return this;
}
@ -348,7 +359,8 @@ public class XLSWriter extends XLS {
public void write(OutputStream out) {
try {
workbook.write(out);
workbook.dispose();
if (workbook instanceof SXSSFWorkbook swb)
swb.dispose();
} catch (Exception e) {
throw runtimeException(e);
} finally {
@ -372,8 +384,8 @@ public class XLSWriter extends XLS {
@Override
protected void clear(boolean all) {
if (trackWidths != null)
worksheet.untrackColumnsForAutoSizing(trackWidths);
if (trackWidths != null && worksheet instanceof SXSSFSheet sst)
sst.untrackColumnsForAutoSizing(trackWidths);
super.clear(all);
trackWidths = null;
}

@ -182,6 +182,14 @@ public class XLSTest {
xlsx.write(file("xlsx-test.xlsx"));
}
@Test
void read() {
XLSReader xlsx = new XLSReader()
.open(new File("src\\test\\resources\\file\\xlsx-test.xlsx"))
.worksheet(0)
.cell(0, 0);
}
static class TestObject {
private String
field1,

Loading…
Cancel
Save