使用Java语言,引入依赖apache-poi中的Excel文档操作

前言:

|-------|--------------------|-------|
| HSSF | 针对于excel03之前版本 | .xls |
| XSSF | 针对于excel07之后版本 | .xlsx |
| SXSSF | 针对于excel07之后版本,升级版 | .xlsx |

apache-poi官网图片

首先引入相关文档:

java 复制代码
    <dependencies>
        <!--    03- 版本的excel .xls    -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <!--   07+ 版本的excel .xlsx   -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
    </dependencies>

一、读取操作

目标excel文档如下:

  1. 获取通过文件流读取Excel的工作簿Workbook
  2. 通过workbook 获取工作表
  3. 通过sheet获取row行
  4. 通过row获取cell单元格
  5. 使用cell.getStringCellValue()获取单元格的值
java 复制代码
public static void main(String[] args) throws Exception {
        readExcel07();
//        readExcel07All();
    }

    /**
     * 使用文件流读取.xlsx中的某个数据
     * @throws Exception
     */
    public static void readExcel07() throws Exception{
        //1.通过文件流读取Excel工作部
        FileInputStream inputStream = new FileInputStream("./测试.xlsx");
        //2.获取工作簿
        Workbook workbook = new XSSFWorkbook(inputStream);
        //3.获取工作表
        Sheet sheet = workbook.getSheet("07xlsx版本");
        //4.获取行
        Row row = sheet.getRow(0);
        //5.获取列
        Cell cell = row.getCell(0);
//        RichTextString cellValue = cell.getRichStringCellValue();
        String cellValue = cell.getStringCellValue();
        System.out.println(cellValue);

        //关闭资源
        workbook.close();
        inputStream.close();

    }

    /**
     * 读取文件中所有的非空数据
     * @throws Exception
     */
    public static void readExcel07All() throws Exception{
        //1.通过文件流读取Excel工作部
        FileInputStream inputStream = new FileInputStream("./测试.xlsx");
        //2.获取工作簿
        Workbook workbook = new XSSFWorkbook(inputStream);
        //3.获取工作表
        Sheet sheet = workbook.getSheet("07xlsx版本");
        //4.获取行
        Row row = sheet.getRow(0);
        if(row!=null){
            for (int i = 0; i < row.getRowNum(); i++) {
                //5.获取列
                Cell cell = row.getCell(i);
                if(cell!=null){
                    System.out.print(cell.getStringCellValue() + "/t");
                }
            }
        }
        //关闭资源
        workbook.close();
        inputStream.close();

    }

运行结果如下:

二、使用依赖向excel中写入相关数据

java 复制代码
 public static void main(String[] args) throws Exception {
//        createDemoXLS();
        createDemoXLSX();
    }

    public static void createDemoXLS() throws Exception {
        //首先创建工作簿
        Workbook workbook = new HSSFWorkbook();
        //创建工作表
        Sheet sheet = workbook.createSheet("03xls版本");
        //创建第一行
        Row row = sheet.createRow(0);
        //创建单元格
        Cell cell0 = row.createCell(0);
        cell0.setCellValue("序号");
        Cell cell1 = row.createCell(1);
        cell1.setCellValue("商品名称");

        //创建第二行
        Row row1 = sheet.createRow(1);
        Cell cell10 = row1.createCell(0);
        cell10.setCellValue("0");
        Cell cell11 = row1.createCell(1);
        cell11.setCellValue("电脑");

        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream("./测试.xls");
        workbook.write(fileOutputStream);

        //关闭输出流
        workbook.close();
        fileOutputStream.close();

    }

    public static void createDemoXLSX() throws Exception {
        //首先创建工作簿
        Workbook workbook = new XSSFWorkbook();
        //创建工作表
        Sheet sheet = workbook.createSheet("07xlsx版本");
        //创建第一行
        Row row = sheet.createRow(0);
        //创建单元格
        Cell cell0 = row.createCell(0);
        cell0.setCellValue("序号");
        Cell cell1 = row.createCell(1);
        cell1.setCellValue("商品名称");

        //创建第二行
        Row row1 = sheet.createRow(1);
        Cell cell10 = row1.createCell(0);
        cell10.setCellValue("0");
        Cell cell11 = row1.createCell(1);
        cell11.setCellValue("平板");

        //输出流
        FileOutputStream fileOutputStream = new FileOutputStream("./测试.xlsx");
        workbook.write(fileOutputStream);

        //关闭输出流
        workbook.close();
        fileOutputStream.close();

    }

