zoukankan      html  css  js  c++  java
  • Java使用POI导出excel(上)——基本操作

      相关的介绍参考自:http://zc985552943.iteye.com/blog/1491546

    一、概述

      1.概念

      受上文博文博主的启发,有必要先对excel的各个概念先做了解!

     //上述基本都是接口

    //一个excel表格
            HSSFWorkbook wb = new HSSFWorkbook();
            //一个工作表格(sheet)
            HSSFSheet sheet = wb.createSheet("sheet1");
            //一行(row)
            HSSFRow row = sheet.createRow(0);
            //一个单元格(cell)
            HSSFCell cell = row.createCell(0);
            //单元格样式(cellStyle)
            HSSFCellStyle cellStyle = wb.createCellStyle();
            //单元格内容样式(dataFormat)
            HSSFDataFormat format = wb.createDataFormat();
    View Code

      2.POI简介

          官网:http://poi.apache.org/

        官方API:http://poi.apache.org/apidocs/index.html

        (韩国的JExcel这里暂不介绍)

        是什么?(引用官网介绍)

        

        能干什么?

        这里我们介绍导出excel的功能操作

       怎么干?

        我们这里先介绍HSSF的使用。

        这里最主要的熟悉里面那一套接口

      需要环境:这里使用POI3.9的版本(这个版本更新比较快)

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>
    View Code

      推荐版本单独管理的maven依赖写法:

    <poi.version>3.9</poi.version>

     二、基本使用(HelloWorld)

      1.创建工作簿

     public static void main(String[] args) throws IOException {
            //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
            Workbook wb = new HSSFWorkbook();
            //使用工作簿的write()方法向文件输出工作簿
            FileOutputStream out = new FileOutputStream("E:\1.xls");
            wb.write(out);
            //流的关闭
            out.close();
        }

      

       2.创建sheet页

     public static void main(String[] args) throws IOException {
            //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
            Workbook wb = new HSSFWorkbook();
            //创建两个sheet页
            wb.createSheet("sheet1");
            wb.createSheet("sheet2");
            //创建流并将wb输出
            FileOutputStream out = new FileOutputStream("E:\2.xls");
            wb.write(out);
            //流的关闭
            out.close();
        }

      3.创建行和单元格

      excel中行的概念:(单元格即为行的每一个元素)

      

    public static void main(String[] args) throws IOException {
            //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
            Workbook wb = new HSSFWorkbook();
            //创建sheet页(使用的是带参构造器)
            Sheet sheet = wb.createSheet("sheet01");
            //创建行(从0开始)
            Row row = sheet.createRow(0);
            //创建单元格(第一列)
            Cell cell = row.createCell(0);
            //给单元格赋值
            cell.setCellValue("测试单元格内容");
            //创建流并将wb输出
            FileOutputStream out = new FileOutputStream("E:\3.xls");
            wb.write(out);
            //流的关闭
            out.close();
        }

      

      单元格创建其他值的示例

     public static void main(String[] args) throws IOException {
            //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
            Workbook wb = new HSSFWorkbook();
            //创建sheet页(使用的是带参构造器)
            Sheet sheet = wb.createSheet("sheet01");
            //创建行(从0开始)
            Row row = sheet.createRow(0);
            //创建单元格(第一列)
            Cell cell = row.createCell(0);
            //给单元格赋值
            cell.setCellValue("测试单元格内容");
            //测试其他的赋值方式
            row.createCell(1).setCellValue(1.1);    //第二列赋浮点值
            row.createCell(2).setCellValue(false);  //第三列赋值boolean型
            //创建流并将wb输出
            FileOutputStream out = new FileOutputStream("E:\4.xls");
            wb.write(out);
            //流的关闭
            out.close();
        }

    三、单元格数据格式

      1.时间样式单元格

     public static void main(String[] args) throws IOException {
            //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
            Workbook wb = new HSSFWorkbook();
            //创建sheet页(使用的是带参构造器)
            Sheet sheet = wb.createSheet("sheet01");
            //创建行(从0开始)
            Row row = sheet.createRow(0);
            //创建单元格(第一列)
            Cell cell = row.createCell(0);
            //给单元格赋值
            cell.setCellValue(new Date());
            //创建流并将wb输出
            FileOutputStream out = new FileOutputStream("E:\1.xls");
            wb.write(out);
            //流的关闭
            out.close();
        }

      效果:

      //可以看到,是一个长整形

      调整为时间样式:

     public static void main(String[] args) throws IOException {
            //创建工作簿 (使用了多态特性)    HSSFWorkbook wb = new HSSFWorkbook();
            Workbook wb = new HSSFWorkbook();
            //创建sheet页(使用的是带参构造器)
            Sheet sheet = wb.createSheet("sheet01");
            //创建行(从0开始)
            Row row = sheet.createRow(0);
            //创建单元格(第一列)
            Cell cell = row.createCell(0);
            //给单元格赋值
            cell.setCellValue(new Date());
            /*
             * ==========时间样式单元格==============
             */
            // CreationHelper 可以理解为一个工具类,由这个工具类可以获得 日期格式化的一个实例
            CreationHelper creationHelper = wb.getCreationHelper();
            //创建单元格样式类
            CellStyle cellStyle = wb.createCellStyle();
            //设置时间样式
            cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
            //给第一行第二列赋值
            Cell cell2 = row.createCell(1);
            cell2.setCellValue(new Date());
            cell2.setCellStyle(cellStyle);
            //创建流并将wb输出
            FileOutputStream out = new FileOutputStream("E:\2.xls");
            wb.write(out);
            //流的关闭
            out.close();
        }

      

       2.处理不同类型内容:

    public static void main(String[] args) throws IOException {
        Workbook wb = new HSSFWorkbook();
        Sheet sheet1 = wb.createSheet("三年级(1)班学生名单");
        Row row = sheet1.createRow(0);
        row.createCell(0).setCellValue(1);
        row.createCell(1).setCellValue("一个字符串");
        row.createCell(2).setCellValue(true);
        row.createCell(3).setCellValue(HSSFCell.CELL_TYPE_NUMERIC);
        row.createCell(4).setCellValue(false);
        FileOutputStream fos = new FileOutputStream(
                "c:\POI使用FileOutputStream输出流生成的工作簿.xls");
        wb.write(fos);
        fos.close();
        // wb 是需要关闭的,否则编译器会有提示
        wb.close();
    }

    //突如其来的断点防不胜防,这里这个示例是借的网友的

      3.遍历内容

    public static void main(String[] args) throws IOException {
           //通过输入流获取工作簿
           InputStream in = new FileInputStream("E:\1.xls");
           //(以下直接使用的是类而不是接口,因为类有实现还有自己的方法,更加强大)
           POIFSFileSystem fs = new POIFSFileSystem(in);
           HSSFWorkbook wb = new HSSFWorkbook(fs);
           HSSFSheet hssfSheet = wb.getSheetAt(0);  //获取第一个sheet页
          
           if(hssfSheet == null){   //sheet页不存在,不做处理
               return;
           }
           //遍历行
           for(int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++){
               HSSFRow hssfRow = hssfSheet.getRow(rowNum);
               if(hssfRow == null){ //空处理
                   continue;
               }
               //遍历列
               for(int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++){
                   HSSFCell hssfCell = hssfRow.getCell(cellNum);
                   if(hssfCell == null){    //空处理
                       continue;
                   }
                   System.out.print(getCellValue(hssfCell)+"    ");
               }
               System.out.println();
           }
        }
        
        /**
         * 封装的类型转换处理静态方法
         */
        private static String getCellValue(HSSFCell hssfCell){
            if(hssfCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN){
                return String.valueOf(hssfCell.getBooleanCellValue());
            } else if(hssfCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
                return String.valueOf(hssfCell.getNumericCellValue());
            } else{
                return String.valueOf(hssfCell.getStringCellValue());
            }
        }

     网友的switch版本:

      private static String getCellDate(Cell cell) {
            String return_string = null;
            switch (cell.getCellType()) {
            case HSSFCell.CELL_TYPE_STRING:
                return_string = cell.getStringCellValue();
                break;
            case HSSFCell.CELL_TYPE_NUMERIC:
                return_string = cell.getNumericCellValue() + "";
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN:
                return_string = String.valueOf(cell.getBooleanCellValue());
            default:
                return_string = "";
                break;
            }
            return return_string;
        }
    View Code

       

      

       //时间样式遍历待更新

      4.文本提取

    public static void main(String[] args) throws IOException {
           //通过输入流获取工作簿
           InputStream in = new FileInputStream("E:\1.xls");
           //(以下直接使用的是类而不是接口,因为类有实现还有自己的方法,更加强大)
           POIFSFileSystem fs = new POIFSFileSystem(in);
           HSSFWorkbook wb = new HSSFWorkbook(fs);
           
           ExcelExtractor excelExtractor = new ExcelExtractor(wb);
           //抽取文本输出
           System.out.println(excelExtractor.getText());
         in.close(); }

     //这里使用的是实现类,导包如下:

    import org.apache.poi.hssf.extractor.ExcelExtractor;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;

      

      //可以去掉sheet页名字

         ExcelExtractor excelExtractor = new ExcelExtractor(wb);
           excelExtractor.setIncludeSheetNames(false);
           //抽取文本输出
           System.out.println(excelExtractor.getText());

     四、单元格设置对齐、边框、合并等样式

      1.单元格对齐方式

     public static void main(String[] args) throws IOException {
            Workbook wb = new HSSFWorkbook();
            Sheet sheet1 = wb.createSheet("sheet1");
            Row row = sheet1.createRow(2);  //创建第3行
            row.setHeightInPoints(30);  //设置行高(可参见API等 )
            //调用封装的方法,创建单元格     (样式均是常量)
            Cell cell1 = createCell(wb, row, (short)0, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_BOTTOM); //使用short足够
            cell1.setCellValue("操作Excel");
            Cell cell2= createCell(wb, row, (short)1, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_TOP); //使用short足够
            cell2.setCellValue("操作Excel");
            FileOutputStream fos = new FileOutputStream("E:\5.xls");
            wb.write(fos);
            fos.close();
        }

      封装的私有方法:(请重视封装

     private static Cell createCell(Workbook wb,Row row,short column,short hailgn,short valign){
            Cell cell = row.createCell(column); //创建单元格
            cell.setCellValue(new HSSFRichTextString("富文本区域")); //字符串可以使用此方式
            //创建并设置样式
            CellStyle cellStyle = wb.createCellStyle();
            cellStyle.setAlignment(hailgn); //水平方向
            cellStyle.setVerticalAlignment(valign); //垂直方向
            //设置单元格样式
            cell.setCellStyle(cellStyle);
            return cell;
        }

       效果:

      其他样式请自行探索或根据文首文档查看。

      2.边框处理

    public static void main(String[] args) throws IOException {
            Workbook wb = new HSSFWorkbook();
            Sheet sheet1 = wb.createSheet("sheet1");
            Row row = sheet1.createRow(1);  //创建第2行
           
            Cell cell = row.createCell(1);  //创建第二列
            cell.setCellValue("666");
            //单元格样式
            CellStyle cellStyle = wb.createCellStyle();
            //同样,通过常量进行设置
            cellStyle.setBorderBottom(CellStyle.BORDER_THIN);   //底部边框样式
            //通过颜色索引设置底部颜色
            cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); //底部边框颜色
           
            //同理,设置左边样式
            cellStyle.setBorderLeft(CellStyle.BORDER_THICK);    //左边边框样式
            cellStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex());    //左边边框颜色
            
            //同理,设置右边样式
            cellStyle.setBorderRight(CellStyle.BORDER_DASHED);
            cellStyle.setRightBorderColor(IndexedColors.GREEN.getIndex());
            //最后,设置顶部样式
            cellStyle.setBorderTop(CellStyle.BORDER_THIN);
            cellStyle.setTopBorderColor(IndexedColors.BROWN.getIndex());
            
            //注入样式
            cell.setCellStyle(cellStyle);
            FileOutputStream fos = new FileOutputStream("E:\6.xls");
            wb.write(fos);
            fos.close();
        }

      效果:

       3.单元格填充色和颜色操作

    public static void main(String[] args) throws IOException {
            //创建工作簿和sheet页
            Workbook wb = new HSSFWorkbook();
            Sheet sheet1 = wb.createSheet("sheet1");
           
            Row row = sheet1.createRow(1);  //创建第2行
            Cell cell = row.createCell(1);  //创建第2列
            cell.setCellValue("777");
            
            CellStyle cellStyle = wb.createCellStyle();
            cellStyle.setFillBackgroundColor(IndexedColors.GREEN.getIndex());   //背景色
            cellStyle.setFillPattern(CellStyle.BIG_SPOTS);   //带点的效果
            
            //注入样式
            cell.setCellStyle(cellStyle);
            
            Cell cell2 = row.createCell(2);  //创建第2列
            cell2.setCellValue("777");
            
            CellStyle cellStyle2 = wb.createCellStyle();
            cellStyle2.setFillForegroundColor(IndexedColors.BLUE.getIndex());   //前景色
            cellStyle2.setFillPattern(CellStyle.SOLID_FOREGROUND);
            //注入样式
            cell2.setCellStyle(cellStyle2);
            FileOutputStream fos = new FileOutputStream("E:\7.xls");
            wb.write(fos);
            fos.close();
        }

      单元格颜色样式背景色未正确显示,待更新:

      4.单元格合并

     public static void main(String[] args) throws IOException {
            //创建工作簿和sheet页
            Workbook wb = new HSSFWorkbook();
            Sheet sheet1 = wb.createSheet("sheet1");
           
            Row row = sheet1.createRow(1);  //创建第2行
            Cell cell = row.createCell(1);  //创建第2列
            cell.setCellValue("单元格合并测试");
            
            //单元格合并是由sheet来控制的,cell是无法控制合并的(只能管自己的样式)
            //四个参数:起始结束行;起始结束列(注意都是从0开始)
            sheet1.addMergedRegion(new CellRangeAddress(1, 1, 1, 2));
           
            FileOutputStream fos = new FileOutputStream("E:\8.xls");
            wb.write(fos);
            fos.close();
        }

      效果:

      进一步测试合并4个单元格

    sheet1.addMergedRegion(new CellRangeAddress(1, 2, 1, 2));

      效果:

     五、操作excel的其他处理

      1.字体处理

     public static void main(String[] args) throws IOException {
            //创建工作簿和sheet页
            Workbook wb = new HSSFWorkbook();
            Sheet sheet1 = wb.createSheet("sheet1");
           
            Row row = sheet1.createRow((short)1);  //创建第2行
           
            //创建字体处理类
            Font font = wb.createFont();
            //设置字体相关样式
            font.setFontHeightInPoints((short)24); //设置高度
            font.setFontName("Courier New"); //设置字体名字(官方demo的宽体字体)
            font.setItalic(true);   //设置是否斜体
            font.setStrikeout(true);    //一种中间带线的样式(类似删除线),见效果
            
            //创建cellStyle,font是style中的一个样式
            CellStyle cellStyle = wb.createCellStyle();
            cellStyle.setFont(font);
            
            Cell cell = row.createCell((short)1);
            cell.setCellValue("单元格字体测试");
            
            //注入样式
            cell.setCellStyle(cellStyle);
            FileOutputStream fos = new FileOutputStream("E:\1.xls");
            wb.write(fos);
            fos.close();
        }

      2.读取和重写工作簿

     public static void main(String[] args) throws IOException {
            InputStream in = new FileInputStream("E:\1.xls");
            //通过输入流,得到工作簿
            POIFSFileSystem fs = new POIFSFileSystem(in);
            Workbook wb = new HSSFWorkbook(fs);
            //通过下标获取sheet页
            Sheet sheet1 = wb.getSheetAt(0);
       
            Row row = sheet1.getRow(1); //获取第一行
            Cell cell = row.getCell(0); //获取第一个单元格
            if(cell == null){   //为 Null则新建一个
                cell = row.createCell(3);
            }
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue("测试读取重写");
            FileOutputStream fos = new FileOutputStream("E:\1.xls");
            //重新写回原处
            wb.write(fos);
            fos.close();
        }

      //如报错,应该是excel文件被占用,退出文件占用即可

      效果:

      3.单元格使用换行

      如何在excel中换行呢?——使用 alt+enter

     

      

     public static void main(String[] args) throws IOException {
           //创建sheet页
           Workbook wb = new HSSFWorkbook();
           Sheet sheet1 = wb.createSheet("sheet1");
           
           //创建单元格
           Row row = sheet1.createRow(1);
           Cell cell = row.createCell(1);
           
           cell.setCellValue("即将换行 
     换行成功");
           
           //通过样式设置允许换行
           CellStyle cellStyle = wb.createCellStyle();
           cellStyle.setWrapText(true); //允许换行
           
           cell.setCellStyle(cellStyle);
           
           //调整行高(2倍默认行高)
           row.setHeightInPoints(2*sheet1.getDefaultRowHeightInPoints());
           //调整宽度,详见API
           sheet1.autoSizeColumn(2);
           
           FileOutputStream fos = new FileOutputStream("E:\2.xls");
           wb.write(fos);
           fos.close();
        }

      效果:

      4.创建用户自定义数据格式

    public static void main(String[] args) throws IOException {
           //创建sheet页
           Workbook wb = new HSSFWorkbook();
           Sheet sheet1 = wb.createSheet("sheet1");
           
           //数据格式属于style里的,类似字体
           DataFormat format = wb.createDataFormat();
           
           //定义
           CellStyle cellStyle;
           Row row;
           Cell cell;
           short rowNum = 0;
           short cellNum = 0;
           
           //创建
           row = sheet1.createRow(rowNum++);
           cell = row.createCell(cellNum++);
           
           cell.setCellValue(10086.258);
          
           cellStyle = wb.createCellStyle();
           cellStyle.setDataFormat(format.getFormat("0.0"));    //设置数据格式
           
           //注入样式
           cell.setCellStyle(cellStyle);
           //=========================
          
           row = sheet1.createRow(rowNum++);
           cell = row.createCell(cellNum++);
           
           cell.setCellValue(3456789.258);
          
           cellStyle = wb.createCellStyle();
           cellStyle.setDataFormat(format.getFormat("#,##0.000"));    //设置数据格式
           //注入样式
           cell.setCellStyle(cellStyle);
           
           FileOutputStream fos = new FileOutputStream("E:\3.xls");
           wb.write(fos);
           fos.close();
        }

      //定义与创建分离的写法(推荐)

      效果:

      其中,0.0为保留一位小数,自动四舍五入了

      第二个为3位3位按逗号分隔

  • 相关阅读:
    瀑布流布局——JS+绝对定位
    浏览器事件的思考
    css的hack详解
    主流浏览器的Hack写法
    [HTML&CSS] 未知高度多行文本垂直居中
    HTML标签的默认样式列表
    推荐的 CSS 书写顺序
    高效整洁CSS代码原则 (上)
    高效整洁CSS代码原则 (下)
    Xcode升级导致插件失效的解决办法
  • 原文地址:https://www.cnblogs.com/jiangbei/p/7306849.html
Copyright © 2011-2022 走看看