zoukankan      html  css  js  c++  java
  • Java POI Excel 导入导出

    这个东西很容易懂,不是特别难,难就难在一些复杂的计算和Excel格式的调整上。

    近期写了一个小列子,放上来便于以后使用。

    POI.jar下载地址:http://mirror.bit.edu.cn/apache/poi/release/bin/poi-bin-3.17-20170915.zip

    Entity 实体类

    package com.test2;
    
    import java.util.Date;
    
    public class User {
    
        private int id; 
        private String username;
        private String password;
        private String sex;
        private int age;
        private Date birth;
        
        public int getId() {
            return id;
        }
        public String getUsername() {
            return username;
        }
        public String getPassword() {
            return password;
        }
        public String getSex() {
            return sex;
        }
        public int getAge() {
            return age;
        }
        public Date getBirth() {
            return birth;
        }
        public void setId(int id) {
            this.id = id;
        }
        public void setUsername(String username) {
            this.username = username;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public void setSex(String sex) {
            this.sex = sex;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public void setBirth(Date birth) {
            this.birth = birth;
        }
        @Override
        public String toString() {
            return "User [id=" + id + ", username=" + username + ", password=" + password + ", sex=" + sex + ", age=" + age
                    + ", birth=" + birth + "]";
        }
        
        public User() {};
        public User(int id, String username, String password, String sex, int age, Date birth) {
            super();
            this.id = id;
            this.username = username;
            this.password = password;
            this.sex = sex;
            this.age = age;
            this.birth = birth;
        }
       
    }

    Excel 导出:

    package com.test2;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFCellStyle;
    import org.apache.poi.hssf.usermodel.HSSFFont;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.usermodel.BorderStyle;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    import org.apache.poi.ss.usermodel.VerticalAlignment;
    import org.apache.poi.ss.util.CellRangeAddress;
    
    public class ExportExcel {
        
        public static void main(String[] args) {
            try {
                // 创建一个工作簿
                HSSFWorkbook workbook = new HSSFWorkbook();
                CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, 5);
                HSSFCellStyle headStyle = getStyle(workbook,(short) 15);
                HSSFCellStyle colStyle = getStyle(workbook,(short) 12);
                
                //新建一个excel页签
                HSSFSheet createSheet = workbook.createSheet("用户信息列表");
                // 将合并表格的对象添加页签中
                createSheet.addMergedRegion(cellRangeAddress);
                // 设置单元格的默认宽度
                createSheet.setDefaultColumnWidth(25);
                
                // 创建一行
                HSSFRow row0 = createSheet.createRow(0);
                HSSFCell cell0 = row0.createCell(0);
                // 添加标题样式
                cell0.setCellStyle(headStyle);
                // 添加标题
                cell0.setCellValue("用户信息列表");
                
                //设置列的标题
                String [] titles = {"id","用户名","密码","年龄","性别","生日"};
                HSSFRow row1 = createSheet.createRow(1);
                //  循环往excel中添加列标题
                for (int i = 0; i < titles.length; i++) {
                    HSSFCell cell1 = row1.createCell(i);
                    cell1.setCellStyle(colStyle);
                    cell1.setCellValue(titles[i]);
                }
                
                List<User> userList = new ArrayList<User>();
                
                userList.add(new User(1,"zhangsan1","123","男",21,new Date()));
                userList.add(new User(2,"zhangsan2","456","男",21,new Date()));
                userList.add(new User(3,"zhangsan3","789","女",21,new Date()));
                userList.add(new User(4,"zhangsan4","000","男",21,new Date()));
                
                for (int i = 0; i < userList.size(); i++) {
                    //创建第三行
                    HSSFRow row2 = createSheet.createRow(i + 2);
                    
                    HSSFCell cell_0 = row2.createCell(0);
                    cell_0.setCellValue(userList.get(i).getId());
                    
                    
                    HSSFCell cell_1 = row2.createCell(1);
                    cell_1.setCellValue(userList.get(i).getUsername());
                    
                    
                    HSSFCell cell_2 = row2.createCell(2);
                    cell_2.setCellValue(userList.get(i).getPassword());
                    
                    HSSFCell cell_3 = row2.createCell(3);
                    cell_3.setCellValue(userList.get(i).getAge());
                    
                    HSSFCell cell_4 = row2.createCell(4);
                    cell_4.setCellValue(userList.get(i).getSex());
                    
                    
                    HSSFCell cell_5 = row2.createCell(5);
                    cell_5.setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(userList.get(i).getBirth()));
                    
                }
                
                OutputStream os = new FileOutputStream("E:/test.xls");
                workbook.write(os);
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
        }
        
        public static HSSFCellStyle getStyle(HSSFWorkbook workbook,short fontSize) {
            // 创建样式对象
            HSSFCellStyle createCellStyle = workbook.createCellStyle();
            //水平居中
            createCellStyle.setAlignment(HorizontalAlignment.CENTER);
            //垂直居中
            createCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            // 设置边框
            createCellStyle.setBorderBottom(BorderStyle.THIN);
            createCellStyle.setBorderLeft(BorderStyle.THIN);
            createCellStyle.setBorderRight(BorderStyle.THIN);
            createCellStyle.setBorderTop(BorderStyle.THIN);
            
            //  创建一个字体对象
            HSSFFont createFont = workbook.createFont();
            // 设置字体的大小
            createFont.setFontHeightInPoints(fontSize);
            // 设置字体类型
            createFont.setFontName("微软雅黑");
            // 设置字体的颜色
            createFont.setColor(HSSFColor.RED.index);
            
            //将字体放置到样式中
            createCellStyle.setFont(createFont);
            return createCellStyle;
        }
        
    }

    以下是导出Excel的结果图:

    这里补充下合并单元格的知识点:

    /*合并单元格需要用到CellRangeAddress对象 
    CellRangeAddress对象需要传入四个参数 列如:CellRangeAddress(param1,param2,param3,param4);
    参数分别代表如下:
    param1:开始行 
    param2:结束行  
    param3:开始列 
    param4:结束列  
    例如:
    合并第一行和第二行,此合并只是合并了第一列,第二列、第三列...等后面的列的一二行并没有合并
    给合并的单元格赋值是需要注意行号变化
    注意:记住行号和列号是从0起始
    */
    sheet.addMergedRegion(new CellRangeAddress(0,1,0,0));  

    下面粘贴一段合并单元格行和列的综合代码:

    public static void main(String[] args) {
        try {
            // 创建标题栏
            String[] titles = new String[] {"公司名称","项目名称","地址名称"};
            String[] strDate = new String[] {"2018-04-29","2018-04-30","2018-05-01","2018-05-02","2018-05-03"};
            
            // 创建一个工作簿
            HSSFWorkbook workbook = new HSSFWorkbook();
            //拿到标题样式和单元格样式
            HSSFCellStyle headStyle = getStyle(workbook,(short) 15);
            HSSFCellStyle colStyle = getStyle(workbook,(short) 12);
            
            //新建一个excel页签
            HSSFSheet createSheet = workbook.createSheet("地址信息报表");
            // 将合并表格的对象添加页签中
            CellRangeAddress cellRangeAddress = new CellRangeAddress(0, 0, 0, (6+strDate.length));
            createSheet.addMergedRegion(cellRangeAddress);
            //循环合并1至3列的的一二行
            for (int i = 0; i < 3; i++) {
                createSheet.addMergedRegion(new CellRangeAddress(1, 2, i, i));
            }
            createSheet.addMergedRegion(new CellRangeAddress(1, 1, 3, 3+strDate.length));
            // 设置单元格的默认宽度
            createSheet.setDefaultColumnWidth(25);
            
            // 创建一行
            HSSFRow row0 = createSheet.createRow(0);
            HSSFCell cell0 = row0.createCell(0);
            // 添加标题样式
            cell0.setCellStyle(headStyle);
            // 添加标题
            cell0.setCellValue("地址信息报表");
            
            //设置列的标题
            HSSFRow row1 = createSheet.createRow(1);
            //  循环往excel中添加列标题
            for (int i = 0; i < titles.length; i++) {
                HSSFCell cell1 = row1.createCell(i);
                cell1.setCellStyle(colStyle);
                cell1.setCellValue(titles[i]);
            }
            HSSFCell dateCell = row1.createCell(titles.length);
            dateCell.setCellStyle(colStyle);
            dateCell.setCellValue("2018-04-29 / 2018-05-03");
            
            HSSFRow row2 = createSheet.createRow(2);
            //  循环往excel中添加列标题
            for (int i = 0; i < strDate.length; i++) {
                HSSFCell cell1 = row2.createCell(i + titles.length);
                cell1.setCellStyle(colStyle);
                cell1.setCellValue(strDate[i]);
            }
            
            OutputStream os = new FileOutputStream("E:/test.xls");
            workbook.write(os);
            os.close();
        } catch (Exception e){
            e.printStackTrace();
        }
        
        
    }

    结果如下:

    Excel导入:

    package com.test2;
    
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    
    /**
     * 
     * @author zhangxiang
     *
     */
    public class ImportExcel {
    
        public static void main(String[] args) {
            
            try {
                //创建输入流对象
                InputStream inputStream = new FileInputStream("E:/test.xls");
                // 创建工作波对象
                HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
                // 创建user集合对象用于存储Excel导入的信息
                List<User> userList = new ArrayList<User>();
                
                
                //  是否能拿到excel页签
                for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                    
                    HSSFSheet sheetAt = workbook.getSheetAt(i);
                    //  不存在就结束循环
                    if(null == sheetAt) {
                        continue;
                    }
                    
                    //  是否存在row
                    for (int j = 0; j < sheetAt.getPhysicalNumberOfRows(); j++) {
                        
                        // 拿到第 j+2 行  前两行是标题 
                        HSSFRow row = sheetAt.getRow(2+j); 
                        // 不存在row就结束循环
                        if(null == row) {
                            continue;
                        }
                        
                        // 存储一行的每个单元格拿到的值
                        User user = new User();
                        
                        // 拿到第一个单元格的值   单元格从0开始
                        HSSFCell cell0 = row.getCell(0);
                        Float f = Float.parseFloat(cell0.toString());
                        user.setId(f.intValue());
                        
                        // 第二个单元格的值
                        HSSFCell cell1 = row.getCell(1);
                        user.setUsername(cell1.toString());
                        
                        //第三个
                        HSSFCell cell2 = row.getCell(2);
                        user.setPassword(cell2.toString());
                        
                        //第四个
                        HSSFCell cell3 = row.getCell(3);
                        Float a = Float.parseFloat(cell3.toString());
                        user.setAge(a.intValue());
                        
                        // 第五个
                        HSSFCell cell4 = row.getCell(4);
                        user.setSex(cell4.toString());
                        
                        //第六个
                        HSSFCell cell5 = row.getCell(5);
                        user.setBirth(new SimpleDateFormat("yyyy-MM-dd").parse(cell5.toString()));
                        
                        
                        userList.add(user);
                    }
                }
                //  输出信息  查看是否正确
                System.out.println(userList.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }    
    }

     以下是导入Excel 的部分打印结果图:

    以上代码直接就可以运行!!

  • 相关阅读:
    Kafka中的数据清理(logdeletion)
    genymotion虚拟器笔记
    layui hover显示图片
    vue 导出到excel
    el-tree知识积累
    js 含有对象的数组去重
    苏宁易购价格爬取(golang)
    vue+elementui+beego笔记
    vue笔记
    beego笔记
  • 原文地址:https://www.cnblogs.com/Faith-zhang/p/7867242.html
Copyright © 2011-2022 走看看