POI报表打印

一、Excel报表(POI)

1、需求说明

在企业级应用开发中,Excel报表是一种最常见的报表需求。Excel报表开发一般分为两种形式:
1、为了方便操作,基于Excel的报表批量上传数据
2、通过java代码生成Excel报表。
在Saas-Export系统中,也有大量的报表操作,那么接下来的课程就是一起来学习企业级的报表开发

2、Excel报表概述

目前世面上的Excel 分为两个大的版本Excel2003 和Excel2007 及以上两个版本;
两者之间的区别如下:

3、常见的Excel操作工具

Java中常见的用来操作Excl的方式一般有2种:JXL和POI。

  • JXL只能对Excel进行操作,属于比较老的框架,它只支持到Excel 95-2000的版本。现在已经停止更新和维护。

  • POI是apache的项目,可对微软的Word,Excel,Ppt进行操作,包括office2003和2007,Excl2003和2007。poi现在一直有更新。所以现在主流使用POI。

4、什么是POI

Apache POI是Apache软件基金会的开源项目,由Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java语言操作Microsoft Office的功能。

Apache POI是目前最流行的操作Microsoft Office的API组件,借助POI可以方便的完成诸如:数据报表生成,数据批量上传,数据备份等工作

5、POI简单实现

5.1、搭建环境

创建工程导入坐标:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>4.0.1</version>
</dependency>

POI 工程结构
HSSF 提供读写Microsoft Excel XLS 格式档案的功能。
XSSF 提供读写Microsoft Excel OOXML XLSX 格式档案的功能。
HWPF 提供读写Microsoft Word DOC 格式档案的功能。
HSLF 提供读写Microsoft PowerPoint 格式档案的功能。
HDGF 提供读Microsoft Visio 格式档案的功能。
HPBF 提供读Microsoft Publisher 格式档案的功能。
HSMF 提供读Microsoft Outlook 格式档案的功能。

5.2、API说明

HSSF提供读写Microsoft Excel XLS格式档案的功能。 2003版本
XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。2007版本
API名称说明
Workbook Excel的文档对象,针对不同的Excel类型分为:HSSFWorkbook(2003)和XSSFWorkbool(2007)
Sheet Excel的表单
Row Excel的行
Cell Excel的格子单元
Font Excel字体
CellStyle 格子单元样式

5.2、创建excel

public class PoiTest01 {
​
   /**
    * 创建一个excel
    *      创建excel:
    *          1.创建工作簿
    *          2.创建sheet
    *          3.创建行对象
    *          4.创建单元格
    *          5.对单元格赋值
    *          6.设置样式
    *          7.下载
    */
   @Test
   public void test() throws Exception {
      //1.创建一个工作簿
      //Workbook wb = new HSSFWorkbook(); //处理excel2003版本      .xls
      Workbook wb = new XSSFWorkbook();//处理excel2007及以上版本    .xlsx
      //new SXSSFWorkbook();// 处理大数据量excel报表对象
      //2.创建sheet
      Sheet sheet = wb.createSheet("abc");
      //3.创建行对象
      Row row = sheet.createRow(1);//接受参数 ,数组下标
      //4.创建单元格
      Cell cell = row.createCell(1);//数组下表
      //5.设置单元格内容
      cell.setCellValue("测试文本");
​
      //设置样式
      /**
       * 1.创建样式对象
       * 2.通过样式对象指定样式
       * 3.配置单元个样式
       */
      CellStyle cellStyle = wb.createCellStyle();
      //通过样式对象指定样式
      cellStyle.setBorderTop(BorderStyle.THIN); //细线
      cellStyle.setBorderBottom(BorderStyle.THIN); //细线
      cellStyle.setBorderLeft(BorderStyle.THIN); //细线
      cellStyle.setBorderRight(BorderStyle.THIN); //细线
//字体 对象
      Font font = wb.createFont();
      font.setFontName("华文行楷");
      font.setFontHeightInPoints((short)26);//字号
​
      cellStyle.setFont(font);
      cell.setCellStyle(cellStyle);
​
      //指定行高和列宽
      sheet.setColumnWidth(1,20*256); //列宽  不准确!!!
      row.setHeightInPoints(30);
​
      //6.将excel保存到本地磁盘中
      FileOutputStream fos = new FileOutputStream("E:\text.xlsx");
      wb.write(fos);
      fos.close();
   }
}

2.3、读取excel

public static void main(String[] args) throws Exception {
        //1.根据Excel 文件创建工作簿
        Workbook wb = new XSSFWorkbook("C:\demo.xlsx");
        //2.获取Sheet
        Sheet sheet = wb.getSheetAt(0);//参数:索引
        //3.获取Sheet 中的每一行,和每一个单元格,小于等于表中有效行的最后一行的行号,POI将行号从0开始
        for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) {
            Row row = sheet.getRow(rowNum);//根据索引获取每一个行
            StringBuilder sb = new StringBuilder();
            for (int cellNum = 2; cellNum < row.getLastCellNum(); cellNum++) {
                //根据索引获取每一个单元格
                Cell cell = row.getCell(cellNum);
                //获取每一个单元格的内容
                Object value = getCellValue(cell);
                sb.append(value).append("-");
            }
            System.out.println(sb.toString());
        }
    }

    public static Object getCellValue(Cell cell) {
        //1.获取到单元格的属性类型
        CellType cellType = cell.getCellType();
        //2.根据单元格数据类型获取数据,此处注意,cell中的日期格式其实就是数字格式
        Object value = null;
        switch (cellType) {
            case STRING:
                value = cell.getStringCellValue();
                break;
            case BOOLEAN:
                value = cell.getBooleanCellValue();
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(cell)) {
                    //日期格式
                    value = cell.getDateCellValue();
                } else {
                    //数字
                    value = cell.getNumericCellValue();
                }
                break;
            case FORMULA: //公式
                value = cell.getCellFormula();
                break;
            default:
                break;
        }
        return value;
    }

 POI中有关样式的设置

    //大标题的样式
    public CellStyle bigTitle(Workbook wb){
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setFontName("宋体");
        font.setFontHeightInPoints((short)16);
        font.setBold(true);//字体加粗
        style.setFont(font);
        style.setAlignment(HorizontalAlignment.CENTER);                //横向居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);        //纵向居中
        return style;
    }
    
    //小标题的样式
    public CellStyle title(Workbook wb){
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setFontName("黑体");
        font.setFontHeightInPoints((short)12);
        style.setFont(font);
        style.setAlignment(HorizontalAlignment.CENTER);                //横向居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);        //纵向居中
        style.setBorderTop(BorderStyle.THIN);                        //上细线
        style.setBorderBottom(BorderStyle.THIN);                    //下细线
        style.setBorderLeft(BorderStyle.THIN);                        //左细线
        style.setBorderRight(BorderStyle.THIN);                        //右细线
        return style;
    }

    //文字样式
    public CellStyle text(Workbook wb){
        CellStyle style = wb.createCellStyle();
        Font font = wb.createFont();
        font.setFontName("Times New Roman");
        font.setFontHeightInPoints((short)10);

        style.setFont(font);

        style.setAlignment(HorizontalAlignment.LEFT);                //横向居左
        style.setVerticalAlignment(VerticalAlignment.CENTER);        //纵向居中
        style.setBorderTop(BorderStyle.THIN);                        //上细线
        style.setBorderBottom(BorderStyle.THIN);                    //下细线
        style.setBorderLeft(BorderStyle.THIN);                        //左细线
        style.setBorderRight(BorderStyle.THIN);                        //右细线

        return style;
    }
原文地址:https://www.cnblogs.com/kitor/p/11099191.html