KeisukeYamazaki
10/1/2019 - 11:42 PM

エクセルテンプレートからファイルを生成

エクセルテンプレートからファイルを生成

public class ExcelMeetingSheet {

    public void MakeExcelMeetingSheet2(Student student, String fileName) {

        // カレントパスの取得
        String basepath = System.getProperty("user.dir");

        FileInputStream in = null;
        Workbook wb = null;

        try {

            in = new FileInputStream(basepath + "/src/main/resources/excel/meetingSheet_2nd3term.xlsx");
            wb = WorkbookFactory.create(in);

        } catch (IOException ioException) {

            ioException.printStackTrace();

        } catch (InvalidFormatException invalidFormatException) {

            invalidFormatException.printStackTrace();

        } finally {

            try {

                in.close();

            } catch (IOException e) {

                e.printStackTrace();

            }
        }

        Sheet sheet = wb.getSheetAt(0);

        getCell(sheet, 1, 22).setCellValue(student.getStudentName());

        FileOutputStream out = null;
        try{

            out = new FileOutputStream(fileName);
            wb.write(out);

        }catch(IOException e){

            e.printStackTrace();

        }finally{

            try {

                out.close();

            }catch(IOException e){

                e.printStackTrace();
            }
        }
    }

    /**
     * <p>
     * 引数で指定されたシートの、行番号、列番号で指定したセルを取得して返却する
     * <p>
     * 行番号、列番号は0から開始する
     * <p>
     * Excelテンプレートで該当のセルを操作していない場合、NullPointerExceptionになる
     * @param sheet シート
     * @param rowIndex 行番号
     * @param colIndex 列番号
     * @return セル
     */
    private Cell getCell(Sheet sheet, int rowIndex, int colIndex) {
        Row row = sheet.getRow(rowIndex);
        return row.getCell(colIndex);
    }
}
// ダウンロードメソッド
@Controller
public class DownloadController {
    
    @Autowired
    ZenkenService zenkenService;
    
    @Autowired
    ExcelMeetingSheet excelMeetingSheet;
  
     /**
     * 面談シートダウンロードメソッド.
     */
    @GetMapping("/meetingSheet/{id:.+}")
    public ResponseEntity<byte[]> getMeetingSheetDownload(@PathVariable("id") String studentId, Model model) {

        // 生徒情報の取得
        Student student = studentService.selectOne(studentId);

        // 生徒名(カタカナ)をひらながなに変換
        Transliterator transliterator = Transliterator.getInstance("Katakana-Hiragana");
        String name = transliterator.transliterate(student.getNameRuby());

        // 生徒名(ひらがな)をローマ字に変換
        transliterator = Transliterator.getInstance("Hiragana-Latin");
        String latinName = transliterator.transliterate(name);

        // ファイル名作成用に日付を取得
        LocalDate date = LocalDate.now();

        // ファイル名を決める
        String fileName = DateTimeFormatter.ofPattern("yyyyMMdd").format(date) + latinName + ".xlsx";

        // エクセルファイルの作成
        excelMeetingSheet.MakeExcelMeetingSheet2(student, fileName);

        // サーバーに保存されているエクセルファイルをbyteで取得する
        byte[] bytes = null;

        try {

            bytes = zenkenService.getFile(fileName);

        } catch (IOException e) {
            e.printStackTrace();
        }

        try {

            //HTTPヘッダーの設定
            HttpHeaders headers = new HttpHeaders();
            headers.add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; charset=UTF-8");
            headers.setContentDispositionFormData("filename", fileName);

            // ZIPファイルを戻す
            return new ResponseEntity<>(bytes, headers, HttpStatus.OK);

        } finally {

            // ファイルの削除
            File file = new File(fileName);
            file.delete();

        }

    }
   
}