三、批量插入

java 复制代码
    public static void main(String[] args) throws Exception {
//        BatchXlsInsert();
//        BatchXlsxInsert();
        BatchXlsxBigInsert();
    }

    //大内存插入数据 .xls 03-
    public static void BatchXlsInsert() throws Exception{
        //记录当前时间
        long start = System.currentTimeMillis();
        //先创建工作部
        Workbook workbook = new HSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("03测试");
        //调用复合组件
        rowOriginSheet(sheet);
        //输出
        FileOutputStream outputStream = new FileOutputStream("./03BatchInsert.xls");
        workbook.write(outputStream);
        long end = System.currentTimeMillis();
        System.out.println("创建03.xls耗时 ====> "+(end-start)/1000 + "s");
    }

    //大内存插入问题 07+ .xlsx
    public static void BatchXlsxInsert() throws Exception{
        //记录当前时间
        long start = System.currentTimeMillis();
        //先创建工作部
        Workbook workbook = new XSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("07测试");
        //调用复合组件
        rowOriginSheet(sheet);
        //输出
        FileOutputStream outputStream = new FileOutputStream("./07BatchInsert.xlsx");
        workbook.write(outputStream);
        long end = System.currentTimeMillis();
        System.out.println("创建07.xls耗时 ====>"+(end-start)/1000 + "s");
    }

    //大内存插入问题 07+ .xlsx 升级版
    public static void BatchXlsxBigInsert() throws Exception{
        //记录当前时间
        long start = System.currentTimeMillis();
        //先创建工作部
        Workbook workbook = new SXSSFWorkbook();
        //工作表
        Sheet sheet = workbook.createSheet("07测试");
        //调用复合组件
        rowOriginSheet(sheet);
        //输出
        FileOutputStream outputStream = new FileOutputStream("./07BatchBigInsert.xlsx");
        workbook.write(outputStream);
        long end = System.currentTimeMillis();
        System.out.println("创建07.xls耗时 ====>"+(end-start)/1000 + "s");
    }
    public static void rowOriginSheet(Sheet sheet){
        //创建行
//        for (int i = 0; i < 65536; i++) {
        for (int i = 0; i < 1045536; i++) {
            Row row = sheet.createRow(i);
            for (int j = 0; j < 20; j++) {
                Cell cell = row.createCell(j);
                cell.setCellValue(j+1);
            }
        }
    }

其中,HSSFWorkbook只能插入少于65536行的数据,而XSSFWorkbook可以插入少于1045536条数据,但是其插入的速度较慢,因此使用SXSSF进行了升级,插入的速度更快。

相关推荐
hnlucky3 小时前
Windows 上安装下载并配置 Apache Maven
java·hadoop·windows·学习·maven·apache
sadoshi2 天前
phpstudy的Apache添加AddType application/x-httpd-php .php .php5配置无效的处理方式
开发语言·php·apache
众乐乐_20082 天前
Uniapp中小程序调用腾讯地图(获取定位地址)
linux·服务器·apache
Johny_Zhao2 天前
CentOS Stream 10安装部署Zabbix 7.0网络监控平台和设备配置添加
linux·网络·网络安全·docker·信息安全·云计算·apache·zabbix·devops·yum源·huawei·系统运维·itsm·华三
小沈同学呀3 天前
Apache JMeter API 接口压测技术指南
jmeter·apache
何xiao树3 天前
Apache Ranger 2.2.0 编译
apache·rancher
wusam4 天前
Linux系统管理与编程20:Apache
linux·运维·服务器·apache·shell编程
Johny_Zhao4 天前
Ubuntu安装部署Zabbix网络监控平台和设备配置添加
linux·网络·mysql·网络安全·信息安全·云计算·apache·zabbix·shell·yum源·系统运维·itsm
搬砖的工人4 天前
Docker环境下的Apache NiFi安装实践踩坑记录
docker·容器·apache
曼岛_5 天前
[Java实战]Spring Boot 3 整合 Apache Shiro(二十一)
java·spring boot·apache