poi学习笔记

这篇博客详细介绍了Apache POI库用于Java操作Excel的使用,包括POI的概述、特点、导入导出Excel的步骤以及实战应用。此外,还探讨了JXL库,指出其在简单Excel操作上的优势,并提供了JXL的特性、依赖引入及导入导出Excel的教程。对于不同需求,博主给出了选择POI或JXL的建议。

POI学习笔记

poi概述:

Apache POI 是 Apache 软件基金会的开放源码函式库,POI 提供 API 给 Java 程序对Microsoft Office 格式
档案读和写的功能。

poi特点:

1. 效率高
2. 支持公式,宏,一些企业应用上会非常实用
3. 能够修饰单元格属性
4. 支持字体、数字、日期操作
5. API 丰富,支持多种模式的读写
6. 支持大数量大文件的读写操作

poi导入导出excle

1. 导入poi依赖jar
<!-- poi依赖jar -->
    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.17</version>
    </dependency>
2.poi导出
1.poi导出excel文件
public class POIExportTest {
    public static void main(String[] args) throws IOException {
        //构建excel
        Workbook workbook = new HSSFWorkbook();
        //构建excel工作表
        Sheet sheet = workbook.createSheet("第一张表");
        //构建excel工作表的行   下标从 0 开始
        Row row = sheet.createRow(0);
        //构建excel工作表的行的单元格   下标从 0 开始
        Cell cell = row.createCell(0);
        //填充单元格的内容
        cell.setCellValue("编号");
        //使用输出流将构建的excel文件输出到文件夹,创建excel文件
        workbook.write(new FileOutputStream(new File("E:\\Java\\3_Framework\\ideaCode\\poi\\src\\main\\webapp\\第一张表.xls")));
    }
}
2.poi调整样式导出excel文件
public class POIExportTest {
    public static void main(String[] args) throws IOException {
        //构建excel工作簿
        Workbook workbook = new HSSFWorkbook();
        //构建excel工作表
        Sheet sheet = workbook.createSheet("第一张表");
        //构建excel工作表的行   下标从 0 开始
        Row row = sheet.createRow(0);
        //构建excel工作表的行的单元格   下标从 0 开始
        Cell cell = row.createCell(0);
        //填充单元格的内容
        cell.setCellValue(new Date());

        /**
         * 设置单元格列宽  --- 第 1 个参数:第几列 ;  第 2 个参数:单元格列宽,进制为256,即 参数2=列宽*256
         */
        sheet.setColumnWidth(0,8000);
        /**
         * 字体设置
         * 创建excel工作簿字体设置对象
         */
        Font font = workbook.createFont();
        //设置字体颜色
        font.setColor(Font.COLOR_RED);
        /**
         * 时间格式的设置
         * 创建时间格式对象
         */
        DataFormat dataFormat = workbook.createDataFormat();
        //设置时间格式
        short format = dataFormat.getFormat("yyyy年MM月dd日");
        /**
         * 调整excel单元格样式
         * 创建单元格样式对象
         */
        CellStyle cellStyle = workbook.createCellStyle();
        //设置单元格样式  为 --- 居中
        cellStyle.setAlignment(HorizontalAlignment.CENTER);
        //设置单元格的字体颜色样式
        cellStyle.setFont(font);
        //将时间格式设置到单元格
        cellStyle.setDataFormat(format);
        //将样式添加到单元格
        cell.setCellStyle(cellStyle);

        //使用输出流将构建的excel文件输出到文件夹,创建excel文件
        workbook.write(new FileOutputStream(new File("E:\\Java\\3_Framework\\ideaCode\\poi\\src\\main\\webapp\\第一张表.xls")));
    }
}
3.poi导入
1.poi导入excel文件
public class POIImportTest {
    public static void main(String[] args) throws IOException {
        //使用输入流读取文件到工作簿
        Workbook workbook = new HSSFWorkbook(new FileInputStream("E:\\Java\\3_Framework\\ideaCode\\poi\\src\\main\\webapp\\第一张表.xls"));
        //获取读取到工作簿中的表,  参数:excel文件中表的表名
        Sheet sheet = workbook.getSheet("第一张表");
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            //遍历获取到的表,获取行
            Row row = sheet.getRow(i);
            for (int j = 0; j < row.getLastCellNum(); j++) {
                //遍历获取的行,获取单元格
                Cell cell = row.getCell(j);
                //获取单元格内容
                Date dateCellValue = cell.getDateCellValue();
                //输出
                System.out.println(dateCellValue);
            }
        }
    }
}

poi导出实战

