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进行导入导出小结完毕。

  • 10
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
您好!关于Spring BootExcel导入导出,可以使用Apache POI库来实现。下面是一个简单的示例代码: 1. 添加依赖: 在pom.xml文件中添加以下依赖: ```xml <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Apache POI --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> </dependencies> ``` 2. 创建Excel导出接口: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @Controller @RequestMapping("/excel") public class ExcelController { @GetMapping("/export") public void exportExcel(HttpServletResponse response) throws IOException { // 创建工作簿 Workbook workbook = new XSSFWorkbook(); // 创建工作表 Sheet sheet = workbook.createSheet("Sheet1"); // 创建行 Row row = sheet.createRow(0); // 创建单元格并设置值 Cell cell = row.createCell(0); cell.setCellValue("Hello, Excel!"); // 设置响应头 response.setHeader("Content-Disposition", "attachment; filename=example.xlsx"); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); // 将工作簿写入响应流 workbook.write(response.getOutputStream()); // 关闭工作簿 workbook.close(); } } ``` 3. 运行Spring Boot应用并访问导出接口: 启动Spring Boot应用后,可以通过访问`http://localhost:8080/excel/export`来导出Excel文件。 以上是一个简单的示例,您可以根据自己的需求进行修改和扩展。希望对您有帮助!如有任何问题,请随时提问。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值