Excel报表打印(POI)

1.需求说明

在企业级应用开发中,Excel报表是一种最常见的报表需求。Excel报表开发一般分为两种形式:
1、为了方便操作,基于Excel的报表批量上传数据
2、通过java代码生成Excel报表。

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入门

搭建环境

引入坐标

<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>

API说明

HSSF提供读写Microsoft Excel XLS格式档案的功能。 2003版本
XSSF提供读写Microsoft Excel OOXML XLSX格式档案的功能。2007版本

创建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.配置单元个样式
*/2.3、读取excel
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();
  }
}

读取Excel

读取如下报表

/**
 * 加载excel文件,并读取内容
 */
public class PoiTest02 {
    @Test
    public void test() throws Exception {
        //1.根据excel文件加载工作簿
        Workbook wb = new XSSFWorkbook("E:\\demo1.xlsx");
        //2.读取第一个sheet
        Sheet sheet = wb.getSheetAt(0);//数组下标
        //3.循环sheet中的每一行
        //sheet.getLastRowNum 获取最后一行的数组下标
        for(int i=0;i<sheet.getLastRowNum()+1;i++) {
            Row row = sheet.getRow(i);
            //row.getLastCellNum() 获取最大行数
            //4.读取行中的每一个单元格
            String str = "";
            for(int j=0;j<row.getLastCellNum();j++) {
                Cell cell = row.getCell(j);
                //5.获取单元格中的数据
                if(cell != null) {
                    str += getCellValue(cell);
                }
            }
            System.out.println(str);
        }
    }
    public Object getCellValue(Cell cell) {
        /**
         * 获取单元格的类型
         */
        CellType type = cell.getCellType();
        Object result = null;
        switch (type) {
            case STRING:{
                result = cell.getStringCellValue();//获取string类型数据
                break;
            }
            case NUMERIC:{
                /**
                 * 判断
                 */
                if(DateUtil.isCellDateFormatted(cell)) { //日期格式
                    result = cell.getDateCellValue();
                }else{
                    //double类型
                    result = cell.getNumericCellValue(); //数字类型
                }
                break;
            }
            case BOOLEAN:{
                result = cell.getBooleanCellValue();//获取boolean类型数据
                break;
            }
            default:{
                break;
            }
        }
        return result;
    }
}

 思考

Excel报表打印项目实际操作上遇到的问题
从数据库查询出来的Excel数据并不一定是来自于一张表,可能来自于多张表
解决:我们需要自定义一个javaBean实体,从数据库查询出来返回到实体中
当然sql语句还是很重要的:
我们运用多表联查,并且可能要一些表单创建时间查询,这里我们
用到了MySql的日期函数

场景附一条sql语句

<!--查询报表数据-->
<select id="findByCreateTime" parameterType="map" resultType="cn.jia.domain.vo.ContractProductVo">
SELECT
c.custom_name customName,
c.contract_no contractNo,
cp.product_no productNo,
cp.cnumber cnumber,
cp.factory_name factoryName,
c.delivery_period deliveryPeriod,
c.ship_time shipTime,
c.trade_terms tradeTerms
FROM co_contract c,co_contract_product cp
WHERE c.id = cp.contract_id
and c.company_id = #{companyid}
AND DATE_FORMAT(create_time,‘%Y-%m‘) = #{inputDate}
</select>

 

附Mysql日期函数

MySQL DATE_FORMAT() 函数

 

定义和用法

DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。

语法

DATE_FORMAT(date,format)

 

date 参数是合法的日期。format 规定日期/时间的输出格式。

可以使用的格式有:


格式


描述


%a


缩写星期名


%b


缩写月名


%c


月,数值


%D


带有英文前缀的月中的天


%d


月的天,数值(00-31)


%e


月的天,数值(0-31)


%f


微秒


%H


小时 (00-23)


%h


小时 (01-12)


%I


小时 (01-12)


%i


分钟,数值(00-59)


%j


年的天 (001-366)


%k


小时 (0-23)


%l


小时 (1-12)


%M


月名


%m


月,数值(00-12)


%p


AM 或 PM


%r


时间,12-小时(hh:mm:ss AM 或 PM)


%S


秒(00-59)


%s


秒(00-59)


%T


时间, 24-小时 (hh:mm:ss)


%U


周 (00-53) 星期日是一周的第一天


%u


周 (00-53) 星期一是一周的第一天


%V


周 (01-53) 星期日是一周的第一天,与 %X 使用


%v


周 (01-53) 星期一是一周的第一天,与 %x 使用


%W


星期名


%w


周的天 (0=星期日, 6=星期六)


