๊ฐ๋ฐ/Java
[Spring] ์คํ๋ง ์์ POI ์คํ์ผ, ํฐํธ ์ ์ฉ(POI ๋ผ์ด๋ธ๋ฌ๋ฆฌ 2ํธ) :: ๋ง์ด์๋ชฝ
๐ปโ
2019. 4. 28. 18:57
POI ์ ์คํ์ผ, ํฐํธ ์ ์ฉ
POI ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ 1ํธ์์ ์์
ํ์ผ์ ๋ง๋ค์ด ๋ค์ด๋ก๋ ๊ทธ๋ฆฌ๊ณ ์
๋ก๋ํด์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ์์
์ ์งํํ๋ค.
์คํ์ผ ๋ฐ ํฐํธ์ ์ฉ์ ์ ๊ธ์์ ์ด์ด์ง๋ ๋ด์ฉ์ด๋ฏ๋ก ์์ง ์์ ๋ค์ด๋ก๋ ๊ธฐ๋ฅ์ด ์๋ฃ๋์ง ์์๋ค๋ฉด ํด๋น ๊ธ์ ํ์ธํ์ฌ ์ค์ต์ ์งํํ๋ค.
์ด๋ฒ๊ธ์์๋ ์์ ๋ค์ด๋ก๋๋ฅผ ๋ฐ์๋ ์คํ์ผ๋ง๊ณผ ํฐํธ๋ฅผ ์ค์ ํด์ ๋ฐ์์ ์๊ฒ POI๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ค์ต์ ํตํด ์ฝ๋๋ฅผ ์์ฑํด๋ณผ๊ฒ์ด๋ค. ํด๋น ์ค์ต์ POI๋ผ์ด๋ธ๋ฌ๋ฆฌ 4.0.0 ๋ฒ์ ์ ์ฌ์ฉํ๋ค.
์์ ๋ค์ด๋ก๋ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ
์ด๋ฒ ์ค์ต์ ํตํด ๋ณํฉ, ์
์คํ์ผ๋ง, ํฐํธ๋ฅผ ์์ ํด์ ์๋์ ๊ฐ์ ์์
ํ์ผ์ ๋ง๋ค์ด๋ณผ๋ ค๊ณ ํ๋ค.
SXSSFWorkbook ์ํฌ๋ถ ์์ฑ
1ํธ์ ๊ฐ๋ตํ ๋ด์ฉ์ POI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ SXSSFWorkbook ๊ฐ์ฒด๋ฅผ OutpuStream์ ํตํด ํ์ผ๋ก ๋ด๋ณด๋ด๋ ๊ฒ์ด๋ค.
์ฐ์ ์ํฌ๋ถ๊ฐ์ฒด๋ฅผ ์์ฑํด์ฃผ๊ณ ์ํฌ๋ถ ๋ด์ ์ํธ๋ฅผ ์์ฑํ๋ค.
์ด ํญ ์ธํ
์ ์ํด ์ํธ์ setColumWidth(ํด๋น ์ด, ํญ) ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ค.
SXSSFWorkbook workbook = new SXSSFWorkbook();
// ์ํธ ์์ฑ
SXSSFSheet sheet = workbook.createSheet("๊ณผ์ผํ");
// ์ด ํญ ์์
sheet.setColumnWidth(3, 6000);
sheet.setColumnWidth(4, 7000);
sheet.setColumnWidth(5, 8000);
sheet.setColumnWidth(6, 6000);
CellStyle ์ ๋ ฌ Alignment
CellStyle ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ Alignment ์ธํ
ํ๋ ํจ์๋ฅผ ํธ์ถํด์ ์ธ์๊ฐ์ ๋ฃ์ด์ค๋ค.
POI๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ์คํ์ผ ๋ฐ ํฐํธ ๊ทธ๋ฆฌ๊ณ ๊ธฐํ ๋ค๋ฅธ ์ค์ ๊ฐ์ ์ธํ
ํ ๋ POI๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด์ Enum์ ์ฌ์ฉํ๋ค.
์๋๋ Horizontal Alignment(๊ฐ๋ก)์ VerticalAlignment(์ธ๋ก)๋ฅผ ๋ชจ๋ ๊ฐ์ด๋ฐ ์ ๋ ฌ ์์ผฐ๋ค.
CellStyle mergeRowStyle1 = workbook.createCellStyle();
mergeRowStyle1.setAlignment(HorizontalAlignment.CENTER);
mergeRowStyle1.setVerticalAlignment(VerticalAlignment.CENTER);
CellStyle ํ ๋๋ฆฌ Border
ํ ๋๋ฆฌ๋ ๊ฐ ์ ๋ง๋ค ์ํ์ข์ฐ ๋ชจ๋ ์ค์ ํด์ค๋ค.
setBorderTop, Bottom, Left, Right ๋ฉ์๋์ ์ธ์๋ก POi๋ผ์ด๋ธ๋ฌ๋ฆฌ์ BorderStyle ์ธ์๋ฅผ ๋ฃ์ด์ ์ ์ฉํ๋ค.
CellStyle mergeRowStyle1 = workbook.createCellStyle();
mergeRowStyle1.setBorderTop(BorderStyle.THICK);
mergeRowStyle1.setBorderLeft(BorderStyle.MEDIUM_DASH_DOT_DOT);
CellStyle ๋ฐฐ๊ฒฝ์ ForegroundColor
๋ฐฐ๊ฒฝ์์ ์
ํ๋๋ฐ ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
-ํ๋๋ POI๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ด์ฌ๋์ด ์๋ Enum์ ์ฌ์ฉํด์ ์ฃผ์ด์ง ๋ํ ์์ ์
ํ๋ ๊ฒ.
-๋๋ฒ์งธ๋ XSSFColor ๊ฐ์ฒด๋ฅผ ์์ฑํด์ rgb ์ปฌ๋ฌ๋ฅผ ์ฌ์ฉํ๋๊ฒ
ForegroundColor ์ฃผ์ด์ง ๋ํ์
setFillForegroundColor ๋ฉ์๋์ IndexedColors Enum์ธ์๋ฅผ ์ฌ์ฉํ๋ค.
setFillPattern์ ํด๋น ์์ ์ด๋ค ํจํด์ผ๋ก ์
ํ์ง๋ฅผ ์ ํ๋ค.
CellStyle mergeRowStyle1 = workbook.createCellStyle();
mergeRowStyle1.setFillForegroundColor(IndexedColors.AQUA.getIndex());
mergeRowStyle1.setFillPattern(FillPatternType.BRICKS);
ForegroundColor rgb ์ปฌ๋ฌ
rgb์ปฌ๋ฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ธฐ์กด CellStyle์ด ์๋ XSSFCellStyle์ ์ฌ์ฉํด์ค๋ค.
๋๊ฐ์ด setFillForegroundColor ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ฐ ์ธ์๋ก XSSFColor ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ๋ง๋ค์ด์ค๋ค.
XSSFColor ๊ฐ์ฒด์๋ ๋ฐ์ดํธ ๋ฐฐ์ดํํ๋ก rgb ์์น๋ฅผ ๋ฃ์ด์ค๋ค.
XSSFCellStyle mergeRowStyle2 = (XSSFCellStyle) workbook.createCellStyle();
mergeRowStyle2.setFillForegroundColor(new XSSFColor(new byte[] {(byte) 192,(byte) 192,(byte) 192}, null));
mergeRowStyle2.setFillPattern(FillPatternType.FINE_DOTS);
Cell Font ํฐํธ ์ค์
ํฐํธ ์ ์ฉ์ ์ํด POI ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Font ๊ฐ์ฒด๋ฅผ ์์ฑํด์ค๋ค.
ํด๋น ๊ฐ์ฒด์ ์ธํฐ๋ฅผ ์ฌ์ฉํด ํฐํธ๋ฅผ ์ค์ ํด์ค๋ค. ๋ํ์ ์ผ๋ก ๊ธ์จ์ฒด, ํฌ๊ธฐ, ์์, ๊ตต๊ธฐ๋ง ์ค์ ํ๋ค.
์ดํ CellStyle์ setFont ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ธ์๋ก ํฐํธ๋ฅผ ๋ฃ์ด์ค๋ค.
Font headerFont = workbook.createFont();
headerFont.setFontName("๋๋๊ณ ๋");
headerFont.setFontHeight((short)1000);
headerFont.setColor(IndexedColors.GREEN.getIndex());
headerFont.setBold(true);
CellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFont(headerFont);
Cell Merge ์ ๋ณํฉ
์
๋ณํฉ์ ์ํธ์ addMergeRegion ๋ฉ์๋์ CellRangeAddress ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ํ์ฌ ๋ณํฉ์ํจ๋ค.
CellRangeAddress ์์ฑ์์ ์ธ์๋ก(์์ ํ, ๋ ํ, ์์ ์ด, ๋ ์ด) ์์๋๋ก ๋ฃ์ด์ ๋ณํฉ์ํฌ ๋ฒ์๋ฅผ ์ ํ๋ค. ๋ฐฐ์ด์์์ ๊ฐ์ด ์์์ 0๋ถํฐ์ด๋ค.
์
๋ณํฉํ ๋ ์กฐ๊ธ์ ๊ท์ฐฎ์ง๋ง ์คํ์ผ์ด ๋ฐ๋ก ๋ค ์ ์ฉ๋์ง ์๋๋ค. ๋ณํฉ๋๋๋ผ๋ ์
์ ์์น๋ง ๋ฑ ์ ์ฉ๋์ด for๋ฌธ์ ์ฌ์ฉํด์ ๋ณํฉ๋ ๋ชจ๋ ์์น์ ์
์คํ์ผ์ ๋ชจ๋ ์ ์ฉํด์ฃผ์. ์ฃผ์์ฌํญ์ผ๋ก ์
์ ๋ด์ฉ์ ์ผ์ชฝ ๊ฐ์ฅ ์๋จ ์
์ ๋ด์ฉ์ด ๋ณด์ฌ์ง๋ฏ๋ก for๋ฌธ์ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ฃผ์. ํ์๋ ๊ท์ฐฎ์์ ๊ทธ๋ฅ for๋ฌธ์ ์ถ๊ฐํด๋ฒ๋ฆผ.
// ํ ์ถ์ ์ ์ํ ๋ณ
int rowLocation = 0;
Row row = null;
Cell cell = null;
// ๋ณํฉ ํ
row = sheet.createRow(++rowLocation);
// ๊ณผ์ผ์ฅํ ๋ณํฉ ์์
for(int i=1; i<3; i++) {
cell = row.createCell(i);
cell.setCellStyle(mergeRowStyle1);
cell.setCellValue("๊ณผ์ผ์ฅํ");
}
sheet.addMergedRegion(new CellRangeAddress(1, (list.size() + 1 + 1), 1, 2)); // ํ์์, ํ๋, ์ด์์, ์ด๋
// ๊ณผ์ผ ๋ชฉ๋ก ๋ณํฉ ์์
for(int i=3; i<7; i++) {
cell = row.createCell(i);
cell.setCellStyle(mergeRowStyle2);
cell.setCellValue("๊ณผ์ผ ๋ชฉ๋ก");
}
sheet.addMergedRegion(new CellRangeAddress(1, 1, 3, 6));
์ต์ข ๊ฒฐ๊ณผ๋ฌผ ์ ์ฒด์ฝ๋
์ํฌ๋ถ์ ๋ง๋๋ ๋ฉ์๋์ด๋ค.
ํด๋น ๋ฉ์๋๋ฅผ ๋ค์ด๋ฐ๋ ๊ณผ์ ์ ์ด์ 1ํธ์ ๋ด์ฉ์ ํ์ธํ์.
public SXSSFWorkbook makeSimpleFruitExcelWorkbookWithStyles(List<Fruit> list) {
SXSSFWorkbook workbook = new SXSSFWorkbook();
// ์ํธ ์์ฑ
SXSSFSheet sheet = workbook.createSheet("๊ณผ์ผํ");
// ์ด ํญ ์์
sheet.setColumnWidth(3, 6000);
sheet.setColumnWidth(4, 7000);
sheet.setColumnWidth(5, 8000);
sheet.setColumnWidth(6, 6000);
// ๊ณผ์ผ์ฅํ ์คํ์ผ
CellStyle mergeRowStyle1 = workbook.createCellStyle();
mergeRowStyle1.setAlignment(HorizontalAlignment.CENTER);
mergeRowStyle1.setVerticalAlignment(VerticalAlignment.CENTER);
mergeRowStyle1.setBorderTop(BorderStyle.THICK);
mergeRowStyle1.setBorderLeft(BorderStyle.MEDIUM_DASH_DOT_DOT);
mergeRowStyle1.setFillForegroundColor(IndexedColors.AQUA.getIndex());
mergeRowStyle1.setFillPattern(FillPatternType.BRICKS);
XSSFCellStyle mergeRowStyle2 = (XSSFCellStyle) workbook.createCellStyle();
mergeRowStyle2.setAlignment(HorizontalAlignment.CENTER);
mergeRowStyle2.setVerticalAlignment(VerticalAlignment.TOP);
mergeRowStyle2.setBorderTop(BorderStyle.THIN);
mergeRowStyle2.setBorderLeft(BorderStyle.DOTTED);
mergeRowStyle2.setBorderBottom(BorderStyle.SLANTED_DASH_DOT);
mergeRowStyle2.setBorderRight(BorderStyle.HAIR);
mergeRowStyle2.setFillForegroundColor(new XSSFColor(new byte[] {(byte) 192,(byte) 192,(byte) 192}, null));
mergeRowStyle2.setFillPattern(FillPatternType.FINE_DOTS);
Font headerFont = workbook.createFont();
headerFont.setFontName("๋๋๊ณ ๋");
headerFont.setFontHeight((short)1000);
headerFont.setColor(IndexedColors.GREEN.getIndex());
headerFont.setBold(true);
CellStyle headerStyle = workbook.createCellStyle();
headerStyle.setAlignment(HorizontalAlignment.LEFT);
headerStyle.setVerticalAlignment(VerticalAlignment.BOTTOM);
headerStyle.setBorderLeft(BorderStyle.DASH_DOT);
headerStyle.setBorderBottom(BorderStyle.MEDIUM);
headerStyle.setBorderRight(BorderStyle.MEDIUM_DASH_DOT);
headerStyle.setFont(headerFont);
CellStyle bodyStyle = workbook.createCellStyle();
bodyStyle.setAlignment(HorizontalAlignment.CENTER);
bodyStyle.setVerticalAlignment(VerticalAlignment.CENTER);
bodyStyle.setBorderTop(BorderStyle.THIN);
bodyStyle.setBorderBottom(BorderStyle.THIN);
bodyStyle.setBorderLeft(BorderStyle.THIN);
bodyStyle.setBorderRight(BorderStyle.THIN);
// ํ ์ถ์ ์ ์ํ ๋ณ
int rowLocation = 0;
Row row = null;
Cell cell = null;
// ๋ณํฉ ํ
row = sheet.createRow(++rowLocation);
// ๊ณผ์ผ์ฅํ ๋ณํฉ ์์
for(int i=1; i<3; i++) {
cell = row.createCell(i);
cell.setCellStyle(mergeRowStyle1);
cell.setCellValue("๊ณผ์ผ์ฅํ");
}
sheet.addMergedRegion(new CellRangeAddress(1, (list.size() + 1 + 1), 1, 2)); // ํ์์, ํ๋, ์ด์์, ์ด๋
// ๊ณผ์ผ ๋ชฉ๋ก ๋ณํฉ ์์
for(int i=3; i<7; i++) {
cell = row.createCell(i);
cell.setCellStyle(mergeRowStyle2);
cell.setCellValue("๊ณผ์ผ ๋ชฉ๋ก");
}
sheet.addMergedRegion(new CellRangeAddress(1, 1, 3, 6));
// ํค๋ ํ
row = sheet.createRow(++rowLocation);
cell = row.createCell(3);
cell.setCellValue("๋ฒํธ");
cell.setCellStyle(headerStyle);
cell = row.createCell(4);
cell.setCellValue("์ด๋ฆ");
cell.setCellStyle(headerStyle);
cell = row.createCell(5);
cell.setCellValue("๊ฐ๊ฒฉ");
cell.setCellStyle(headerStyle);
cell = row.createCell(6);
cell.setCellValue("์๋");
cell.setCellStyle(headerStyle);
// ๋ด์ฉ ํ
for(int i=0; i<list.size(); i++) {
Fruit fruit = list.get(i);
// ํ ์์ฑ
row = sheet.createRow(++rowLocation);
// ๋ฐ์ดํฐ ๋ฒํธ ํ์
cell = row.createCell(3);
cell.setCellValue(i + 1);
cell.setCellStyle(bodyStyle);
// ๋ฐ์ดํฐ ์ด๋ฆ ํ์
cell = row.createCell(4);
cell.setCellValue(fruit.getName());
cell.setCellStyle(bodyStyle);
// ๋ฐ์ดํฐ ๊ฐ๊ฒฉ ํ์
cell = row.createCell(5);
cell.setCellValue(fruit.getPrice());
cell.setCellStyle(bodyStyle);
// ๋ฐ์ดํฐ ์๋ ํ์
cell = row.createCell(6);
cell.setCellValue(fruit.getQuantity());
cell.setCellStyle(bodyStyle);
}
return workbook;
}