Java使用POI实现对Excel文件的读写

Wesley13
• 阅读 553

Apache POI提供了Java程序读取和写入MS Office文档的接口。 对于Excel文档读写: -HSSF:提供读写MS Excel的xls文件的功能。 -XSSF:提供读写MS Excel的xlsx文件的功能。

Java使用POI实现对Excel文件的读写操作

本篇的ExcelUtils工具类,主要针对于**一行数据(row)作为一个实例(t)**的情况使用。

Excel对象

Java对象

表格(sheet)

List<T>

行(row)

T 的一个实例 (t)

单元格(cell)

对象 t 的某个属性

package com.liziczh.ims.tools;

import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.LinkedList;
import java.util.List;

/**
 * Excel文件读写工具类:针对一行数据(row)作为一个实例(t)的情况
 */
public class ExcelUtils {
    /**
     * 针对xlsx文件,使用XSSFWorkbook,要求excel版本在2007以上
     *
     * @param T 泛型类,行对象
     * @param filepath 文件路径
     * @return
     * @throws Exception
     */
    public static <T> List<T> readExcel(Class T,String filepath){
        try {
            if(filepath != null && !"".equals(filepath)){
                // 工作簿
                Workbook xwb = new XSSFWorkbook(new FileInputStream(filepath));
                // 表格
                Sheet sheet = null;
                // 行
                Row row = null;
                // 单元格
                Cell cell = null;
                // 表
                sheet = xwb.getSheetAt(0);
                List<T> sheetList = new LinkedList<>();
                for(int i = sheet.getFirstRowNum()+1; i < sheet.getPhysicalNumberOfRows(); i++){
                    // 获取第i行
                    row = sheet.getRow(i);
                    // 利用反射生成一个实例
                    T t = (T) T.newInstance();
                    // 依此获取单元格放入对象t中
                    for(int j = row.getFirstCellNum(); j < row.getPhysicalNumberOfCells(); j++){
                        // 获取第i行第j列的单元格,
                        cell = row.getCell(j);
                        // 获取对象的属性数组
                        Field[] fs = t.getClass().getDeclaredFields();
                        // 设置属性为可访问
                        fs[j].setAccessible(true);
                        // 类型转换:将单元格内容先转为String再转为当前属性所对应的类型
                        if(fs[j].getType() == String.class){
                            fs[j].set(t,fs[j].getType().cast(cell.toString()));
                        } else if (fs[j].getType() == int.class) {
                            fs[j].set(t,new Integer(cell.toString()));
                        } else if(fs[j].getType() == short.class){
                            fs[j].set(t,new Short(cell.toString()));
                        }else if(fs[j].getType() == long.class){
                            fs[j].set(t,new Long(cell.toString()));
                        }else if(fs[j].getType() == byte.class){
                            fs[j].set(t,new Byte(cell.toString()));
                        }else if(fs[j].getType() == float.class){
                            fs[j].set(t,new Float(cell.toString()));
                        }else if(fs[j].getType() == double.class){
                            fs[j].set(t,new Double(cell.toString()));
                        }
                    }
                    // 将对象t添加到集合中
                    sheetList.add(t);
                }
                return sheetList;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 针对xlsx文件,使用XSSFWorkbook,要求excel版本在2007以上
     *
     * @param list 数据
     * @param T 泛型类,行对象
     * @param colNames 表头信息,
     * @param filepath 文件路径
     * @return
     * @throws Exception
     */
    public static <T> void writeExcel(List<T> list,Class T,String[] colNames,String filepath) {
        if(filepath != null && !"".equals(filepath)){
            // 工作簿
            Workbook workbook = new XSSFWorkbook();
            // 表格
            Sheet sheet = workbook.createSheet("0");
            // 行
            Row row = null;
            // 单元格
            Cell cell = null;
            // 设置表头样式
            CellStyle headerStyle = workbook.createCellStyle();
            headerStyle.setAlignment(HorizontalAlignment.CENTER);
            Font headerFont = workbook.createFont();
            headerFont.setBold(true);
            headerStyle.setFont(headerFont);
            // 通过colNames数组生成表头
            row = sheet.createRow(0);
            for (int c = 0; c < colNames.length; c++) {
                cell = row.createCell(c);
                cell.setCellValue(colNames[c]);
                cell.setCellStyle(headerStyle);
            }
            // 设置单元格样式
            CellStyle cellStyle = workbook.createCellStyle();
            cellStyle.setAlignment(HorizontalAlignment.CENTER);
            // 通过一个List生成表内数据
            for (int r = 0; r < list.size(); r++) {
                // 获取一个List元素(即一个T的实例)
                T t = list.get(r);
                // 获取对象t的所有属性
                Field[] fs = t.getClass().getDeclaredFields();
                // 生成行
                row = sheet.createRow(r + 1);
                // 依此获取对象t的属性值 赋予 单元格
                for (int j = 0; j < fs.length; j++) {
                    try {
                        // 设置属性为可访问
                        fs[j].setAccessible(true);
                        // 生成一个单元格
                        cell = row.createCell(j);
                        // 将属性值赋予单元格
                        cell.setCellValue(String.valueOf(fs[j].get(t)));
                        cell.setCellStyle(cellStyle);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
            // 设置表名
            workbook.setSheetName(0, T.getName());
            // 生成xlsx文件
            FileOutputStream out = null;
            try {
                out = new FileOutputStream(new File(filepath));
                workbook.write(out);
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }


}
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java使用POI将数据导出放入Excel
本文主要是将数据库取出的数据按照自定义的行列格式导出到excel中,POI则是实现我们需求所用到的技术。POI介绍使用springboot导入相关依赖获取数据(自行处理)完整代码实例:创建excel,将数据写入excel1.POI介绍要想使用POI对Excel进行操作,我们需要先了
Wesley13 Wesley13
2年前
java,poi读取excel单元格为空的数据,出现空指针异常:java.lang.NullPointerException
java,poi读取excel单元格为空的数据,出现空指针异常:java.lang.NullPointerException参考文章:(1)java,poi读取excel单元格为空的数据,出现空指针异常:java.lang.NullPointerException(https://www.oschina.net/action/GoToLi
Wesley13 Wesley13
2年前
java简单的导出Excel文件
特点列出List中要导入到Excel的列名中文名,然后就完事了。具体的看看main()你就知道有多简单了。利用POI,本工具类可以实现Excel导出和下载,话不多说,放码过来。 packagecom.fantong.ois.wms.utils;importorg.apache.poi.hssf.usermodel.
Wesley13 Wesley13
2年前
java导出多sheet的excel
excel工具类,适合单sheet或多sheet的excel表格导出packageUtil;importorg.apache.poi.hssf.usermodel.HSSFWorkbook;importorg.apache.poi.ss.usermodel.\;importjavax.servlet.ServletOut
Wesley13 Wesley13
2年前
.NET NPOI导出Excel详解
NPOI,顾名思义,就是POI的.NET版本。那POI又是什么呢?POI是一套用Java写成的库,能够帮助开发者在没有安装微软Office的情况下读写Office的文件。支持的文件格式包括xls,doc,ppt等。官方网站:http://npoi.codeplex.com/(https://www.oschina.net/action/GoT
Stella981 Stella981
2年前
Golang 操作Excel文件
日常开发中会遇到处理Excel文件的相关操作,这里推荐一款应用比较广泛的操作Excel的开源工具Excelize。Excelize是一个用Go语言编写的库,提供了一组允许您写入和读取XLSX/XLSM/XLTM文件的功能。支持读写由MicrosoftExcel™2007和更高版本生成的电子表格文档。通过高度兼容性支持复杂的组件,并提供了流式AP
Stella981 Stella981
2年前
Python操作Excel
前言:Python操作Excel使用openpyxl模块,python中有好几个与excel相关操作的模块。xlrd库:从excel中读取数据,支持xls、xlsx格式。xlwt库:对excel进行修改操作,不支持对xlsx格式的修改。xlutils库:在xlrd和xlwd中对一个已存在的文件进行修改。openpyxl库:
Wesley13 Wesley13
2年前
Java解析excel工具easyexcel助你快速简单避免OOM[图]
Java解析excel工具easyexcel助你快速简单避免OOM\图\Java解析、生成Excel比较有名的框架有Apachepoi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗
Stella981 Stella981
2年前
PostgreSQL 使用advisory lock实现行级读写堵塞
背景PostgreSQL的读写是不冲突的,这听起来是件好事对吧,读和写相互不干扰,可以数据库提高读写并发能力。但是有些时候,用户也许想让读写冲突(需求:数据正在被更新或者删除时,不允许被读取)。那么有方法能实现读写冲突吗?PostgreSQL提供了一种锁advisorylock,可以实现读写堵塞的功能。使用advisoryloc