%X


年,其中的星期日是周的第一天,4 位,与 %V 使用


%x


年,其中的星期一是周的第一天,4 位,与 %v 使用


%Y


年,4 位


%y


年,2 位

实例

下面的脚本使用 DATE_FORMAT() 函数来显示不同的格式。我们使用 NOW() 来获得当前的日期/时间:

DATE_FORMAT(NOW(),‘%b %d %Y %h:%i %p‘)

DATE_FORMAT(NOW(),‘%m-%d-%Y‘)

DATE_FORMAT(NOW(),‘%d %b %y‘)

DATE_FORMAT(NOW(),‘%d %b %Y %T:%f‘)

结果类似:

Dec 29 2008 11:45 PM

12-29-2008

29 Dec 08

29 Dec 2008 16:25:46.635

原文地址:https://www.cnblogs.com/WonderfulU/p/11198497.html

时间: 2024-10-31 12:45:16

Excel报表打印(POI)的相关文章

在ASP程序中打印Excel报表的新方法

目前,B/S模式(浏览器/服务器模式)成为企业网上首选的计算模式.由于B/S模式的特殊性,在C/S下相对较易实现的Excel报表打印功能在B/S下却成为一个难点.本人通过研究写了一个基于ASP程序的打印Excel报表的程序.本程序的特点是无须任何组件. Print.asp ------------------------------------------------ <html><title>打印Excel报表</title> <% '控制脚本语言 respon

Java使用POI实现数据导出excel报表

在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF .所以今天我们来简单看一下利用Apache  POI实现数据库中数据导出excel报表.在java中有很多实现数据导出excel报表的第三方jar包.但在比较了一下感觉还是POI相对来

.NET下Excel报表的打印

说明:这是一个实验的小例子,在实际项目中使用时,一般Object[,] 对象的数据来源于数据库. 1. 实验环境 开发平台:Visual Studio 2010 测试模板:JBtest Excel:Office2007 Excel 2. 项目所用组件 为什么选择ASP.NET做打印的功能,因为office和Visual  studio同是微软的开发软件,具有良好的兼容性,利用上述.dll组件,可以轻松实现excel模板的导入和excel数据的导出. ExcelQuicker.dll动态链接库需要

poi导出Excel报表多表头双层表头、合并单元格

效果图: controller层方法: /**     *      * 导出Excel报表     * @param request     * @return     *      */    @RequestMapping("/export")    @ResponseBody    public void export(HttpServletRequest request,            HttpServletResponse response, String year

Atitit.导出excel报表的设计与实现java&#160;.net&#160;php&#160;总结

Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1.3. 支持http web直接输出1 2. Api2 2.1. private static void toExcel(String titles, String filds,List<Map> list,OutputStream outStrm)2 2.2. Response版 toExcel

数据库与Excel报表的动态生成

一.数据库与Excel报表的动态生成 (1)读取数据库的数据动态生成Excel报表,这是JSP应用中常遇到的问题,本节采用的基本方法是: 在Excel工作薄中,将报表模板制作在第一张工作表中,从数据库中读取数据,利用POI组件复制模板工作表 而得到一张新的工作表,将查询数据填写到新的工作表中. (2) 实例分析 写一个Servlet程序,查询pubs数据库的titles表和sales表,把查询结果集数据填写到图6-14的报表中, 操作步骤如下: 第1步:新建一个名类为"DBExcelServle

java导出excel报表

1.java导出excel报表: package cn.jcenterhome.util; import java.io.OutputStream;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletResponse;import jxl.Workbook;import jxl.format.Alignment;import jxl.format.Border;import jxl.for

从数据库中导出excel报表

通常需要将后台数据库中的数据集或者是其他列表等导出excel 报表,这里主要引用了Apose.cells dll 类库, (1)直接上主要代码: protected void txtExport_Click(object sender, EventArgs e)         { try             { // 获取测试商品报表 IList<ProductEntity> pList = ProductBLL.getProductList(); // 导出到Excel中 Workbo

IReport+JasperReport+Applet报表打印

实现思路: [准备]使用IReport设计并编译报表模版. [服务端]使用JSP完成报表内容填充并获得打印对象. [客户端]使用Applet完成报表打印过程. 这种实现方式需要客户端安装JRE,及打印机驱动. 下面逐步分解: 1.[准备]使用IReport设计并编译报表模版. IReport的安装过程略--. 创建1个简单的报表并编译: 2.[服务端]使用JSP完成报表内容填充并获得打印对象. a.在工程中引入依赖的JAR包,根据报表的组件可能有变化,此处只根据样例报表,引用少数几个. b.编写