public class CustomExport {
    /**
     * @author gaozhy
     * @2017 年 2 月 15 日下午 9:57:33
     * @version 1.0
     * @param resp
     * @description 自定义导出
     */
    @RequestMapping("/customExport")
    // 参数一:需要查询的列信息 参数二:标题栏内容
    public void customExport(String queryCondition, String title,HttpServletResponse resp) {
        try {
            // 根据列信息,查用户信息
            // select ${queryCondition} select cmfz_user
            List<User> list = userService.queryUserByField(queryCondition);
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet("用户信息");
            // 获取所有标题
            String[] titles = title.split(",");
            // 获取导出字段
            String[] fields = queryCondition.split(",");
            // 处理标题栏
            HSSFRow row = sheet.createRow(0);
            for (int i = 0; i < titles.length; i++) {
                row.createCell(i).setCellValue(titles[i]);
            }
            // 处理数据行
            for (int i = 1; i <= list.size(); i++) {
                // 获得数据行对象
                HSSFRow dataRow = sheet.createRow(i);
                // 获取 User 对象
                User user = list.get(i - 1);
                Class<? extends User> c = user.getClass();
                // 拿到字段名
                for (int j = 0; j < fields.length; j++) {
                    // user_id 拆分字段
                    String[] str = fields[j].split("_");
                    // 处理 get 方法名
                    String name = "get";
                    // 属性没有 _ 拼接
                    if (str.length == 1) {
                        name += str[0].substring(0, 1).toUpperCase() + str[0].substring(1, str[0].length());
                    } else {
                        name += str[0].substring(0, 1).toUpperCase() + str[0].substring(1, str[0].length());
                        // user id
                        for (int k = 1; k < str.length; k++) {
                            name += str[k].substring(0, 1).toUpperCase() + str[k].substring(1, str[k].length());
                        }
                    }
                    System.out.println(name);
                    //使用反射通过上面获取的get方法名,获取对应的值
                    Object obj = c.getDeclaredMethod(name, null).invoke(user,null);
                    // 调用 set 方法给单元格设值
                    dataRow.createCell(j).setCellValue(obj.toString());
                }
            }
            String fileName = "用户报表(" + new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + ").xls";
            // 处理中文下载名乱码
            fileName = new String(fileName.getBytes("gbk"),
                    "iso-8859-1");
            // 设置 response
            resp.setContentType("application/vnd.ms-excel");
            resp.setHeader("content-disposition", "attachment;filename=" + fileName);
            workbook.write(resp.getOutputStream());
            workbook.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

poi延伸–jxl

除poi外,JXL 是一个开源的 Java Excel API 项目,通过 JXL,Java 可以很方便的操作微软的 Excel 文档。

1.jxl特点
1. Jxl 对中文支持非常好,操作简单,方法看名知意。
2. Jxl 是纯 javaAPI,在跨平台上表现的非常完美,小文件读取效率比较高。
3. 支持字体、数字、日期操作
4. 能够修饰单元格属性
5. 支持图像和图表,但是这套 API对图形和图表的支持很有限,而且仅仅识别 PNG 格式。
2.导入jxl依赖jar
3.jxl导入导出excel
1.jxl导出
/**
* @author gaozhy
* @2017 年 2 月 15 日下午 8:30:13
* @version 1.0
* @description jxl 导出 excel
*/
@Test
public void jxlExport(){
    try {
		// 创建 Excel 工作薄对象
		WritableWorkbook workbook = Workbook.createWorkbook(new
		FileOutputStream("e:\\用户 1.xls"));
		//创建工作表
		//第一个参数:工作表 sheet 名称 第二个参数:工作表 sheet 索引值 0 表示第一个 sheet 页索引
		WritableSheet sheet = workbook.createSheet("用户信息", 0);
		//设置
		sheet.setColumnView(2, 15);
		String[] title = {"编号","姓名","出生年月"};
		//创建单元格对象
		Label label = null;
		//处理标题栏
		for (int i = 0; i < title.length; i++) {
			//第一个参数 列索引 第二个参数 行索引 第三个参数 单元格内容
			label = new Label(i,0,title[i]);
			//sheet 页添加单元格
			sheet.addCell(label);
		}
		for (int i = 1; i < 10; i++) {
			label = new Label(0,i,""+i);
			sheet.addCell(label);
			label = new Label(1,i,"张三"+i);
			sheet.addCell(label);
			//日期格式特殊处理
			DateFormat format = new DateFormat("yyyy年MM月dd日HH:mm:ss");
			WritableCellFormat cellFormat = new
			WritableCellFormat(format);
			//第一个参数:列索引 第二个参数:行索引 第三个参数:日期内容 第四个参数:日期格式
			sheet.addCell(new DateTime(2, i, new Date(),cellFormat));
		}
		workbook.write();
		workbook.close();
	} catch (Exception e) {
		e.printStackTrace();
    }
}
2.jxl导入
/**
* @author gaozhy
* @2017 年 2 月 15 日下午 8:20:31
* @version 1.0
* @description jxl 文件导入
*/
@Test
public void jxlImportExcel(){
	try {
		FileInputStream inputStream = new FileInputStream("e:\\用户1.xls");
		//创建工作薄
		Workbook workbook = Workbook.getWorkbook(inputStream);
		//获取 sheet 页
		Sheet[] sheets = workbook.getSheets();
		//获取第一个 sheet
		Sheet sheet = sheets[0];
		//获取总行数
		int rows = sheet.getRows();
		for (int i = 1; i < rows; i++) {
			//获取指定索引 数据行 返回单元格数组
			Cell[] cells = sheet.getRow(i);
			for (int j = 0; j < sheet.getColumns(); j++) {
				if(cells[j].getType() == CellType.DATE){
					DateCell dateCell = (DateCell)cells[j];
					// 注意:JXL 读取 Excel 日期时间多出了 8 个小时
					// 获取格林时区
					TimeZone zone = TimeZone.getTimeZone("GMT");
					// 定义日期格式
					SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
					format.setTimeZone(zone);
					System.out.println(format.format(dateCell.getDate()));
				}else{
					System.out.print(cells[j].getContents()+" ");
				}
			}
			System.out.println();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}
注:poi与jxl的使用

对于简单的单表 Excel 导入导出的需求,建议使用 JXL。数据量稍微小点, 占用内存少,速度快。 对于报表类的,涉及月份数据量,多 表数据聚合在一起建议使用 POI。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值