1. 程式人生 > >Spring Boot學習筆記----POI(Excel匯入匯出)

Spring Boot學習筆記----POI(Excel匯入匯出)

Apache POI是Apache軟體基金會的開放原始碼函式庫,POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。本文僅用來記錄Excel的部分。畢竟,Excel的匯入匯出,是後臺資料庫常用的方法。

Excel共有兩種格式:xls(03版本)和xlsx(07及之後版本)。POI提供了兩個對應介面類,分別為:HSSFWorkbook和XSSFWorkbook。

那麼如何使用POI呢?

新增Dependence

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId
>
poi</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>RELEASE</version> </dependency>

前者用於引入HSSFWorkbook;後者用於引入XSSFWorkbook

版本判斷

在對檔案操作前,需要對版本進行判斷。

    public static boolean isExcel2003(String filePath)
    {
        return filePath.matches("^.+\\.(?i)(xls)$");
    }

    public static boolean isExcel2007(String filePath)
    {
        return filePath.matches("^.+\\.(?i)(xlsx)$");
    }

匯入Excel

我們仍以之前的Hero為例。將Excel中的資料匯出至List中,程式碼如下。

    public List<Hero> importData(File file)
    {
        Workbook wb = null;
        List<Hero> HeroList = new ArrayList();
        try
        {
            if (ExcelUtil.isExcel2007(file.getPath())) {
                wb = new XSSFWorkbook(new FileInputStream(file));
            } else {
                wb = new HSSFWorkbook(new FileInputStream(file));
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();

            return null;
        }

        Sheet sheet = wb.getSheetAt(0);//獲取第一張表
        for (int i = 0; i < sheet.getLastRowNum(); i++)
        {
            Row row = sheet.getRow(i);//獲取索引為i的行,以0開始
            String name= row.getCell(0).getStringCellValue();//獲取第i行的索引為0的單元格資料
            int age = row.getCell(1).getNumericCellValue();
            if (age==0 && name==null)
            {
                break;
            }
            Hero hero=New Hero();
            hero.setName(name);
            hero.setAge(age);
            HeroList.add(hero);
        }
        try
        {
            wb.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return HeroList;
    }

這裡有兩點需要注意

(1)getLastRowNum()並非獲取實際行數。因此,需要coder自行判斷,是否已經到了最後一行(有效行)。

(2)有些單元格為Numeric格式,帶有指數E。因此,若想獲取其String型別時,需要進行格式轉換。

    public static String getStringFromNumericCell(Cell cell)
    {
        return new DecimalFormat("#").format(cell.getNumericCellValue());
    }

匯出Excel

這裡我們將記錄,以模板的形式匯出Excel,即具有某種格式化。

    public static void exportHeroInfo(List<Hero> heroList,String templetFilePath, String exportFilePath){
        try {
            File exportFile=new File(exportFilePath);
            File templetFile= new File(templetFilePath);
            Workbook workBook;

            if(!exportFile.exists()){
                exportFile.createNewFile();
            }

            FileOutputStream out = new FileOutputStream(exportFile);
            FileInputStream fis = new FileInputStream(templetFile);
            if(isExcel2007(templetFile.getPath())){
                workBook=new XSSFWorkbook(fis);
            }else {
                workBook=new HSSFWorkbook(fis);
            }

            Sheet sheet=workBook.getSheetAt(0);

            int rowIndex = 1 ;
            for (Hero item :
                    heroList) {
                Row row=sheet.createRow(rowIndex);
                row.createCell(0).setCellValue(item.getHeroAge());
                row.createCell(1).setCellValue(item.getHeroName());
                rowIndex++;
            }

            workBook.write(out);
            out.flush();
            out.close();

            fis.close();

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

經過測試,發現可以以模板的格式匯出資料,但對於單元格的邊框效果,似乎不起作用。有了解的童鞋,還望指點。
本人是通過新增cellStyle的方式,補充格式的。

單元格格式

若需要對固定的單元格,新增cellStyle。程式碼如下:

(1)建立CellStyle

    public static CellStyle setSimpleCellBorder(Workbook workbook){
        CellStyle style=workbook.createCellStyle();

        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        style.setAlignment(HorizontalAlignment.CENTER);
        return style;
    }

(2)為單元格新增CellStyle

    public static void inputCell(Row row, int index, String value, CellStyle style){
        Cell cell=row.createCell(index);
        cell.setCellValue(value);
        cell.setCellStyle(style);
    }

至此,使用POI對Excel進行匯入匯出小結完畢。