表格操作

表格操作

1.为什么要学习

公司开发中 特别是开发 crm erp OA系统的时候 会有一个需求 导入和导出报表 (表格)

2. 解决方案

  • jxl : 只能对Excel进行操作,属于比较老的框架,已经停止更新和维护(已经废弃)
  • poi: 现在比较主流 可以操作不同版本的表格和word

3.版本说明

3.1 Excel2003

Excel2003是一个特有的二进制格式,其核心结构是复合文档类型的结构,存储数据量较小

3.2 Excel2007

Excel2007 的核心结构是 XML 类型的结构,采用的是基于 XML 的压缩方式,使其占用的空间更小,操作效率更高

4.poi的使用(表格操作)

4.1 生成表格

4.1.1 环境准备

新建maven基本工程 添加poi的坐标

 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

4.1.2 最基本的生成表格

 @Test
    public void fun() throws Exception {
        //创建工作簿
        Workbook workbook  = new XSSFWorkbook();
        //创建文件输出流
        FileOutputStream out = new FileOutputStream("E:\\demo.xlsx");
        //把工作簿输出本地
        workbook.write(out);
        //关闭资源
        out.close();
        workbook.close();
    }

类的说明

  • HSSF操作Microsoft Excel XLS格式
  • XSSF操作Microsoft Excel OOXML XLSX格式。
  • HWPF操作Microsoft Word DOC格式
  • HSLF操作Microsoft PowerPoint格式

4.1.3 操作表格的Sheet

@Test
    public void fun1() throws Exception {
        Workbook workbook  = new XSSFWorkbook();

        //创建sheet并且指定 sheet的名字
        workbook.createSheet("财务管理");
        FileOutputStream out = new FileOutputStream("E:\\demo1.xlsx");
        workbook.write(out);
        out.close();
        workbook.close();


    }

4.1.4 操作表格的行

@Test
    public void fun2() throws Exception {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("财务管理");
        //通过该Sheet创建row  
        //参数表示  行的索引   从0开始  
        Row row = sheet.createRow(0);
        FileOutputStream out = new FileOutputStream("E:\\demo1.xlsx");
        workbook.write(out);
        out.close();
        workbook.close();
    }

4.1.5 操作表格的单元格

    @Test
    public void fun3() throws Exception {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("财务报表");
        Row row = sheet.createRow(0);

        //单元格 通过row创建
        //参数表示索引 表示这一行的第几个单元格  索引从0开始

        Cell cell = row.createCell(2);

        //给单元格写文字

        cell.setCellValue("辉哥真帅");

        FileOutputStream out = new FileOutputStream("E:\\demo3.xlsx");
        workbook.write(out);
        out.close();
        workbook.close();


    }

4.1.6 操作样式

@Test
    public void fun4() throws Exception {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("辉哥很帅");
        Row row = sheet.createRow(3);

        //创建Cell的样式 通过工作簿创建样式
        CellStyle cellStyle = workbook.createCellStyle();

        //获取设置文字样式
        Font  font  = workbook.createFont();
        //设置文字加粗
        font.setBold(true);
        //设置文字大小
        font.setFontHeightInPoints((short)30);


        cellStyle.setFont(font);

        //设置上边框
        cellStyle.setBorderTop(BorderStyle.DASHED);
        //设置下边框
        cellStyle.setBorderBottom(BorderStyle.DASHED);
        //设置左边框
        cellStyle.setBorderLeft(BorderStyle.DASHED);
        //设置右边框
        cellStyle.setBorderRight(BorderStyle.DASHED);

        //设置文字水平居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        //设置文字垂直居中
        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        //设置行高
        row.setHeightInPoints(40);

        //设置单元格的宽度
        //第一个参数 表示设置哪个单元格 表示索引  第二个表示宽度
        sheet.setColumnWidth(3,50*256);

        //创建单元格
        Cell cell = row.createCell(3);
        //给单元格设置值
        cell.setCellValue("辉哥很帅");
        //给这个单元格设置这个样式
        cell.setCellStyle(cellStyle);




        FileOutputStream out = new FileOutputStream("E:\\aaa4.xlsx");
        workbook.write(out);
        out.close();
        workbook.close();


    }

4.2 读取表格

新建一个xlsl文件 填写信息

/**
 * 读取表格
 */
public class POIDemo2 {


    @Test
    public void fun() throws Exception {

        //加载xlsx文件

        Workbook workbook = new XSSFWorkbook("E:\\person.xlsx");

        //通过工作簿找到sheet  

        Sheet sheet = workbook.getSheetAt(0);
        //获取一共多少行
        int maxRow = sheet.getLastRowNum();

        for (int i = 0; i <= maxRow; i++) {
            //获得具体每一行 
            Row row = sheet.getRow(i);
            //获取这一行 有多少个单元格 
            int lastCellNum = row.getLastCellNum();

            StringBuffer buffer = new StringBuffer();
            //遍历这一行的所有单元格
            for (int j = 0; j <= lastCellNum; j++) {
                //获取单元格
                Cell cell = row.getCell(j);
                if (cell != null) {
                    Object value = getValue(cell);
                    buffer.append(value).append("--");
                }

            }

            System.out.println(buffer.toString());

        }


    }

    public Object getValue(Cell cell) {
        CellType cellTypeEnum = cell.getCellTypeEnum();
        Object obj = null;
        switch (cellTypeEnum) {
            case STRING://字符串类型
                obj = cell.getStringCellValue();
                break;
            case BOOLEAN:// boolean类型
                obj = cell.getBooleanCellValue();
                break;
            case NUMERIC://数字和日期类型
                if (DateUtil.isCellDateFormatted(cell)) {
                    //如果是日期类型
                    obj = cell.getDateCellValue();
                } else {
                    //数字类型
                    obj = cell.getNumericCellValue();
                    DecimalFormat format = new DecimalFormat("#");
                    //修改小数点的问题
                    obj = format.format(obj);
                }
                break;
            case FORMULA://如果是公式
                obj = cell.getCellFormula();
                break;

        }


        return obj;


    }

}

5.项目中的使用

引入依赖

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
上一篇:IO流体系


下一篇:Java IO流--使用FileInputStream和FileOutputStream复制图片和文件