java poi导入Excel、导出excel

2023-11-13

java poi导入Excel、导出excel

导出meven架包

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

导入Excel


    public void uploadFile(HttpServletRequest request, HttpServletResponse response, @RequestParam(value="file",required = false) MultipartFile file) {
        return import(request, response, file);
    }

	public void import(HttpServletRequest request, HttpServletResponse response, MultipartFile file) {
        long startTime = System.currentTimeMillis();
        //解析Excel
        List<DTO> excelInfo = ReadPatientExcelUtil.getExcelInfo(file);
        if(excelInfo!=null && excelInfo.size()>0){
            for (int i = 0; i < excelInfo.size(); i++) {
                DTO dto = excelInfo.get(i);
            }
        }else{
            System.out.println("导入失败,请注意参数格式!");
        }
        long endTime = System.currentTimeMillis();
        String time = String.valueOf((endTime - startTime) / 1000);
        log.info("导入数据用时:"+time+"秒");
        return ResponseMsg.success("导入成功!");
    }

	    

ReadPatientExcelUtil

import com.ly.directserver.dto.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/***
 * 解析导入Excel数据
 * @author manba
 */
@Slf4j
public class ReadPatientExcelUtil {

    //总行数
    private static int totalRows = 0;
    //总条数
    private static int totalCells = 0;
    //错误信息接收器
    private static String errorMsg;
    
