java使用XSSFWorkbook实现读写Excel

 更新时间:2024年04月20日 08:13:55   作者:那心之所向  
这篇文章主要为大家详细介绍了java如何通过使用XSSFWorkbook实现读写Excel功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

写在最前面

使用的是JAVA POI实现的导出Excel

POI 提供了对2003版本的Excel的支持 ---- HSSFWorkbook

POI 提供了对2007版本以及更高版本的支持 ---- XSSFWorkbook

引入相关依赖:

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
 /**
     * 读取Excel文件的内容
     * @param inputStream excel文件,以InputStream的形式传入
     * @param sheetName sheet名字
     * @return 以List返回excel中内容
     */
    public static List<Map<String, String>> readExcel(InputStream inputStream, String sheetName) {

        //定义工作簿
        XSSFWorkbook xssfWorkbook = null;
        try {
            xssfWorkbook = new XSSFWorkbook(inputStream);
        } catch (Exception e) {
            System.out.println("Excel data file cannot be found!");
        }

        //定义工作表
        XSSFSheet xssfSheet;
        if (sheetName.equals("")) {
            // 默认取第一个子表
            xssfSheet = xssfWorkbook.getSheetAt(0);
        } else {
            xssfSheet = xssfWorkbook.getSheet(sheetName);
        }

        List<Map<String, String>> list = new ArrayList<Map<String, String>>();

        //定义行
        //默认第一行为标题行,index = 0
        XSSFRow titleRow = xssfSheet.getRow(0);

        //循环取每行的数据
        for (int rowIndex = 1; rowIndex < xssfSheet.getPhysicalNumberOfRows(); rowIndex++) {
            XSSFRow xssfRow = xssfSheet.getRow(rowIndex);
            if (xssfRow == null) {
                continue;
            }

            Map<String, String> map = new LinkedHashMap<String, String>();
            //循环取每个单元格(cell)的数据
            for (int cellIndex = 0; cellIndex < xssfRow.getPhysicalNumberOfCells(); cellIndex++) {
                XSSFCell titleCell = titleRow.getCell(cellIndex);
                XSSFCell xssfCell = xssfRow.getCell(cellIndex);
                map.put(getString(titleCell),getString(xssfCell));
            }
            list.add(map);
        }
        return list;
    }

    /**
     * 把单元格的内容转为字符串
     * @param xssfCell 单元格
     * @return 字符串
     */
    public static String getString(XSSFCell xssfCell) {
        if (xssfCell == null) {
            return "";
        }
        if (xssfCell.getCellTypeEnum() == CellType.NUMERIC) {
            return String.valueOf(xssfCell.getNumericCellValue());
        } else if (xssfCell.getCellTypeEnum() == CellType.BOOLEAN) {
            return String.valueOf(xssfCell.getBooleanCellValue());
        } else {
            return xssfCell.getStringCellValue();
        }
    }

    /**
     * 把内容写入Excel
     * @param list 传入要写的内容,此处以一个List内容为例,先把要写的内容放到一个list中
     * @param outputStream 把输出流怼到要写入的Excel上,准备往里面写数据
     */
    public static void writeExcel(List<List> list, OutputStream outputStream) {
        //创建工作簿
        XSSFWorkbook xssfWorkbook = null;
        xssfWorkbook = new XSSFWorkbook();

        //创建工作表
        XSSFSheet xssfSheet;
        xssfSheet = xssfWorkbook.createSheet();

        //创建行
        XSSFRow xssfRow;

        //创建列,即单元格Cell
        XSSFCell xssfCell;

        //把List里面的数据写到excel中
        for (int i=0;i<list.size();i++) {
            //从第一行开始写入
            xssfRow = xssfSheet.createRow(i);
            //创建每个单元格Cell,即列的数据
            List sub_list =list.get(i);
            for (int j=0;j<sub_list.size();j++) {
                xssfCell = xssfRow.createCell(j); //创建单元格
                xssfCell.setCellValue((String)sub_list.get(j)); //设置单元格内容
            }
        }

        //用输出流写到excel
        try {
            xssfWorkbook.write(outputStream);
            outputStream.flush();
            outputStream.close();
        }catch (IOException e) {
            e.printStackTrace();
        }

    }

附:把一个Map中的所有键和值分别放到一个list中,再把这两个list整个放到一个大的list里面,即 [ [key1,key2,key3...] , [value1,value2,value3...] ]

public static List<List> convertMapToList(Map map) {
        List<List> list = new ArrayList<List>();
        List<String> key_list = new LinkedList<String>();
        List<String> value_list = new LinkedList<String>();

        Set<Entry<String,String>> set = map.entrySet();
        Iterator<Entry<String,String>> iter1 = set.iterator();
        while (iter1.hasNext()) {
            key_list.add(iter1.next().getKey());
        }
        list.add(key_list);

        Collection<String> value = map.values();
        Iterator<String> iter2 = value.iterator();
        while (iter2.hasNext()) {
            value_list.add(iter2.next());
        }
        list.add(value_list);
        return list;
    }

到此这篇关于java使用XSSFWorkbook实现读写Excel的文章就介绍到这了,更多相关java XSSFWorkbook读写Excel内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring中将Service注入到Servlet中的四种方法

    Spring中将Service注入到Servlet中的四种方法

    在Spring中,如果需要将Service注入到Servlet中,可以通过以下几种方法实现,Spring本身提供了对Servlet的集成能力,因此可以结合Spring的依赖注入机制,将Service类注入到Servlet中,需要的朋友可以参考下
    2025-05-05
  • 解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题

    解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题

    这篇文章主要介绍了解决nacos升级spring cloud 2020.0无法使用bootstrap.yml的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 深入解析JVM对dll文件和对类的装载过程

    深入解析JVM对dll文件和对类的装载过程

    这篇文章主要介绍了JVM对dll文件的装载和对类的装载过程,针对Java在Windows下的一些运行情况作出讲解,需要的朋友可以参考下
    2015-11-11
  • mybatis中string和date的转换方式

    mybatis中string和date的转换方式

    这篇文章主要介绍了mybatis中string和date的转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 详解Java设计模式编程中的访问者模式

    详解Java设计模式编程中的访问者模式

    这篇文章主要介绍了Java设计模式编程中的访问者模式,访问者模式的合理利用可以避免项目中出现大量重复的代码,需要的朋友可以参考下
    2016-02-02
  • 详解Spring MVC如何测试Controller(使用springmvc mock测试)

    详解Spring MVC如何测试Controller(使用springmvc mock测试)

    这篇文章主要介绍了详解Spring MVC如何测试Controller(使用springmvc mock测试),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • Java读取DWG文件的示例详解

    Java读取DWG文件的示例详解

    本文将通过一个代码示例,展示如何使用Teigha Java API来读取DWG文件,并解释了实现这一功能所需的关键步骤,包括添加依赖、初始化API、打开文件、处理数据和关闭文件,感兴趣的朋友一起看看吧
    2025-06-06
  • java实现截取PDF指定页并进行图片格式转换功能

    java实现截取PDF指定页并进行图片格式转换功能

    这篇文章主要介绍了java实现截取PDF指定页并进行图片格式转换功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • SpringBoot使用jasypt加解密密码的实现方法

    SpringBoot使用jasypt加解密密码的实现方法

    这篇文章主要介绍了SpringBoot使用jasypt加解密密码的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 详解Java集合类之HashSet篇

    详解Java集合类之HashSet篇

    这篇文章主要为大家详细介绍一下Java集合类中HashSet的用法,文中的示例代码讲解详细,对我们学习Java有一定帮助,感兴趣的可以了解一下
    2022-07-07

最新评论