使用poi操作excel详解

1、POI工具介绍

1.1、POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。
1.2、主要是运用其中读取和输出excel的功能。
1.3、POI官网地址:
https://poi.apache.org/components/index.html

2、POI可操作的文件类型

在这里插入图片描述

3、POI所需依赖

		<!--xls(03)-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!--xlsx(07)-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>

4、xls和xlsx的区别

①xls是excel03版本 xlsx是excel07版本
②最大的区别是行列数不同
xls最大支持65536行、256
xlsx最大支持1048576行、16384

poi 操作xls
poi-ooml操作xlsx

5、POI Excel 写 03(xls)和07(xlsx)版本方式

package poi;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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.XSSFWorkbook;
import org.junit.Test;

import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author yw
 * @since 2022/11/20
 */
public class ExcelWrite {

    public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

    String PATH = "D:\\excel\\";

    /**
     * 写工作簿 03版本
     */
    @Test
    public void Write03() throws Exception {
        //1.创建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //2.创建 一个工作表
        Sheet sheet = workbook.createSheet("工人表");
        //3.创建一行
        Row row1 = sheet.createRow(0);
        //4.创建一个单元格
        //(1,1)
        Cell cell1 = row1.createCell(0);
        cell1.setCellValue("工号");
        //(1,2)
        Cell cell2 = row1.createCell(1);
        cell2.setCellValue("日期");

        //创建第二行
        Row row2 = sheet.createRow(1);
        //(2,1)
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue(001);
        //(2,2)
        Cell cell22 = row2.createCell(1);
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
        String datetime = sdf.format(new Date());
        cell22.setCellValue(datetime);

        //生成一张表(IO流),03版本就是使用xls结尾
        FileOutputStream fos = new FileOutputStream(PATH + "工人表03.xls");
        //输出
        workbook.write(fos);
        //关闭流
        fos.close();
        System.out.println("文件生成完毕");
    }

    /**
     * 写工作簿 07版本
     */
    @Test
    public void Write07() throws Exception {
        //1.创建一个工作簿
        Workbook workbook = new XSSFWorkbook();
        //2.创建 一个工作表
        Sheet sheet = workbook.createSheet("工人表");
        //3.创建一行
        Row row1 = sheet.createRow(0);
        //4.创建一个单元格
        //(1,1)
        Cell cell1 = row1.createCell(0);
        cell1.setCellValue("工号");
        //(1,2)
        Cell cell2 = row1.createCell(1);
        cell2.setCellValue("日期");

        //创建第二行
        Row row2 = sheet.createRow(1);
        //(2,1)
        Cell cell21 = row2.createCell(0);
        cell21.setCellValue(001);
        //(2,2)
        Cell cell22 = row2.createCell(1);
        SimpleDateFormat sdf = new SimpleDateFormat(DEFAULT_DATE_FORMAT);
        String datetime = sdf.format(new Date());
        cell22.setCellValue(datetime);

        //生成一张表(IO流),03版本就是使用xlsx结尾
        FileOutputStream fos = new FileOutputStream(PATH + "工人表07.xlsx");
        //输出
        workbook.write(fos);
        //关闭流
        fos.close();
        System.out.println("文件生成完毕");
    }
}

6、HSSF和XSSF写大文件的区别

6.1、使用HSSF写大文件

@Test
    public void Write03BigData() throws Exception{
        //时间
        long begin = System.currentTimeMillis();
        //1.创建一个工作簿
        Workbook workbook = new HSSFWorkbook();
        //2.创建一个表
        Sheet sheet = workbook.createSheet("sheet1");
        //写入数据
        for (int rowNum = 0;rowNum<65536;rowNum++){
            //3.创建行
            Row row = sheet.createRow(rowNum);
            for (int CellNum = 0;CellNum<10;CellNum++){
                Cell cell = row.createCell(CellNum);
                cell.setCellValue(CellNum);
            }
        }
        System.out.println("over");
        //获取io流
        FileOutputStream fos = new FileOutputStream(PATH+"Write03BigData.xlsx");
        //生成一张表
        workbook.write(fos);
        fos.close();
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-begin));
    }

在这里插入图片描述

优点:过程中写入缓存,不操作磁盘,最后再一次性导入磁盘,速度快+
缺点:但是只能写入65535条数据,超过就会报异常
在这里插入图片描述

