实用 POI工具类(Spring boot)

1. 背景

在这里插入图片描述

项目中使用到了导入导出的功能所以自己写了一个关于POI的工具类和demo,希望能帮到会使用到的朋友。对比了很多市面上的方法,最后还是选择了easyExcel,也把easyExcel的demo也写了,文章底部会有相关跳转连接,跳转到easyExcel的。

2.代码

2.1. maven依赖

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

2.2 工具类

package com.tencent.hr.corehr.utils;

import cn.hutool.core.bean.BeanDesc;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.TypeUtil;
import com.tencent.hr.corehr.dto.ExcelRecord;
import com.tencent.hr.corehr.dto.ExcelResult;
import com.tencent.hr.corehr.rest.PositionController;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @Author: v_qiicai
 * @date 2020/3/6
 */
public class POIUtils {
   

    private static final Logger logger = LoggerFactory.getLogger(PositionController.class);
    /**
     * logger
     */
    private static final Logger LOGGER = LoggerFactory.getLogger(POIUtils.class);

    private static ThreadLocal<List<RectangleArea>> mergeAreaList = new ThreadLocal<>();

    private static List<RectangleArea> getMergeAreaList() {
   
        return mergeAreaList.get();
    }

    private static void setMergeAreaList(List<RectangleArea> list) {
   
        mergeAreaList.set(list);
    }


    /**
     * 将单元格内容转换为字符串
     *
     * @param cell
     * @return
     */
    private static String convertCellValueToString(Cell cell) {
   
        if (cell == null) {
   
            return null;
        }
        String returnValue = null;
        switch (cell.getCellType()) {
   
            //数字
            case NUMERIC:
                if (org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(cell)) {
   
                    Date tempValue = cell.getDateCellValue();
                    SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    returnValue = simpleFormat.format(tempValue);
                } else {
   
                    Double doubleValue = cell.getNumericCellValue();

                    // 格式化科学计数法,取一位整数
                    DecimalFormat df = new DecimalFormat("0");
                    returnValue = df.format(doubleValue);
                }
                break;
            //字符串
            case STRING:
                returnValue = cell.getStringCellValue();
                //布尔
                break;
            case BOOLEAN:
                Boolean booleanValue = cell.getBooleanCellValue();
                returnValue = booleanValue.toString();
                break;
            // 空值
            case BLANK:
                break;
            // 公式
            case FORMULA:
                returnValue = cell.getCellFormula();
                break;
            // 故障
            case ERROR:
                break;
            default:
                break;
        }


        return returnValue;
    }


    /**
     * 读取excel
     * 注意: 默认读取的数据是在第一个sheet中的,暂不支持多个sheet的读取
     *
     * @param file       输入流
     * @param headRowNum 表头所在行数
     * @return 返回excel中的字符串数据
     * @throws Exception
     */
    private static List<List<String>> readFile(File file, int headRowNum) throws Exception {
   

        InputStream ins = new FileInputStream(file);
        Workbook workbook = WorkbookFactory.create(ins);
        Sheet sheet = workbook.getSheetAt(0);
        // 获取excel总行数
        int rownum = sheet.getLastRowNum();
        List<List<String>> result = new ArrayList<>();
        LOGGER.info("excel 总行数:{}", rownum);
        // 获取表头那一行的数据长度
        short allColumnNum = sheet.getRow(headRowNum).getLastCellNum();

        for (int i = 0; i <= rownum; i++) {
   
            Row row = sheet.getRow(i);
            if (row == null || row.getPhysicalNumberOfCells() == 0) {
   
                LOGGER.info("第{}行数据为空.", i);
                continue;
            }
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中导入Excel文件可以使用Apache POI库。Apache POI是一个Java库,用于读取和写入Microsoft Office格式文件,包括Excel、Word和PowerPoint文件。 以下是使用Apache POISpring Boot中导入Excel文件的步骤: 1. 添加Maven依赖 在pom.xml文件中添加以下依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 创建Excel文件 在Excel文件中添加要导入的数据。Excel文件可以使用Microsoft Excel或Google Sheets等工具创建。确保Excel文件的列名与Java实体类的属性名称相同。 3. 创建Java实体类 创建一个Java实体类来映射Excel文件中的数据。例如,如果Excel文件中包含以下列:姓名、年龄和职业,则可以创建以下实体类: ``` public class Person { private String name; private int age; private String profession; // getter and setter methods } ``` 4. 创建Service层 创建一个Service层来处理Excel文件的导入。在Service层中,可以使用Apache POI库来读取Excel文件并将其转换为Java对象列表。 ``` @Service public class ExcelService { public List<Person> readExcelFile(String filePath) throws IOException { List<Person> persons = new ArrayList<>(); FileInputStream fileInputStream = new FileInputStream(new File(filePath)); XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream); XSSFSheet worksheet = workbook.getSheetAt(0); for (int i = 1; i < worksheet.getPhysicalNumberOfRows(); i++) { Row row = worksheet.getRow(i); Person person = new Person(); person.setName(row.getCell(0).getStringCellValue()); person.setAge((int) row.getCell(1).getNumericCellValue()); person.setProfession(row.getCell(2).getStringCellValue()); persons.add(person); } fileInputStream.close(); workbook.close(); return persons; } } ``` 5. 创建Controller层 创建一个Controller层来处理HTTP请求,并调用Service层中的方法来导入Excel文件。 ``` @RestController public class ExcelController { @Autowired private ExcelService excelService; @PostMapping("/import") public ResponseEntity<String> importExcelFile(@RequestParam("file") MultipartFile file) { try { String filePath = "path/to/save/file/" + file.getOriginalFilename(); file.transferTo(new File(filePath)); List<Person> persons = excelService.readExcelFile(filePath); // do something with persons return ResponseEntity.ok("Excel file imported successfully!"); } catch (IOException ex) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Failed to import Excel file!"); } } } ``` 在上面的代码中,使用@RequestParam注解来接收上传的Excel文件,并将其保存到本地文件系统中。然后调用ExcelService中的方法来读取Excel文件,并将其转换为Person对象列表。最后,可以使用persons对象执行任何其他操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值