1. 소개
이 기사에서는 Spring MVC 프레임 워크를 사용하여 Excel 파일 을 업로드하고 웹 페이지에 해당 컨텐츠를 표시 하는 방법을 보여줍니다 .
2. 엑셀 파일 업로드
파일을 업로드 할 수 있으려면 먼저 MultipartFile 을 수신 하고 현재 위치에 저장 하는 컨트롤러 매핑을 생성합니다 .
private String fileLocation;
@PostMapping("/uploadExcelFile")
public String uploadFile(Model model, MultipartFile file) throws IOException {
InputStream in = file.getInputStream();
File currDir = new File(".");
String path = currDir.getAbsolutePath();
fileLocation = path.substring(0, path.length() - 1) + file.getOriginalFilename();
FileOutputStream f = new FileOutputStream(fileLocation);
int ch = 0;
while ((ch = in.read()) != -1) {
f.write(ch);
}
f.flush();
f.close();
model.addAttribute("message", "File: " + file.getOriginalFilename()
+ " has been uploaded successfully!");
return "excel";
}
다음으로,하자가 만드는 JSP의 가 포함 된 양식 파일 입력 의 유형 파일 (가)해야합니다 동의 만 허용 Excel 파일에 속성 세트를 :
<c:url value="/uploadExcelFile" var="uploadFileUrl" />
<form method="post" enctype="multipart/form-data"
action="${uploadFileUrl}">
<input type="file" name="file" accept=".xls,.xlsx" /> <input
type="submit" value="Upload file" />
</form>
3. 엑셀 파일 읽기
업로드 된 Excel 파일을 구문 분석하기 위해 .xls 및 .xlsx 파일 모두에서 작동 할 수 있는 Apache POI 라이브러리를 사용 합니다.
콘텐츠 및 서식과 관련된 Excel 셀의 속성을 포함 할 MyCell 이라는 도우미 클래스를 만들어 보겠습니다 .
public class MyCell {
private String content;
private String textColor;
private String bgColor;
private String textSize;
private String textWeight;
public MyCell(String content) {
this.content = content;
}
//standard constructor, getters, setters
}
Excel 파일의 내용 을 MyCell 개체 List이 포함 된 Map 으로 읽어 들입니다.
3.1. .xls 파일 구문 분석
.XLS의 파일이 표현됩니다 아파치 POI의 에 의해 라이브러리 HSSFWorkbook의 클래스 로 구성되어, HSSFSheet의 객체. .xls 파일 의 내용을 열고 읽으려면 Working with Microsoft Excel in Java 문서를 참조하십시오 .
셀의 형식을 구문 분석하기 위해 HSSFCellStyle 개체를 가져와 배경색 및 글꼴과 같은 속성을 결정하는 데 도움이됩니다. 모든 읽기 속성은 MyCell 개체 의 속성에 설정됩니다 .
HSSFCellStyle cellStyle = cell.getCellStyle();
MyCell myCell = new MyCell();
HSSFColor bgColor = cellStyle.getFillForegroundColorColor();
if (bgColor != null) {
short[] rgbColor = bgColor.getTriplet();
myCell.setBgColor("rgb(" + rgbColor[0] + ","
+ rgbColor[1] + "," + rgbColor[2] + ")");
}
HSSFFont font = cell.getCellStyle().getFont(workbook);
색상은 rgb (rVal, gVal, bVal) 형식으로 읽혀져 JSP 페이지 에서 CSS 를 사용하여 쉽게 표시 할 수 있습니다 .
글꼴 크기, 두께 및 색상도 구해 보겠습니다.
myCell.setTextSize(font.getFontHeightInPoints() + "");
if (font.getBold()) {
myCell.setTextWeight("bold");
}
HSSFColor textColor = font.getHSSFColor(workbook);
if (textColor != null) {
short[] rgbColor = textColor.getTriplet();
myCell.setTextColor("rgb(" + rgbColor[0] + ","
+ rgbColor[1] + "," + rgbColor[2] + ")");
}
3.2. .xlsx 파일 구문 분석
최신 .xlsx 형식의 파일 의 경우 통합 문서의 내용에 대해 XSSFWorkbook 클래스 및 유사한 클래스를 사용할 수 있습니다. 또한 Working with Microsoft Excel in Java 문서에 설명되어 있습니다.
.xlsx 형식으로 셀 서식을 읽는 방법을 자세히 살펴 보겠습니다 . 먼저 셀과 연결된 XSSFCellStyle 개체 를 검색하고 이를 사용하여 배경색과 글꼴을 결정합니다.
XSSFCellStyle cellStyle = cell.getCellStyle();
MyCell myCell = new MyCell();
XSSFColor bgColor = cellStyle.getFillForegroundColorColor();
if (bgColor != null) {
byte[] rgbColor = bgColor.getRGB();
myCell.setBgColor("rgb("
+ (rgbColor[0] < 0 ? (rgbColor[0] + 0xff) : rgbColor[0]) + ","
+ (rgbColor[1] < 0 ? (rgbColor[1] + 0xff) : rgbColor[1]) + ","
+ (rgbColor[2] < 0 ? (rgbColor[2] + 0xff) : rgbColor[2]) + ")");
}
XSSFFont font = cellStyle.getFont();
이 경우 색상 의 RGB 값은 부호있는 바이트 값이되므로 0xff 를 음수 값 에 더하여 부호없는 값을 얻습니다 .
글꼴의 속성도 결정 해 보겠습니다.
myCell.setTextSize(font.getFontHeightInPoints() + "");
if (font.getBold()) {
myCell.setTextWeight("bold");
}
XSSFColor textColor = font.getXSSFColor();
if (textColor != null) {
byte[] rgbColor = textColor.getRGB();
myCell.setTextColor("rgb("
+ (rgbColor[0] < 0 ? (rgbColor[0] + 0xff) : rgbColor[0]) + ","
+ (rgbColor[1] < 0 ? (rgbColor[1] + 0xff) : rgbColor[1]) + ","
+ (rgbColor[2] < 0 ? (rgbColor[2] + 0xff) : rgbColor[2]) + ")");
}
3.3. 빈 행 처리
위에서 설명한 방법은 Excel 파일의 빈 행을 고려하지 않습니다. 빈 행도 표시하는 파일의 충실한 변환을 원한다면 빈 문자열 을 내용으로 포함하는 MyCell 객체 의 ArrayList 를 사용하여 결과 HashMap 에서이를 시뮬레이션해야 합니다.
처음에 Excel 파일을 읽은 후 파일의 빈 행 은 크기가 0 인 ArrayList 개체가됩니다.
추가해야하는 빈 String 개체의 수 를 결정하기 위해 먼저 maxNrCols 변수를 사용하여 Excel 파일에서 가장 긴 행을 결정합니다 . 그런 다음 크기가 0 인 HashMap의 모든 List에 빈 String 개체 수를 추가합니다 .
int maxNrCols = data.values().stream()
.mapToInt(List::size)
.max()
.orElse(0);
data.values().stream()
.filter(ls -> ls.size() < maxNrCols)
.forEach(ls -> {
IntStream.range(ls.size(), maxNrCols)
.forEach(i -> ls.add(new MyCell("")));
});
4. Excel 파일 표시
Spring MVC를 사용하여 읽은 Excel 파일을 표시하려면 컨트롤러 매핑과 JSP 페이지 를 정의해야 합니다.
4.1. Spring MVC 컨트롤러
위의 코드를 호출하여 업로드 된 파일의 내용을 읽는 @RequestMapping 메서드를 만든 다음 반환 된 Map 을 Model 속성 으로 추가해 보겠습니다 .
@Resource(name = "excelPOIHelper")
private ExcelPOIHelper excelPOIHelper;
@RequestMapping(method = RequestMethod.GET, value = "/readPOI")
public String readPOI(Model model) throws IOException {
if (fileLocation != null) {
if (fileLocation.endsWith(".xlsx") || fileLocation.endsWith(".xls")) {
Map<Integer, List<MyCell>> data
= excelPOIHelper.readExcel(fileLocation);
model.addAttribute("data", data);
} else {
model.addAttribute("message", "Not a valid excel file!");
}
} else {
model.addAttribute("message", "File missing! Please upload an excel file.");
}
return "excel";
}
4.2. JSP
파일 내용을 시각적으로 표시하기 위해 HTML 테이블 을 만들고 각 테이블 셀 의 스타일 속성에서 Excel 파일의 각 셀에 해당하는 서식 속성을 추가합니다.
<c:if test="${not empty data}">
<table style="border: 1px solid black; border-collapse: collapse;">
<c:forEach items="${data}" var="row">
<tr>
<c:forEach items="${row.value}" var="cell">
<td style="border:1px solid black;height:20px;width:100px;
background-color:${cell.bgColor};color:${cell.textColor};
font-weight:${cell.textWeight};font-size:${cell.textSize}pt;">
${cell.content}
</td>
</c:forEach>
</tr>
</c:forEach>
</table>
</c:if>
5. 결론
이 기사에서는 Excel 파일을 업로드하고 Spring MVC 프레임 워크를 사용하여 웹 페이지에 표시하는 예제 프로젝트를 보여주었습니다 .
전체 소스 코드는 GitHub 프로젝트 에서 찾을 수 있습니다 .