    /***
     * 读取Excel
     * @param mFile
     * @return
     */
    public static List<DTO> getExcelInfo(MultipartFile mFile) {
        String fileName = mFile.getOriginalFilename();//获取文件名
        try {
            if (!validateExcel(fileName)) {// 验证文件名是否合格
                return null;
            }
            boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本
            if (isExcel2007(fileName)) {
                isExcel2003 = false;
            }
            List<DTO> agentList = getExcel(mFile.getInputStream(), isExcel2003);
            return agentList;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

	    public static List<DTO> getAgentExcel(InputStream is, boolean isExcel2003) {
        try {
            Workbook wb = null;
            if (isExcel2003) {// 当excel是2003时,创建excel2003
                wb = new HSSFWorkbook(is);
            } else {// 当excel是2007时,创建excel2007
                wb = new XSSFWorkbook(is);
            }
            List<DTO> DTOS = readExcelValue(wb);// 读取Excel里面客户的信息
            return DTOS;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

	private static List<DTO> readExcelValue(Workbook wb) {
        //默认会跳过第一行标题
        // 得到第一个shell
        Sheet sheet = wb.getSheetAt(0);
        // 得到Excel的行数
        totalRows = sheet.getPhysicalNumberOfRows();
        // 得到Excel的列数(前提是有行数)
        if (totalRows > 1 && sheet.getRow(0) != null) {
            totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
        }
        List<DTO> DTOS = new ArrayList<>();
        // 循环Excel行数
        for (int r = 1; r < totalRows; r++) {
            Row row = sheet.getRow(r);
            if (row == null) {
                continue;
            }
            DTO DTO = new DTO();
            // 循环Excel的列
            for (int c = 0; c < totalCells ; c++) {
                Cell cell = row.getCell(c);
                if (null != cell) {
                    if (c == 0) {           //第一列
                        //如果是纯数字
                        if (cell.getCellTypeEnum() == CellType.NUMERIC) {
                            cell.setCellType(CellType.NUMERIC);
                            int a =(int) cell.getNumericCellValue();
                        }
                    }  else if (c == 1) {
                    //如果是double
                        if (cell.getCellTypeEnum() == CellType.NUMERIC) {
                            cell.setCellType(CellType.NUMERIC);
                        }
                        double stringCellValue = cell.getNumericCellValue();
                    } else if (c == 2) {
                        if (cell.getCellTypeEnum() == CellType.STRING) {
                            cell.setCellType(CellType.STRING);
                            //如果是字符串
                            String str = cell.getStringCellValue();
                        }else if (cell.getCellTypeEnum() == CellType.NUMERIC) {
                            cell.setCellType(CellType.NUMERIC);
                            //如果是数字,需要转换为字符串
                            String desc = NumberToTextConverter.toText(cell.getNumericCellValue());
                        }
                    }
                }
            }
            //将excel解析出来的数据赋值给对象添加到list中
            // 添加到list
            DTOS.add(DTO);
        }
        return DTOS;
    }
    }

导出Excel

	    public void exportCollectRecord(HttpServletResponse res){
        File file = createExcelFile();
        FileUtils.downloadFile(res, file, file.getName());
    }

	public static File createExcelFile(List<DTO> list) {
        Workbook workbook = new XSSFWorkbook();
        //创建一个sheet,括号里可以输入sheet名称,默认为sheet0
        Sheet sheet = workbook.createSheet();
        Row row0 = sheet.createRow(0);
        int columnIndex = 0;
        row0.createCell(columnIndex).setCellValue("xxx");
        row0.createCell(++columnIndex).setCellValue("xxx");
        row0.createCell(++columnIndex).setCellValue("xxx");

        for (int i = 0; i < list.size(); i++) {
            DTO dto = list.get(i);

            Row row = sheet.createRow(i + 1);
            for (int j = 0; j < columnIndex + 2; j++) {
                row.createCell(j);
            }
            columnIndex = 0;
            row.getCell(columnIndex).setCellValue("xxx");
            row.getCell(++columnIndex).setCellValue("xxx");
            row.getCell(++columnIndex).setCellValue("xxx");
           
            
        }
        //调用PoiUtils工具包
        return PoiUtils.createExcelFile(workbook, DateUtils.fmtDateToStr(new Date(), "yyyy-MM-dd HH_mm_ss") );
    }

	
	

PoiUtils

import org.apache.poi.ss.usermodel.Workbook;
import java.io.*;

public class PoiUtils {

    /**
     * 生成Excel文件
     * @param workbook
     * @param fileName
     * @return
     */
    public static File createExcelFile(Workbook workbook, String fileName) {
        OutputStream stream = null;
        File file = null;
        try {
            //用了createTempFile,这是创建临时文件,系统会自动给你的临时文件编号,所以后面有号码,你用createNewFile的话就完全按照你指定的名称来了
            file = File.createTempFile(fileName, ".xlsx");
            stream = new FileOutputStream(file.getAbsoluteFile());
            workbook.write(stream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //这里调用了IO工具包控制开关
            IOUtils.closeQuietly(workbook);
            IOUtils.closeQuietly(stream);
        }
        return file;
    }

}

FileUtils

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.lang.reflect.Method;
import java.security.MessageDigest;

public class FileUtils {

    /**
     * 下载文件
     * @param response
     * @param file
     * @param newFileName
     */
    public static void downloadFile(HttpServletResponse response, File file, String newFileName) {
        try {
            response.setHeader("Content-Disposition", "attachment; filename=" + new String(newFileName.getBytes("ISO-8859-1"), "UTF-8"));
            BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
            InputStream is = new FileInputStream(file.getAbsolutePath());
            BufferedInputStream bis = new BufferedInputStream(is);
            int length = 0;
            byte[] temp = new byte[1 * 1024 * 10];
            while ((length = bis.read(temp)) != -1) {
                bos.write(temp, 0, length);
            }
            bos.flush();
            bis.close();
            bos.close();
            is.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 将输入流使用指定编码转化为字符串
    public static String inputStream2String(InputStream inputStream, String charset) throws Exception {
        // 建立输入流读取类
        InputStreamReader reader = new InputStreamReader(inputStream, charset);
        // 设定每次读取字符个数
        char[] data = new char[512];
        int dataSize = 0;
        // 循环读取
        StringBuilder stringBuilder = new StringBuilder();
        while ((dataSize = reader.read(data)) != -1) {
            stringBuilder.append(data, 0, dataSize);
        }
        return stringBuilder.toString();
    }

    private static DocumentBuilderFactory documentBuilderFactory = null;

    public static <T> T parseXml2Obj(String xml, Class<T> tclass) throws Exception {
        if (isEmpty(xml)) throw new NullPointerException("要解析的xml字符串不能为空。");
        if (documentBuilderFactory == null) { // 文档解析器工厂初始
            documentBuilderFactory = DocumentBuilderFactory.newInstance();
        }
        // 拿到一个文档解析器。
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        // 准备数据并解析。
        byte[] bytes = xml.getBytes("UTF-8");
        Document parsed = documentBuilder.parse(new ByteArrayInputStream(bytes));
        // 获取数据
        T obj = tclass.newInstance();
        Element documentElement = parsed.getDocumentElement();
        NodeList childNodes = documentElement.getChildNodes();
        for (int i = 0; i < childNodes.getLength(); i++) {
            Node item = childNodes.item(i);
            // 节点类型是 ELEMENT 才读取值
            // 进行此判断是因为如果xml不是一行,而是多行且有很好的格式的,就会产生一些文本的node,这些node内容只有换行符或空格
            // 所以排除这些换行符和空格。
            if (item.getNodeType() == Node.ELEMENT_NODE) {
                String key = item.getNodeName();
                String value = item.getTextContent();
                // 拿到设置值的set方法。
                Method declaredMethod = tclass.getDeclaredMethod("set" + key, String.class);
                if (declaredMethod != null) {
                    declaredMethod.setAccessible(true);
                    declaredMethod.invoke(obj, value); // 设置值
                }
            }
        }
        return obj;
    }


    // 将二进制数据转换为16进制字符串。
    public static String byte2HexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder();
        if (src == null || src.length <= 0) {
            return null;
        }
        for (byte b : src) {
            String hv = Integer.toHexString(b & 0xFF);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }
    // 对字符串进行sha1加签
    public static String sha1(String context) throws Exception {
        // 获取sha1算法封装类
        MessageDigest sha1Digest = MessageDigest.getInstance("SHA-1");
        // 进行加密
        byte[] digestResult = sha1Digest.digest(context.getBytes("UTF-8"));
        // 转换为16进制字符串
        return byte2HexString(digestResult);
    }
    public static boolean isEmpty(String value) {
        return value == null || value.length() == 0;
    }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java poi导入Excel、导出excel 的相关文章

随机推荐

  • 串口的单线半双工模式(stm32f10x系列)

    关注 星标公众号 及时获取更多技术分享 作者 冰茶奥利奥 微信公众号 嵌入式电子创客街 这两天折腾CTS RTS硬件流控 看到说232协议的CTS RTS只是用来做半双工换向使用的 正好手头上有块stm32的板子 看了看stm32的Usar
  • 6、IOC操作Bean管理[外部Bean、内部Bean、级联Bean、注入集合类型属性]

    a 注入属性 外部bean 外部bean就是将外部的bean注入到我们需要创建的bean中 1 创建两个类 Service类和dao类 2 在Service调用dao里面的方法 public interface UserDao public
  • html与python后端交互,python后端中取表单

    参考 http www manongjc com detail 13 owqqwhqvsqworkh html 前端
  • CDZSC_2022寒假个人训练赛21级(1)

    A 题意 略 题解 将n个数加起来的总和除以n即可 include
  • 红帽Linux系统管理员学习哪些内容?

    开源技术现在越来越火 无论是从事DBA 网络运维还是开发 云计算 人工智能等岗位 都需要具备些Linux基础知识 本文主要介绍Redhat Linux系统管理员一般学习哪些内容 Redhat Linux系统管理学习内容 课程概述 一 红帽系
  • 计算机考研经验分享:一战暨南大学(死亡计专),调剂七天上岸华侨大学

    计算机考研经验分享 一战暨南大学 死亡计专 调剂七天上岸华侨大学 前言 这篇文章我本来很早就打算写了 调剂过程只有过来人才懂吧 因此 我希望自己的这篇文章能对看到的人考研有所帮助 我是12号晚上11点左右收到的录取通知 然后13号太兴奋了
  • 使用Element-UI中的Upload控件上传文件 (Vue + Flask)

    知识点 前端 使用 http request 覆盖默认的上传行为 可以自定义上传的实现 使用 DataForm 携带需要上传的文件 需要将http request 的 headers中的content type 设置为 content ty
  • 微信小程序简介

    一 了解微信小程序微信小程序 小程序的一种 英文名Wechat Mini Program 是一种不需要下载安装即可使用的应用 张小龙 发布时间2017年1月9日 二 微信小程序和普通H5的区别1 微信小程序用开发者工具来查看预览页面 H5用
  • R中的统计模型

    R中的统计模型 这一部分假定读者已经对统计方法 特别是回归分析和方差分析有一定的了解 后面我们还会假定读者对广义线性模型和非线性模型也有所了解 R已经很好地定义了统计模型拟合中的一些前提条件 因此我们能构建出一些通用的方法以用于各种问题 R
  • 股票资金建仓分仓补仓计算器

    软件演示图 百度网盘下载地址 http pan baidu com s 1o8Prq6A 软件功能原理与应用价值 我们每个人买股票基本很难做到一买就涨的 买了后可能会下跌一波段再涨 则此就会另到我们时常赚不到钱而纠结卖出一分钱都不能获利而离
  • grep常用需要转义字符汇总

    最近用grep的时候发现转义非常恶心 干脆做个测试 统计一下表示特殊语意时 需要转义的字符 这里的特殊语意是指非匹配自己本身 有特殊含义的时候
  • 神经网络参数理解与设置

    一 超参数 1 学习率 每次迭代的步长 决定着目标函数能否收敛到局部最小值以及何时收敛到最小值 学习率越高 步长越大 2 batch 当训练数据过多时 无法一次将所有的数据送入计算 所以需要将数据分成几个部分 多个batch 逐一地送入计算
  • excel重复的数据只计数一次_你还在加班核对重复数据?3个Excel技巧教你快速进行数据查重...

    相信使用Excel办公的同学 绝大多数都会碰到一个问题 它就是数据重复值的问题 因为数据里面有重复内容 经常会让我们的工作变得非常的棘手 如上图所示 里面是我们仓库发出的单号 我们需要里面就有包含重复发货的单号 如果我们单凭肉眼去看基本是不
  • 联想电脑安装虚拟机出现不可恢复的错误

    VMware Workstation 不可恢复错误 vcpu 0 vcpu 0 VERIFY vmcore vmm main cpuid c 376 bugNr 1036521 日志文件位于 F centos vmware log 中 您可
  • websocket协议与实现原理

    文章目录 一 websocket 二 websocket的协议实现 websocket的协议格式 websocket如何验证客户端合法 websocket传输的明文和密文的传输 websocket如何断开 实现 一 websocket we
  • __attribute__((__aligned__(n)))对结构体对齐的影响

    1 attribute 是什么 attribute 是GCC里的编译参数 用法有很多种 感兴趣可以阅读一下gcc的相关文档 这里说一下 attribute 对变量和结构体对齐的影响 这里的影响大概分为两个方面 对齐和本身占用的字节数的大小
  • android ndk常见的问题及解决的方法

    原文 http blog csdn net fangyuanseu article details 6857911 在ndk编译的过程中遇到的一些问题 1 在用ndk build编译的时候 被编译文件的路径中不能包含空格 如果包含有空格将会
  • Content-Type的几种常用数据编码格式

    Content Type 内容类型 一般是指网页中存在的Content Type ContentType属性指定请求和响应的HTTP内容类型 如果未指定 ContentType 默认为text html 1 text html 文本方式的网
  • Ubuntu 环境下使用中文输入法

    Ubuntu 环境下使用中文输入法 安装fcitx 1 进入系统设置 gt 语言支持 将汉语 中国 拖到最上面 如果列表中没有 选择 添加或删除语言 来添加 2 切换键盘输入法系统 将其修改为fcitx 如果下拉框中没有显示fcitx 则需
  • java poi导入Excel、导出excel

    java poi导入Excel 导出excel 导出meven架包