当前位置:首页 > java > 正文内容

java使用poi读取excel表格

关中浪子2年前 (2022-06-10)java2173
买泛域名SSL证书 送5斤装现摘猕猴桃一箱、同时提供技开源商城搭建免费技术支持。
泛域名ssl证书 239元1年送1个月、单域名39元1年,Sectigo(原Comodo证书)全球可信证书,强大的兼容性,高度安全性,如有问题7天内可退、可开发票
加微信VX 18718058521 备注SSL证书
【腾讯云】2核2G4M云服务器新老同享99元/年,续费同价


java读取excel中包括图片、日期、字符串格式。


导入依赖

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

excel表格样式


 实体类

public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String sex;
    private String picPath;
    private String date;
 
 
    public User() {
    }
}

读取表格工具类

import com.csv.pojo.User;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.PictureData;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
 
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * Excel工具类
 */
public class ExcelUtil {
 
    /**
     * 判断文件是否存在
     *
     * @param fileName
     * @return
     */
    public static boolean fileExist(String fileName) {
        boolean flag = false;
        File file = new File(fileName);
        flag = file.exists();
        return flag;
    }
 
    /**
     * 新文件写入数据
     *
     * @return
     */
    public static List<User> writeNewFile() {
        List<User> userList = new ArrayList<>();
        User user;
        for (int i = 0; i < 10; i++) {
            user = new User();
            user.setName("u" + i);
            user.setAge(i);
            user.setSex("男");
            userList.add(user);
        }
        return userList;
    }
 
