Java poi 实现excel导入导出工具类

最近项目上又要大量的涉及excel导入导出,网上各种导入导出的方式层出不穷,我是比较青睐官方的poi,但是要自己去操作工作簿对象自己一行一行的读取,会有很多的重复代码,重复劳动,也极为不美观,基于合成/聚合复用程序设计原则,降低耦合,所以提出来基于poi写了这套工具类。以前也写过类似的工具类,由于项目进度问题,没写博客记录,导致这次用的时候找不到了(此处捂脸一分钟),于是痛定思痛,又封装了这一套,写完赶紧写个博客记录下,方便自己以后有需要时查阅,如得各位大佬享用,荣幸之至,所有方法已在项目中验证,可直接使用,为了照顾有些宝宝所以下面写的很直白。

根据广大网友的使用实践,按bean类型导出时,不能序列化,否则会造成:Cannot write data, document seems to have been closed already 异常

1. 导入poi的maven依赖,版本4.0.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>
2.下载excel包放在你的项目里面(链接: excel.7z - 蓝奏云 密码:7khr ),也可点击我的csdn个人资源下载。

下载下来应该就是下面这个样子,excel文件夹,包含3个类,连同文件夹一起放在你的项目里,我这里是放在utils包下面的,下载下来会报错,需要自己调一下包引用路径。

ExcelUtils类:调用接口类,使用时也是使用这个类下的静态方法即可。
ExcelDataChecker类:poi操作数据的详细逻辑,很多方法ExcelUtils类只是做了一个转发,有人就会说,我使用的时候直接调用这个类不好吗?我明确的告诉你,不好!!!!这是基于程序设计的开闭原则设计的。如果使用,一定是调用ExcelUtils类下的静态方法。
EmptyChecker类:对象,字符判空的工具类,ExcelDataChecker类中有使用到。
3.如何使用:注意看ExcelUtils类方法上的注释,读取的方法是不区分xls和xlsx的,读取为实体类格式时,注意excel表头和字段名要一致才能映射。

 这里只是写几个示例,有些宝宝就算你给他封装好了,他还是不知道怎么用,还说你的方法没用。

 读取excel为List格式的:
 String fileName = "D:\\work-files\\3.xls";
        // 获取Excel文件
 File excelFile = new File(fileName);
 
//读取单页excel,获取List<HashMap<String, Object>>格式
 List<HashMap<String, Object>> list = ExcelUtils.parseSingleExcelToMap(excelFile);
 
 //读取多页excel,获取List<HashMap<String, Object>>格式
 List<List<HashMap<String, Object>>> lists =ExcelUtils.parseComplexExcel(excelFile);
读取excel为List<bean>格式的,有些宝宝又要问啥叫bean,简单点就是java类,你的实体类,UserEntity可以是任何实体类,只要字段和你的excel列表头一致:
 //获取baen格式的,之一此方法严格要求实体类字段和excel列的顺序一致
 List<? extends UserEntity> userEntities = ExcelUtils.readExcelToBean(excelFile, new UserEntity().getClass());
        
  //获取baen格式的,不要求顺序,只是表头和字段名一致即可
  List<? extends UserEntity> userEntitie = ExcelUtils.excelToBean(excelFile, new UserEntity().getClass());
下载也只需一行代码,示例map类型的,bean类型的自己去看。
@GetMapping("/excel")
public void excelTest(HttpServletResponse httpResponse){
    List<HashMap<String, Object>> li = new ArrayList<>();
    HashMap<String, Object> hashMap = new HashMap();
    hashMap.put("姓名", "张三");
    hashMap.put("年龄", "16");
    hashMap.put("性别", "女");
    hashMap.put("出生年月", new Date());
    hashMap.put("身价", 12.00F);
    li.add(hashMap);
    HashMap<String, Object> hashMap1 = new HashMap();
    hashMap1.put("姓名", "张三");
    hashMap1.put("年龄", "16");
    hashMap1.put("性别", "女");
    hashMap1.put("出生年月", new Date());
    hashMap1.put("身价", 123.77);
    li.add(hashMap1);
    
    //只需传入HttpServletResponse对象,文件名,数据即可完成下载
    ExcelUtils.exportExcelToResponse(httpResponse,"xx.xlsx",li);
 
}
ExcelUtils类应该能满足excel操作所有使用了,也难免有些特殊场景不能满足使用的,本着助人为乐,可留言,有时间都会尽量满足各位大佬。

我这里读取文件类型都是 java.io.File类型的,有些上传时文件类型用的是使用org.springframework.web.multipart.MultipartFile,可以改下我方法的文件类型,两种文件类型最后无非都是拿到FileInputStream对象,改不了可以用笨办法两个类型互转,实在不行给我留言。
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的Java Excel导入导出工具类示例: ``` import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DataFormatter; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public class ExcelUtils { private static final String FILE_NAME = "example.xlsx"; // 文件名 public static List<List<String>> readExcel() throws IOException { List<List<String>> result = new ArrayList<>(); FileInputStream inputStream = new FileInputStream(FILE_NAME); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); Sheet sheet = workbook.getSheetAt(0); DataFormatter dataFormatter = new DataFormatter(); for (Row row : sheet) { List<String> rowData = new ArrayList<>(); for (Cell cell : row) { rowData.add(dataFormatter.formatCellValue(cell)); } result.add(rowData); } workbook.close(); inputStream.close(); return result; } public static void writeExcel(List<List<String>> data) throws IOException { XSSFWorkbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet(); int rowNum = 0; for (List<String> rowData : data) { Row row = sheet.createRow(rowNum++); int colNum = 0; for (String cellData : rowData) { Cell cell = row.createCell(colNum++); cell.setCellValue(cellData); } } FileOutputStream outputStream = new FileOutputStream(FILE_NAME); workbook.write(outputStream); workbook.close(); outputStream.close(); } } ``` 使用示例: ``` public static void main(String[] args) throws IOException { List<List<String>> data = new ArrayList<>(); List<String> rowData1 = new ArrayList<>(); rowData1.add("姓名"); rowData1.add("年龄"); rowData1.add("地址"); data.add(rowData1); List<String> rowData2 = new ArrayList<>(); rowData2.add("张三"); rowData2.add("18"); rowData2.add("北京市"); data.add(rowData2); List<String> rowData3 = new ArrayList<>(); rowData3.add("李四"); rowData3.add("20"); rowData3.add("上海市"); data.add(rowData3); ExcelUtils.writeExcel(data); List<List<String>> result = ExcelUtils.readExcel(); for (List<String> rowData : result) { System.out.println(rowData); } } ``` 这个工具类使用了 Apache POI 库,可以实现 Excel 文件的读写操作。其中 `readExcel()` 方法可以读取 Excel 文件的内容并返回一个二维数组,`writeExcel()` 方法可以将一个二维数组写入到 Excel 文件中。你可以根据自己的需要进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值