使用poi创建的word文档 打开有问题_Java使用apache poi进行excel相关操作 - 寻觅beyond...

一.基本介绍

、Apache POI介绍

  Apache POI是一个可以进行微软的文档进行开源库,可以操作的文档类型包括word、ppt、excel、visio、outlook....

  本文主要针对Apache POI对excel的操作进行介绍,主要包括如何创建一个excel、录入数据、读取excel数据的方式。

  参考官方文档:

  1.首页:https://poi.apache.org/

  2.Excel文档介绍,使用方式

、HSSF和XSSF

  在POI中,如果要操作Excel,可以有两种操作“模式”,分别是HSSF和XSSF,其中HSSF可以处理win97以及低于2007的excel,而XSSF可以用于处理2007以及更高的版本excel,所以我们一般都会使用XSSF。

  有一个很重要的术语:工作薄,其实可以理解为“文档”,excel、word,都属于工作簿,英文workbook。

、引入依赖

  只需要导入poi-ooxml这个库即可。

<dependencies>
    <!-- poi库 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>4.</version>
    </dependency>

    <!-- 示例以单元测试的形式,所以需要导入junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13</version>
    </dependency>
</dependencies>

二.利用poi库创建excel

2.1、创建一个空excel

  下面的代码运行后

package cn.ganlixin.poi;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

import java.io.*;

public class CreateExcelTest {

    /**
     * 创建一个空的Excel文件
     */
    @Test
    public void testCreateEmptyExcel() throws IOException {
        // 创建文件
        BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(""));

        // 创建工作簿类(所有要写入excel的数据,都将保存在workbook中)
        XSSFWorkbook workbook = new XSSFWorkbook();

        // 将workbook中的数据写入到文件中。
        (outputStream);

        // 关闭
        ();
        ();
    }
}

、简单演示写入excel内容

  下面演示创建一个,并在“my-sheet-1”sheet内的第5行第3列写入一个“hello world”:

package cn.ganlixin.poi;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

import java.io.*;

public class CreateExcelTest {

    /**
     * 简单演示如何写入数据内容
     */
    @Test
    public void testCreateSimpleWorkbook() throws IOException {
        // 指定创建的excel文件名称
        BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(""));

        // 定义一个工作薄(所有要写入excel的数据,都将保存在workbook中)
        XSSFWorkbook workbook = new XSSFWorkbook();

        // 创建一个sheet
        XSSFSheet sheet = ("my-sheet-1");

        // 开始写入数据流程,2大步:1、定位到单元格,2、写入数据;定位单元格,需要通过行、列配合指定。
        // step1: 先选择第几行(0表示第一行),下面表示在第6行
        XSSFRow row = (5);
        // step2:选择第几列(0表示第一列),注意,这里的第几列,是在上面指定的row基础上,也就是第6行,第3列
        XSSFCell cell = (2);
        // step3:设置单元格的数据(写入数据)
        ("hello world");

        // 执行写入操作
        (outputStream);
        ();
        ();
        ();
    }
}

  运行后,下面是生成的excel:

  8d54f7132d467c1f3968dbbf6ce1d6ba.png

 、通常的写入数据流程

  一般写入excel的数据都是结构化的(类似于数据库表的结构),下面是一个示例,创建一个文档:

package cn.ganlixin.poi;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class CreateExcelTest {

    private static class User {
        private Integer id;
        private String name;
        private Integer age;
        private String addr;

        // 避免占用篇幅,所以省略了构造方法、getter、setter
    }

    /**
     * 写入结构化的用户信息数据
     */
    @Test
    public void testCreateUsersExcel() throws IOException {

        List<User> userList = new ArrayList<>();
        (new User(1, "abc", 99, "北京"));
        (new User(2, "lol", 77, "上海"));
        (new User(3, "qaq", 88, "深圳"));
        (new User(4, "owo", 66, "杭州"));

        // 指定创建的excel文件名称
        BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(""));

        // 定义一个工作薄(所有要写入excel的数据,都将保存在workbook中)
        XSSFWorkbook workbook = new XSSFWorkbook();

        // 创建一个sheet
        XSSFSheet sheet = ("my-sheet");

        // 第一行,为表头,需要单独写入,下面是错误方式,因为在反复的创建第1行(rowNumber为0)
        /*
        (0).createCell(0).setCellValue("编号");
        (0).createCell(1).setCellValue("姓名");
        (0).createCell(2).setCellValue("年龄");
        (0).createCell(3).setCellValue("城市");
         */
        // 正确方式
        XSSFRow head = (0);
        (0).setCellValue("编号");
        (1).setCellValue("姓名");
        (2).setCellValue("年龄");
        (3).setCellValue("城市");

        // 接下来遍历要录入的数据(建议使用for,并且从第2行开始,也就是rowNumber为1,因为表头占了一行)
        for (int rowNumber = 1, index = 0; index < (); index++, rowNumber++) {
            User user = (index);

            // 写入数据流程,1、定位到单元格,2、写入数据;定位单元格,需要通过行、列配合指定。
            XSSFRow row = (rowNumber);
            (0).setCellValue(());
            (1).setCellValue(());
            (2).setCellValue(());
            (3).setCellValue(());
        }

        // 执行写入操作
        (outputStream);
        ();
        ();
        ();

    }
}

  生成的excel如下:

  7d3d6d9e84bee5fd515129d0cda22d71.png

三.使用POI读取Excel内容

、读取excel示例

  下面针对上面创建的进行读取并打印

package cn.ganlixin.poi;

import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.Test;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class ReadExcelTest {

    @Test
    public void testReadUsersExcel() throws IOException {
        // 指定excel文件,创建缓存输入流
        BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(""));

        // 直接传入输入流即可,此时excel就已经解析了
        XSSFWorkbook workbook = new XSSFWorkbook(inputStream);

        // 选择要处理的sheet名称
        XSSFSheet sheet = ("my-sheet");

        // 第一行表头,单独处理

        // 迭代遍历sheet剩余的每一行
        for (int rowNum = 0; rowNum < (); rowNum++) {
            if (rowNum == 0) { // 读取第一行(表头)
                XSSFRow head = (rowNum);
                String headColumn_1 = (0).getStringCellValue();
                String headColumn_2 = (1).getStringCellValue();
                String headColumn_3 = (2).getStringCellValue();
                String headColumn_4 = (3).getStringCellValue();
                String headStr = ("%s\t%s\t%s\t%s", headColumn_1, headColumn_2, headColumn_3, headColumn_4);
                (headStr);

            } else { // 非表头(注意读取的时候要注意单元格内数据的格式,要使用正确的读取方法)
                XSSFRow row = (rowNum);
                int id = (int) (0).getNumericCellValue();
                String name = (1).getStringCellValue();
                int age = (int) (2).getNumericCellValue();
                String addr = (3).getStringCellValue();
                String rowContent = ("%s\t%s\t%s\t%s", id, name, age, addr);
                (rowContent);
            }
        }

        ();
        ();
    }
}

  运行输出如下:

  e880e62341b125420ba22dab8d724461.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值