java poi导入Excel、导出excel

这篇具有很好参考价值的文章主要介绍了java poi导入Excel、导出excel。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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文章来源地址https://www.toymoban.com/news/detail-610281.html

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;
    }

}

到了这里,关于java poi导入Excel、导出excel的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • hutool poi、apache poi实现导入导出以及解析excel

    一、前言 看了例子之后后续需要更加深入学习或者更多理解其他API的话,建议看官方文档。hutool项目是中国人维护的,有中文文档,阅读起来很方便。apache poi比较底层一点,可以更加自由去二次开发自己所需的功能。 hutool官方文档 hutool官方gitee apache poi官方文档 二、基于

    2024年02月09日
    浏览(39)
  • Excel 导入导出(前端处理:xslx)(后端处理:hutool+poi || Easy Excel )

      目录 Excel 导入导出(前端处理:xslx) 代码示例 导入Excel数据 将数据封装好后传给后端  导出数据 预览(vue-office/excel\\\"……;docx-preview) Excel 导入导出(后端处理:hutool+poi || Easy Excel ) 前端 后端使用Hutool处理Excel 文件 Hutool-poi是针对Apache POI的封装,因此需要用户自行引入

    2024年01月24日
    浏览(36)
  • 使用POI和EasyExcel来实现excel文件的导入导出

    废话不多说咱们直接上干货!!!! 一.读取Excel表格 【1】使用POI读取excel表格中的数据 POI还可以操作我们这个word文档等等,他不仅仅只能弄Excel,而JXI只能操作excel 1.POI的结构,我们可以更具文件的类去选择 相关的对象我当前是使用的XLSX来操作的 HSSF - 提供读写Microsoft

    2024年02月05日
    浏览(36)
  • Apache POI实现Excel导入读取数据和写入数据并导出

    Apache POI POI介绍 Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。 maven坐标: POI结构: 入门案例 ExcelTest .java文件 从Excel文件读取数据

    2024年02月12日
    浏览(31)
  • poi实现excel文件导入导出(基本数据导出、含格式导出、含批注导出、含图片图表导出)——springboot

    本文主要是介绍springboot + poi实现基本的excel文件导入导出,包含数据导出导入时数据的其他需求校验,导出含有批注信息、导出含有图片信息、导出含有图表信息等的介绍等等,主要是一个demo尽可能简单明了的来介绍相关功能即可。有什么问题可以在留言哦!并在文章末尾附

    2024年02月08日
    浏览(63)
  • Java使用POI导出Excel

    在项目开发中往往需要使用到Excel的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。 操作Excel目前比较流行的就是 Apache POI 和阿里巴巴的 easyExcel ! 废话不多说,开始撸起来!!! POI官网;https://poi.apache.org/ POI官网API:https://poi.

    2024年02月04日
    浏览(30)
  • Java Poi导出Excel表格详解

    一、导出下面的表格 二、流程详解         1、导出excel需要先将数据准备好         2、创建工作傅对象SXSSFWorkbook         3、使用工作傅对象创建sheet对象(工作页)         4、使用sheet对象创建行对象row(行对象)         5、使用row对象创建cell对象(单元格

    2024年02月10日
    浏览(33)
  • java poi实现Excel多级表头导出

    最近碰到一个导出,比较繁琐,也查询了许多博客,在其中一篇博客的基础上修改,实现了最终想要的效果。话不多说,直接上效果图 1.主代码: 2.合并单元格 3.设置表头单元格的宽度 4.填充数据(注:我这里的数据格式是ListMapString, Object类型,可以根据自己的实际情况来封

    2024年02月03日
    浏览(32)
  • 【Java】使用POI按模板样式导出Excel

    根据模板样式进行excel导出。 首先,当然是要有一个excel模板,excel的样式用wps等进行设置。 然后就是代码的实现了,先引入POI的依赖: 然后就是实现方法里的代码,首先定义响应信息: 然后将excel模板转为输入流,这一步的实现方法有很多,具体选择因人而异,我这里就举

    2024年02月14日
    浏览(31)
  • java中使用POI生成Excel并导出

    注:本文章中代码均为本地Demo版本,若后续代码更新将不会更新文章 根据从数据库查询出的数据,将其写入excel表并导出 我的想法是通过在实体属性上写自定义注解的方式去完成。因为我们在代码中可以通过反射的方式去获取实体类中全部的注解及属性名称等等。我们可以

    2024年02月16日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包