6.2、使用XSSF写大文件

@Test
    public void Write07BigData() throws Exception{
        //时间
        long begin = System.currentTimeMillis();
        //1.创建一个工作簿
        Workbook workbook = new XSSFWorkbook();
        //2.创建一个表
        Sheet sheet = workbook.createSheet("sheet1");
        //写入数据
        for (int rowNum = 0;rowNum<1000000;rowNum++){
            //3.创建行
            Row row = sheet.createRow(rowNum);
            for (int CellNum = 0;CellNum<10;CellNum++){
                Cell cell = row.createCell(CellNum);
                cell.setCellValue(CellNum);
            }
        }
        System.out.println("over");
        //获取io流
        FileOutputStream fos = new FileOutputStream(PATH+"Write07BigData.xlsx");
        //生成一张表
        workbook.write(fos);
        fos.close();
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-begin));
    }

在这里插入图片描述

优点:可以写较大数据量(超过655135条),如10万条
缺点:写数据时,速度非常慢,非常消耗内存,也会容易发生内存溢出,如100万条的时候。

6.3、使用SXSS写大文件

@Test
    public void Write07BigDataS() throws Exception{
        //时间
        long begin = System.currentTimeMillis();
        //1.创建一个工作簿
        Workbook workbook = new SXSSFWorkbook(200);
        //2.创建一个表
        Sheet sheet = workbook.createSheet("sheet1");
        //写入数据
        for (int rowNum = 0;rowNum<1000000;rowNum++){
            //3.创建行
            Row row = sheet.createRow(rowNum);
            for (int CellNum = 0;CellNum<10;CellNum++){
                Cell cell = row.createCell(CellNum);
                cell.setCellValue(CellNum);
            }
        }
        System.out.println("over");
        //获取io流
        FileOutputStream fos = new FileOutputStream(PATH+"Write07BigDataS.xlsx");
        //生成一张表
        workbook.write(fos);
        fos.close();
        //清除临时文件
        ((SXSSFWorkbook) workbook).dispose();
        long end = System.currentTimeMillis();
        System.out.println("耗时:"+(end-begin));
    }

在这里插入图片描述
优点:可以写超大数据量的,比如100万条,写数据速度更快,占用更少内存
注意:
1、过程中会产生临时文件,结束时需要注意清理
2、默认100条记录会保存在内存中,如果超过这个数据,则最前面的数据会被写入磁盘中
3、如果想自定义内存中的数量,则可以new SXSSFWorkbook(自定义数量)

SXSSFWorkbook-来至官方的解释︰实现"BigGridDemo"策略的流式XSSFWorkbook版本。这允许写入非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分被保存在内存中。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!关于您的问题,我可以给您提供一些参考信息。 Java POI是一个开源的Java API,可以用于读取和操作Excel文件。它提供了许多用于在Excel中插入图像、文本、数字、图表和其他元素的方法。 要在Excel中画线,可以使用Java POI中的HSSFDrawing类。HSSFDrawing类是HSSF工作簿中所有绘图对象的基类。您可以使用此类来添加各种绘图对象,例如线条、箭头、形状、文本框等。 以下是一个简单的示例代码,展示如何在Excel中画一条红色的线: ``` import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFDrawing; import org.apache.poi.hssf.usermodel.HSSFShape; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.ClientAnchor.AnchorType; import org.apache.poi.ss.usermodel.ShapeTypes; public class DrawLineInExcel { public static void main(String[] args) throws Exception { HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet("Line Sheet"); HSSFDrawing drawing = sheet.createDrawingPatriarch(); HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 0, 0, (short) 1, 1, (short) 5, 5); anchor.setAnchorType(AnchorType.DONT_MOVE_AND_RESIZE); HSSFShape shape = drawing.createShape(anchor, ShapeTypes.LINE); shape.setLineWidth(2); shape.setLineStyleColor(255, 0, 0); FileOutputStream fileOut = new FileOutputStream("line.xlsx"); workbook.write(fileOut); fileOut.close(); System.out.println("Line drawn successfully!"); } } ``` 此代码将创建一个新的Excel工作簿,并在名称为“Line Sheet”的工作表中绘制一条线。然后将工作簿写入名为“line.xlsx”的文件中。 希望这可以帮助您开始解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值