1. 程式人生 > 程式設計 >springboot中使用poi匯出excel

springboot中使用poi匯出excel

環境

  • IntelliJ IDEA 2018.2
  • JDK 1.8
  • SpringBoot 2.1.9.RELEASE
  • POI 3.9

Maven 依賴

    <dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency
>
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId> <version>3.9</version> </dependency> </dependencies> 複製程式碼

插入資料Excel

public class WriterExcel {
    public static void main(String[] args) {
        // 1. 建立工作簿
        XSSFWorkbook workbook = new
XSSFWorkbook(); // 2. 建立工作表 XSSFSheet sheet = workbook.createSheet("WriterDataTest"); // 3. 模擬待寫入資料 Map<String,Object[]> data = new TreeMap<>(); data.put("1",new Object[] {"ID","NAME","LASTNAME"}); data.put("2",new Object[] {1,"Amit","Shukla"}); data.put("3",new Object[] {2,"Lokesh","Gupta"}); data.put("4",new Object[] {3,"John","Adwards"}); data.put("5",new Object[] {4,"Brian","Schultz"}); //4. 遍歷資料寫入表中 Set<String> keySet = data.keySet(); int rowNum = 0; for (String key : keySet){ Row row = sheet.createRow(rowNum++); Object [] objArr = data.get(key); int cellNum = 0; for (Object obj: objArr){ Cell cell = row.createCell(cellNum++); if (obj instanceof String){ cell.setCellValue((String)obj); }else if(obj instanceof Integer){ cell.setCellValue((Integer)obj); } } } try { File file = new File("Test.xlsx"); FileOutputStream out = new FileOutputStream(file); workbook.write(out); } catch (Exception e) { e.printStackTrace(); } } } 複製程式碼

讀取資料Excel

public class ReadExcel {
    public static void main(String[] args) {
        try {
            FileInputStream file = new FileInputStream(new File("Test.xlsx"));
            //使用Test.xlsx檔案建立工作簿物件
            XSSFWorkbook workbook = new XSSFWorkbook(file);
            //獲取第一個sheet內容
            XSSFSheet sheet = workbook.getSheetAt(0);
            // 逐行遍歷
            Iterator<Row> rowIterable = sheet.iterator();
            while (rowIterable.hasNext()){
                Row row = rowIterable.next();
                // 逐列遍歷
                Iterator<Cell> cellIterator = row.cellIterator();
                while (cellIterator.hasNext()){
                    Cell cell = cellIterator.next();
                    switch (cell.getCellType()){
                        case Cell.CELL_TYPE_NUMERIC:
                            System.out.println(cell.getNumericCellValue() + "t");
                            break;
                        case Cell.CELL_TYPE_STRING:
                            System.out.println(cell.getStringCellValue() + "t");
                            break;
                    }
                }
                System.out.println("");
            }
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
複製程式碼

插入帶公式計算Excel

public class FormulaExcel {
    public static void main(String[] args) {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("CalcSimple");

        Row header = sheet.createRow(0);
        header.createCell(0).setCellValue("箱數");
        header.createCell(1).setCellValue("單價");
        header.createCell(2).setCellValue("個數");
        header.createCell(3).setCellValue("總價格");


        Row dataRow = sheet.createRow(1);
        dataRow.createCell(0).setCellValue(10);
        dataRow.createCell(1).setCellValue(2.5);
        dataRow.createCell(2).setCellValue(10);
        dataRow.createCell(3).setCellFormula("A2*B2*C2");
        FileOutputStream out = null;
        try {
            out = new FileOutputStream(new File("formulaTest.xlsx"));
            workbook.write(out);
            out.close();
            System.out.println("Excel with formula cells written successfully");
        } catch (Exception e) {
            e.printStackTrace();
        }
       }
}
複製程式碼

讀取帶公式計算的Excel

public class ReadWithFormula {

    public static void main(String[] args) {
        XSSFWorkbook workbook = new XSSFWorkbook();

        try {
            FileInputStream file  = new FileInputStream(new File("formulaTest.xlsx"));
            FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();

            XSSFSheet sheet = workbook.getSheetAt(0);
            // 遍歷Row
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()){
                Row row = rowIterator.next();
                // 遍歷Cell
                Iterator<Cell> cellIterator = row.cellIterator();
                while (cellIterator.hasNext()){
                    Cell cell = cellIterator.next();
                    switch (evaluator.evaluateInCell(cell).getCellType()){
                        case Cell.CELL_TYPE_NUMERIC:
                            System.out.println(cell.getNumericCellValue() + "tt");
                            break;
                        case Cell.CELL_TYPE_STRING:
                            System.out.println(cell.getStringCellValue() + "tt");
                            break;
                        case Cell.CELL_TYPE_FORMULA:
                            break;
                    }
                }
                System.out.println("");
            }
            file.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
複製程式碼

格式化Excel

單元格值在一定範圍內

值在配置範圍[50-70]內的任何單元格著色

public class FomatExcel {
    public static final Integer NUM = 100;
    public static void main(String[] args) throws Exception {
        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("單元格樣式");
        formatByValue(sheet);
        FileOutputStream out = new FileOutputStream("styleDemo.xlsx");
        workbook.write(out);
        out.close();
    }

    public static  void  formatByValue(Sheet sheet){
        Random random = new Random();
        for (int i = 0; i < NUM; i++) {
            sheet.createRow(i).createCell(0).setCellValue(random.nextInt(100));
        }
        // 獲取格式化物件
        SheetConditionalFormatting conditionalFormatting = sheet.getSheetConditionalFormatting();
        //設定格式化條件,條件1
        ConditionalFormattingRule rule1 = conditionalFormatting.createConditionalFormattingRule(ComparisonOperator.GT,"70");
        PatternFormatting patternFormatting1  = rule1.createPatternFormatting();
        patternFormatting1 .setFillBackgroundColor(IndexedColors.BLUE.index);
        patternFormatting1.setFillPattern(PatternFormatting.SOLID_FOREGROUND);

        // 條件2
        ConditionalFormattingRule rule2 = conditionalFormatting.createConditionalFormattingRule(ComparisonOperator.LT,"50");
        PatternFormatting patternFormatting2  = rule2.createPatternFormatting();
        patternFormatting2 .setFillBackgroundColor(IndexedColors.RED.index);
        patternFormatting2.setFillPattern(PatternFormatting.SOLID_FOREGROUND);

        // 列格式範圍
        CellRangeAddress[] range = {
                CellRangeAddress.valueOf("A1:A100")
        };
        conditionalFormatting.addConditionalFormatting(range,rule1,rule2);
    }
}
複製程式碼

交替行變色

    public static void formatByColor(Sheet sheet) {
        SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();
        ConditionalFormattingRule rule = sheetCF.createConditionalFormattingRule("MOD(ROW(),2)");
        PatternFormatting fill = rule.createPatternFormatting();
        fill.setFillBackgroundColor(IndexedColors.LIGHT_GREEN.index);
        fill.setFillPattern(PatternFormatting.SOLID_FOREGROUND);

        CellRangeAddress[] regions = {
                CellRangeAddress.valueOf("A1:Z100")
        };

        sheetCF.addConditionalFormatting(regions,rule);
        sheet.createRow(0).createCell(1).setCellValue("交替行變色,綠色填充");
        sheet.createRow(1).createCell(1).setCellValue("條件:MOD(ROW(),2)");
    }
複製程式碼

設定到期時間

    public static void expiryInNext30Days(Sheet sheet)
    {
        CellStyle style = sheet.getWorkbook().createCellStyle();
        style.setDataFormat((short)BuiltinFormats.getBuiltinFormat("d-mmm"));

        sheet.createRow(0).createCell(0).setCellValue("日期");
        sheet.createRow(1).createCell(0).setCellFormula("TODAY()+29");
        sheet.createRow(2).createCell(0).setCellFormula("A2+1");
        sheet.createRow(3).createCell(0).setCellFormula("A3+1");

        for(int rownum = 1; rownum <= 3; rownum++) sheet.getRow(rownum).getCell(0).setCellStyle(style);

        SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();

        ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule("AND(A2-TODAY()>=0,A2-TODAY()<=30)");
        FontFormatting font = rule1.createFontFormatting();
        font.setFontStyle(false,true);
        font.setFontColorIndex(IndexedColors.BLUE.index);

        CellRangeAddress[] regions = {
                CellRangeAddress.valueOf("A2:A4")
        };

        sheetCF.addConditionalFormatting(regions,rule1);

        sheet.getRow(0).createCell(1).setCellValue("樣式將在30後到期");
    }
}
複製程式碼

將資料庫資料寫入Excel並下載

Controller code

 @PostMapping("user/export")
    @ResponseBody
    @ApiOperation(value="匯出使用者",httpMethod = "POST",produces="application/json",notes = "匯出使用者")
    public ResultBean  exportUser(HttpServletResponse response) throws IOException{
        List<SysUser> userList =  sysUserService.getUserList(); // 獲取使用者資料
        Map<String,String> fieldMap = new LinkedHashMap<String,String>(); // 資料列資訊
    	fieldMap.put("id","編號");
     	fieldMap.put("name","姓名");
     	fieldMap.put("pwd","密碼");
     	fieldMap.put("tel","電話");
     	fieldMap.put("code","編碼");
     	fieldMap.put("comment","備註");
        XSSFWorkbook workbook = new XSSFWorkbook(); // 新建工作簿物件
        XSSFSheet sheet = workbook.createSheet("UserList");// 建立sheet
        int rowNum = 0;
        Row row =  sheet.createRow(rowNum);// 建立第一行物件,設定表標題
        Cell cell;
        int cellNum = 0;
        for (String name:fieldMap.values()){
            cell = row.createCell(cellNum);
            cell.setCellValue(name);
            cellNum++;
        }
        int rows = 1;
         for (SysUser user: userList){//遍歷資料插入excel中
            row = sheet.createRow(rows);
            int col = 0;
            row.createCell(col).setCellValue(user.getId()); // 編號id
            row.createCell(col+1).setCellValue(user.getName()); // 姓名Name
            row.createCell(col+2).setCellValue(user.getPwd()); // 密碼pwd
            row.createCell(col+3).setCellValue(user.getTel()); // 電話tel
            row.createCell(col+4).setCellValue(user.getCode()); // 編碼
            row.createCell(col+5).setCellValue(user.getComment()); // 備註comment
            rows++;
        }
        String fileName = "userInfo";
        OutputStream out =null;
        try {
            out = response.getOutputStream();
            response.reset();
            response.addHeader("Content-Disposition","attachment; filename=" + fileName + ".xlsx");
            response.setContentType("application/vnd.ms-excel;charset=utf-8");
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            out.flush();
            out.close();
        }
        return ResultBean.success();
    }
複製程式碼

Swagger測試

Swagger測試
Excel資料
資料庫中資料
Success實現了poi的基本操作啦>_<

demo 原始碼:

DuebassLe Github