日常学习笔记———轻松掌握对Excel的导入导出操作

Excel的导入导出

在对工作中经常会遇到和Excel打交道,不管是导出数据到Excel表中又或者是从Excel表中导入数据到数据库,下面就基于Apache POI对Excel的导入导出做一下说明。

简单的说一下什么是POI

简单的说一下可以更好地理解之后的代码。其实所谓的POI就是Apache软件的开放源码函式库的一种,POI提供API给Java程序对Microsoft Office格式档案读和写的功能,可以用来操作Excel、Word、PPT的读写功能,这里主要对Excel进行说明。

写数据

写数据的整体操作步骤
先来说说写数据大概分为几部分,

  1. 设置文件格式(如果是直接网页上下载的那种一定要设置,不然很有可能出现乱码);
  2. 画一下Excel的表格头(一个有表格头的文件可以更清晰的看出文件里的数据是什么);
  3. 用来填充数据;
  4. 最后一步就是将所有的信息写到Excel中。

每个步骤的具体实现

  1. 设置文件格式:
    其中的gb2312和iso8859-1 就是类型的固定写法,不做具体的说明,有需求的话可以问一下度娘一目了然。
    在这里插入图片描述
  2. 根据文件名字来判断需要使用的是HSSFWorkbook还是XSSFWorkbook。HSSFWorkbook是用来出来后缀名为.xls的Excel,而XSSFWorkbook是用来处理后缀名为.xlsx
~~~java
 private Workbook getWorkbook(String fileName) {
    private Workbook getWorkbook(String fileName) {
    if (fileName.endsWith("xls")) {
        return new HSSFWorkbook();
    }
    return new XSSFWorkbook();    } 
~~~
  1. 刻画Excel的表格头
     private void createSheetHeader(Workbook workbook, Sheet sheet, List<String> titles)          {
        if (!CollectionUtils.isEmpty(titles)) {
            //设置默认长度
            sheet.setDefaultColumnWidth(25);
            int colIndex = 0;
            Row row = sheet.createRow(0);
            CellStyle cs = workbook.createCellStyle();
            //设置居中
            cs.setAlignment(HorizontalAlignment.CENTER);
            //设置颜色
            cs.setFillForegroundColor(new HSSFColor.PALE_BLUE().getIndex());
            cs.setFillPattern(FillPatternType.SOLID_FOREGROUND);
            for (String title : titles) {
                Cell cell = row.createCell(colIndex++);
                cell.setCellValue(title);
                cell.setCellStyle(cs);
            }
        }
    }
    
    想要表格头更加好看点可以通过workbook.createCellStyle()这个方法来添加样式,可以设置大小,边框布局等等,这里只设置了长度和颜色
    看一下成品效果:
    在这里插入图片描述
  2. 填充数据,这里以自定义的User类来说明,具体场景根据各自具体需要来添加。
    private void fillData(Sheet sheet, List<User> data) {
        if (!CollectionUtils.isEmpty(data)) {
            int rowIndex = 1;
            for (User user : data) {
                Row row = sheet.createRow(rowIndex++);
                Cell cell = row.createCell(0);
                cell.setCellValue(user.getName());
                cell = row.createCell(1);
                cell.setCellValue(user.getEmployeeId());
                cell = row.createCell(2);
                cell.setCellValue(user.getPost());
            }
        }
    }
    
  3. 写入文件
    • 这里有两种写入文件的说明,一种是以文件的形式
            OutputStream os = response.getOutputStream();
            workbook.write(os);
    
    • 另一种是以HttpServletResponse的输出流
           File file = new File(filePath);
           file.createNewFile();
           FileOutputStream stream = FileUtils.openOutputStream(file);
           workbook.write(stream);
    
  4. 最终结果
    测试实现,以文件为例
    public class ExcelTest {
       private static final Logger LOGGER = LoggerFactory.getLogger(ExcelTest.class);
       
       public static void main(String[] args) {
          ExcelUtil util = new ExcelUtil();
          List<String> titleList = new ArrayList<>();
          titleList.add("名字");
          titleList.add("工号");
          titleList.add("岗位");
          List<User> dataList = new ArrayList<>();
          dataList.add(new User("z3", "0211", "部门主管"));
          dataList.add(new User("l4", "0455", "部门经理"));
          dataList.add(new User("w5", "0982", "开发主管"));
          try {
             util.export(titleList, dataList, "导出", "你需要导出的地址:..\\Desktop\\export.xls");
          } catch (IOException e) {
             LOGGER.error(e.getMessage(), e);
         }
    }
    

}
~~~
在这里插入图片描述
在这里插入图片描述

读数据

读取数据在其实需要完成写数据的基础上,因为它同样需要一个模板,也就是所谓的表头,以及里面的数据,在读取数据的时候就将之前写入数据的那部分代码对应的SET改成GET就好了。

同样需要先校验一下文件的类型,用来区分是使用HSSFWorkbook来处理还是用XSSFWorkbook来处理

private Workbook getWorkBook(InputStream is, String fileName) {
        try {
            if (fileName == null) {
                return null;
            }
            if (fileName.endsWith(".xls")) {
                return new HSSFWorkbook(is);
            } else {
                return new XSSFWorkbook(is);
            }
        } catch (IOException e) {
            LOGGER.error(e.getMessage(), e);
            return null;
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                LOGGER.error(e.getMessage(), e);
            }
        }
    }

读取的时候需要注意: 获取Excel中数据的时候需要对应列和实体中的对应属性

private void importUserResource(InputStream is, String fileName) {
        Workbook wb = getWorkBook(is, fileName);
        if (wb == null) {
            return;
        }
        Sheet workSheet = wb.getSheetAt(0);
        User user = new User();
        for (int i = 1; ; i++) {
            Row row = workSheet.getRow(i);
            if (row == null) {
                break;
            }
            user.setName(row.getCell(0).getStringCellValue());
            user.setEmployeeId(row.getCell(1).getStringCellValue());
            user.setPost(row.getCell(2).getStringCellValue());
            userDao.insert(user);
        }
    }

总结

对Excel的操作其实没有你想的那么简单,但是还是需要自己去实际编写以下,上面我还写了一个response的写入Excel的操作,有兴趣的可以接着我的代码自己实现一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值