    /**
     * 从excel中读取数据
     *
     * @param xls         true xls文件,false xlsx文件
     * @param inputStream 文件输入流
     * @return 数据封装到对象
     */
    public static List<User> getDataFromExcel(boolean xls, InputStream inputStream) {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        Workbook workbook = null;
        List<User> userList = new ArrayList<>();
        try {
            if (xls) {
                workbook = new HSSFWorkbook(inputStream);
            } else {
                workbook = new XSSFWorkbook(inputStream);
            }
 
            // 得到一个工作表
            Sheet sheet = workbook.getSheetAt(0);
            // 得到表头
            Row rowHead = sheet.getRow(0);
            // 判断表头是否正确
            if (rowHead.getPhysicalNumberOfCells() < 1) {
                throw new Exception("表头错误");
            }
 
            // 获取照片
            Map<String, PictureData> pictures;
            if (xls) {
                pictures = getPictures((HSSFSheet) sheet);
            } else {
                pictures = getPictures((XSSFSheet) sheet);
            }
 
            // 获取数据
            for (int i = 2; i <= sheet.getLastRowNum(); i++) {
                // 获取第i行
                Row row = sheet.getRow(i);
                // 获取第i行各个列的数据
                Integer id = (int) row.getCell(0).getNumericCellValue();
                String username = row.getCell(1).getStringCellValue();
                Integer age = (int) row.getCell(2).getNumericCellValue();
                String sex = row.getCell(3).getStringCellValue();
                String savePath = savePicture(id, pictures.get(i + "-4"));
                String date;
                // 判断该单元格的数据类型
                switch (row.getCell(5).getCellTypeEnum()) {
                    case STRING: // 字符串类型
                        date = row.getCell(5).getStringCellValue();
                        break;
                    case NUMERIC: // 日期类型
                        date = sf.format(row.getCell(5).getDateCellValue());
                        break;
                    default:
                        date = "";
                        break;
                }
                userList.add(new User(id, username, age, sex, savePath, date));
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return userList;
    }
 
    /**
     * xls获取照片
     */
    private static Map<String, PictureData> getPictures(HSSFSheet sheet) {
        Map<String, PictureData> map = new HashMap<>();
        List<HSSFShape> list = sheet.getDrawingPatriarch().getChildren();
        for (HSSFShape shape : list) {
            if (shape instanceof HSSFPicture) {
                HSSFPicture picture = (HSSFPicture) shape;
                HSSFClientAnchor clientAnchor = picture.getClientAnchor();
                HSSFPictureData pictureData = picture.getPictureData();
                String key = clientAnchor.getRow1() + "-" + clientAnchor.getCol1();
                map.put(key, pictureData);
            }
        }
        return map;
    }
 
    /**
     * xlsx获取照片
     */
    private static Map<String, PictureData> getPictures(XSSFSheet sheet) {
        Map<String, PictureData> map = new HashMap<>();
        List<POIXMLDocumentPart> list = sheet.getRelations();
        for (POIXMLDocumentPart part : list) {
            if (part instanceof XSSFDrawing) {
                XSSFDrawing drawing = (XSSFDrawing) part;
                List<XSSFShape> shapes = drawing.getShapes();
                for (XSSFShape shape : shapes) {
                    XSSFPicture picture = (XSSFPicture) shape;
                    XSSFClientAnchor anchor = picture.getPreferredSize();
                    CTMarker marker = anchor.getFrom();
                    String key = marker.getRow() + "-" + marker.getCol();
                    map.put(key, picture.getPictureData());
                }
            }
        }
        return map;
    }
 
    /**
     * 照片保存在本地
     */
    private static String savePicture(int id, PictureData picData) throws IOException {
        if (picData != null) {
            byte[] data = picData.getData();
            String fileName = id + "-" + "照片";
            String filePath = "D:\\JavaCode\\testmaven14excel\\image\\";
            FileOutputStream out = new FileOutputStream(filePath + fileName + ".png");
            out.write(data);
            out.close();
            return filePath + fileName + ".png";
        }
        return "";
    }
}

控制层接口

@RestController
@RequestMapping("/excel")
@CrossOrigin(maxAge = 3600)
public class ExcelController {
 
 
    @RequestMapping(value = "/upload",method = RequestMethod.POST)
    public ResultMessage readFile(@RequestParam(value = "excelFile") MultipartFile excelFile, HttpServletRequest request) throws IOException {
        // 文件名
        String name = excelFile.getOriginalFilename();
        boolean b;
        if (name.endsWith(".xls")) {
            b=true;
        }else if(name.endsWith(".xlsx")){
            b=false;
        }else if(name.endsWith(".jpg")||name.endsWith(".png")){
            System.out.println("收到图片文件"+name);
            return new ResultMessage(true,"这是图片",null);
        }
        else {
            return new ResultMessage(false,"不是excel文件",null);
        }
        List<User> dataFromExcel = ExcelUtil.getDataFromExcel(b,excelFile.getInputStream());
        for (User user : dataFromExcel) {
            System.out.println(user.toString());
        }
        return new ResultMessage(true,"解析文件",dataFromExcel);
    }
}

效果演示

{
      "id": 1,
      "name": "瑞秋",
      "age": 25,
      "sex": "女",
      "picPath": "D:\\JavaCode\\testmaven14excel\\image\\1-照片.png",
      "date": "2022-02-18"
    },
    {
      "id": 2,
      "name": "莫妮卡",
      "age": 26,
      "sex": "女",
      "picPath": "D:\\JavaCode\\testmaven14excel\\image\\2-照片.png",
      "date": "2022-02-19"
    },
    {
      "id": 3,
      "name": "乔伊",
      "age": 24,
      "sex": "男",
      "picPath": "",
      "date": "2022-02-20"
    },
    {
      "id": 4,
      "name": "钱德勒",
      "age": 26,
      "sex": "男",
      "picPath": "",
      "date": "2022/2/21"
    },
    {
      "id": 5,
      "name": "罗斯",
      "age": 27,
      "sex": "男",
      "picPath": "",
      "date": "2022/2/22"
    },
    {
      "id": 6,
      "name": "菲比",
      "age": 25,
      "sex": "女",
      "picPath": "",
      "date": "2022-02-23"
     }


找梯子最重要的就是稳定,这个已经上线三年了,一直稳定没有被封过,赶紧下载备用吧!

扫描二维码推送至手机访问。

版权声明:本文由码农翻生发布,如需转载请注明出处。

本文链接:https://lubojian.cn/post/182.html

分享给朋友:

相关文章

springboot 日期转换失败 解决方法

解决方法可以参考之前的链接springboot日期转换失败另外还有一种方式:直接在实体里面增加注解DateTimeFormat@DateTimeFormat(pattern="yyyy-MM-dd") private&...

SQL之CASE WHEN用法详解

当我们需要从数据源上 直接判断数据显示代表的含义的时候 ,就可以在SQL语句中使用 Case When这个函数了.Case具有两种格式。简单Case函数和Case搜索函数。 第一种 格式 : 简单Case函数 :格式说明...

Spring AOP的JDK动态代理和CGLIB代理 的原理

Spring AOP的JDK动态代理和CGLIB代理 的原理

一.AOP的概念         在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统...

静态代理和动态代理的区别

静态代理静态代理,设计模式的代理模式举例通常是用这种方式实现的,对于每一个要代理的类为了添加相同的操作,需要分别去实现其接口,容易造成代理类过多public interface Subject {  ...

Spring Boot + MyBatis + MySQL 实现读写分离!不懂多看

Spring Boot + MyBatis + MySQL 实现读写分离!不懂多看

1、引言读写分离要做的事情就是对于一条SQL该选择哪个数据库去执行,至于谁来做选择数据库这件事儿,无非两个,要么中间件帮我们做,要么程序自己做。因此,一般来讲,读写分离有两种实现方式。第一种是依靠中间件(比如:MyCat),也就是说应用程序...

xml解析工具类

import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayInputStream;...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。