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 메서드를 만든 다음 반환 된 MapModel 속성 으로 추가해 보겠습니다 .

@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 프로젝트 에서 찾을 수 있습니다 .