Java读、写、存Excel文件

这篇博客探讨了在Java中处理Excel文件时,Apache POI与jxl库的内存消耗差异。在处理3000条60列数据时,POI在64M内存下遇到溢出,而jxl能成功处理并剩余21M内存。因此,文章推荐使用jxl进行大容量Excel数据的读写操作,并提供了引入maven依赖、数据结构示例及读写Excel的Java代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前读写Excel比较流行的java开源库主要是两个,一个是poi,一个是javaExcel(jxl)。

POI为apache公司的一个子项目,主要是提供一组操作windows文档的Java API.
JavaExcel俗称jxl是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过调用API实现对Excel数据表的访问。
就这两者的区别,主要谈下JVM虚拟机内存消耗的情况.
数据量3000条数据,每条60列.JVM虚拟机内存大小64M.
使用POI:运行到2800条左右就报内存溢出.
使用JXL:3000条全部出来,并且内存还有21M的空间.
可想而知,在对内存的消耗方面差距还是挺大的.
这里我们使用JXL来读写Excel数据。

1、pom文件种引入maven依赖

<dependency>
			<groupId>net.sourceforge.jexcelapi</groupId>
			<artifactId>jxl</artifactId>
			<version>2.6.12</version>
		</dependency>

2、看一下我们要读写的Excel数据结构:


这里我们拿一个山东省非物质文化遗产数据统计来做示例,图中我们介绍了cell和sheet,后面我们在读写文件的时候会用到这两个还有一些其他的内容。

3、开始读、写、存Excel数据,我把所有的源代码贴出来如下:

package com.example.cad.util;

import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;
import jxl.write.*;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

/**
 * @Author: MaHuadong
 * @Date: 2020/1/9 18:46
 * @Version 1.0
 * java读取Excel表格
 */
public class Excel {
    public static void main(String[] args){

        try {
            //获取指定列的值
            readSpecifyColumns(new File("H:\\feiyi.xls"));


            //获取指定行的值
            readSpecifyRows(new File("H:\\feiyi.xls"));

            //获取所有数据
            readRowsAndColums(new File("H:\\feiyi.xls"));


            //将获取到的值写入到者xls中
           copy_excel(new File("H:\\feiyi.xls"));


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     *  	读取指定列(这里以读取第一列为例)
     * @param file
     * @throws Exception
     */
    public static void readSpecifyColumns(File file)throws Exception{
        //新建列集合
        ArrayList<String> columnList = new ArrayList<String>();

        //使用jxl创建一个读的工作簿
        Workbook readwb = null;
        InputStream io = new FileInputStream(file.getAbsoluteFile());
        readwb = Workbook.getWorkbook(io);
        //获取第一个工作表对象
        Sheet readsheet = readwb.getSheet(0);
        //获取表格列数
        int rsColumns = readsheet.getColumns();
        //获取表格行数
        int rsRows = readsheet.getRows();
        //魂环遍历每一行
        for (int i = 1; i < rsRows; i++) {
            //getcell()中第一个参数是列,第二个参数是行
            Cell cell_name = readsheet.getCell(0, i);
            //第一列的值加入到集合中
            columnList.add(cell_name.getContents());

        }

       //System.out.println(columnList);

       String[] name_String = new String[columnList.size()];
        for (int i = 0; i < columnList.size(); i++) {
            name_String[i] = columnList.get(i);
			System.out.println("<非遗类型:" + "\"" + name_String[i] + "\">");
        }

        readwb.close();
    }


    /**
     *   	读取指定行(这里以第二行为例)
     * @param file
     * @throws Exception
     */
    public static void readSpecifyRows(File file)throws Exception{
        ArrayList<String> rowList = new ArrayList<String>();
        Workbook readwb = null;
        InputStream io = new FileInputStream(file.getAbsoluteFile());
        readwb = Workbook.getWorkbook(io);
        Sheet readsheet = readwb.getSheet(0);
        int rsColumns = readsheet.getColumns();  //获取表格列数
        int rsRows = readsheet.getRows();  //获取表格行数
        for (int i = 1; i < rsColumns; i++) {
            Cell cell_name = readsheet.getCell(i, 1);  //在这里指定行,此处需要手动更改,获取不同行的值
            rowList.add(cell_name.getContents());
        }
        System.out.println(rowList);
        readwb.close();
    }


    /**
     *   	读取所有内容
     * @param file
     * @throws Exception
     */
    private static void readRowsAndColums(File file) throws BiffException, IOException {
        //1:创建workbook
        Workbook workbook=Workbook.getWorkbook(file.getAbsoluteFile());
        //2:获取第一个工作表sheet
        Sheet sheet=workbook.getSheet(0);
        //3:获取数据
        System.out.println("行:"+sheet.getRows());
        System.out.println("列:"+sheet.getColumns());
        for(int i=0;i<sheet.getRows();i++){
            for(int j=0;j<sheet.getColumns();j++){
                Cell cell=sheet.getCell(j,i);
                System.out.print(cell.getContents()+" ");
            }
        }

        //最后一步:关闭资源
        workbook.close();
    }


    /**
     * 	将获取到的值写入到TXT或者xls中
     * @param file
     * @throws Exception
     */
    public static void copy_excel(File file) throws Exception {
       File f=new File("H:\\feiyicopy.xls");
       if (!f.exists()){
           f.getParentFile().mkdirs();
       }

        WritableWorkbook wb=Workbook.createWorkbook(f);
        WritableSheet wsheet=wb.createSheet("非遗数据",0);

        //字体
        WritableFont font1= new WritableFont(WritableFont.ARIAL,10,WritableFont.BOLD);
        WritableCellFormat format1=new WritableCellFormat(font1);

        //读取模板数据
        //1:创建workbook
        Workbook workbook=Workbook.getWorkbook(file.getAbsoluteFile());
        //2:获取第一个工作表sheet
        Sheet sheet=workbook.getSheet(0);
        //3:获取数据
        System.out.println("行:"+sheet.getRows());
        System.out.println("列:"+sheet.getColumns());
        for(int i=0;i<sheet.getRows();i++){
            for(int j=0;j<sheet.getColumns();j++){
                Cell cell=sheet.getCell(j,i);
                //把读取的cell数据加入到新的工作簿里面
                wsheet.addCell(new Label(j,i,cell.getContents()));
            }
        }
        
        jxl.write.Number number = new jxl.write.Number(2,1,1 );//写入一个数字格式的。
        wsheet.addCell(number);

        workbook.close();

        wb.write();
        wb.close();
        System.out.println("输出完成!");


    }







}

 这里我们写了四个方法,分别为读取指定列的Excel数据、读取指定行的Excel数据、读取所有Excel数据、将读取的数据写入一个新的Excel。经过测试,均可以正常操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值