POI简单实例实现Excel导入导出

POI实例

创建一张excel首先要知道excel由什么组成,比如sheet页就是一个工作表格,例如一行,一个单元格,单元格格式,单元格内容格式…这些都对应着poi里面的一个类。

Excel表格对应的POI生成

  • 创建Excel:
    HSSFWorkbook wb = new HSSFWorkbook();
  • 生成sheet页
    HSSFSheet sheet = wb.createSheet(“POI表格”);
  • 一行
    HSSFRow row = sheet.createRow(0);
  • 一个单元格
    HSSFCell cell = row.createCell(0);
  • 更多设置见 博客.或自行查看API

1.POI导出

// 本文以Junit举例,具体用法自行学习
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.junit.Test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
public class POIUsers {
    @Test
    public void usersPOI(){
        //1.创建工作薄
        Workbook workbook = new HSSFWorkbook();
        //2.创建sheet
        Sheet sheet = workbook.createSheet("usersPOI");
        
        //样式设置
        CellStyle cellStyle = work.createCellStyle();
        Font font = work.createFont();
        font.setColor(Font.COLOR_RED);
        font.setBold(true);
        cellStyle.setFont(font);
        
        //准备标题数据
        String[] title = {"姓名","年龄","工资","出生日期"};
        Date birth = new Date();
        //准备数据区
        List<Users> userList = Arrays.asList(new Users("Java",18,1000,birth),
                new Users("Python",18,1000,birth),
                new Users("Linux",16,10000,birth),
                new Users("Angularjs",16,10000,birth),
                new Users("Hadoop",38,5000,birth));
        /**
         * 创建标题行
         */
        Row row = sheet.createRow(0);
        //创建单元格
        for (int i = 0; i < title.length; i++) {
            Cell cell= row.createCell(i);
            //单元格赋值
            cell.setCellValue(title[i]);
        }

        /**
         *  数据区
         */
        Class userClass = Users.class;
        // 获得所有的属性字段
        Field[] fields = userClass.getDeclaredFields();
        for (int i = 0; i < userList.size(); i++) {
            // 创建第二行
            Row row2 = sheet.createRow(i + 1);
            for (int j = 0; j < title.length; j++) {
                /**
                 * Class 类对象 包含类的所有信息 与 类的对象 类的实例对象 3种方式
                 * 1.Class.forName("类的权限定名"); 2.实例名.getClass(); 3.类名.Class;
                 */
                // 第二行 第i个单元格
                Cell cell = row2.createCell(j);
                Field field = fields[j];

                // 打破封装
                field.setAccessible(true);

                // 获得field的值
                Object obj = field.get(userList.get(i));
                System.out.println(obj.toString());

                if (obj instanceof Date) {
                    Date date = (Date) obj;
                    String format = new SimpleDateFormat("yyyy-MM-dd")
                            .format(date);
                    cell.setCellValue(format);
                } else {
                    cell.setCellValue(obj.toString());
                }
            }
        }
        //6.输出
        File file = new File("E:\\POITest\\helloUser.xls");
        try {
            workbook.write(new FileOutputStream(file));
            System.out.println("导出成功!");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Users实体类:

package POI;

import java.util.Date;

/**
 * 用户实体
 */
public class Users {
	private String name;
	private Integer age;
	private double salary;
	private Date birth;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public double getSalary() {
		return salary;
	}
	public void setSalary(double salary) {
		this.salary = salary;
	}
	public Date getBirth() {
		return birth;
	}
	public void setBirth(Date birth) {
		this.birth = birth;
	}
	
	
	public Users(String name, Integer age, double salary, Date birth) {
		super();
		this.name = name;
		this.age = age;
		this.salary = salary;
		this.birth = birth;
	}
	public Users() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + ", salary=" + salary
				+ ", birth=" + birth + "]";
	}
}

2.POI导入

package POI;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class POIImport {
    /**
     * 导入
     */
    @Test
    public void ImportPOI() throws IOException, ParseException {
        FileInputStream inputStream = new FileInputStream(new File("E:\\POIImport\\HelloPOI.xls"));
        HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
        //获得sheet
        HSSFSheet sheet = workbook.getSheet("importPOI");
        //获得总行数
        int rowNum = sheet.getLastRowNum();
        List<User> users = new ArrayList<User>();
        for (int i = 1; i <= rowNum; i++) {
            HSSFRow row = sheet.getRow(i);
            User user = new User();
            user.setId(row.getCell(0).getStringCellValue());
            user.setName(row.getCell(1).getStringCellValue());
            user.setAge(Integer.parseInt(row.getCell(2).getStringCellValue()));
            user.setBirth(new SimpleDateFormat("yyyy-MM-dd").parse(row.getCell(3).getStringCellValue()));
            users.add(user);
        }
        System.out.println(users);
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Apache POI是一个用于处理和生成Excel文件的Java库。它可以用来读取和写入Microsoft Office格式的文档,包括Word和Excel。 在导入Excel时,可以使用POI的HSSF或XSSF模块读取Excel文件中的数据。 在导出Excel时,可以使用POI的HSSF或XSSF模块创建Excel文件并写入数据。 下面是一个简单的例子,展示了如何使用POI读取Excel文件中的数据: ```java import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import java.io.FileInputStream; public class ReadExcel { public static void main(String[] args) { try { // 创建文件输入流 FileInputStream inputStream = new FileInputStream("example.xls"); // 创建工作簿 Workbook workbook = new HSSFWorkbook(inputStream); // 获取第一个工作表 Sheet sheet = workbook.getSheetAt(0); // 遍历行和列 for (int rowNum = 0; rowNum <= sheet.getLastRowNum(); rowNum++) { for (int cellNum = 0; cellNum < sheet.getRow(rowNum).getLastCellNum(); cellNum++) { System.out.print(sheet.getRow(rowNum).getCell(cellNum) + " "); } System.out.println(); } // 关闭工作簿 workbook.close(); inputStream.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 更多关于POI的使用方法可以参考官方文档:https://poi.apache.org/ ### 回答2: Java使用POI(Poor Obfuscation Implementation)库来实现Excel导入导出POI是一个开源的Java库,提供了操作Microsoft Office格式文件的API。使用POI库可以轻松地读取、写入和编辑Excel文件,包括早期的XLS和现代的XLSX格式。通过POI,开发人员可以轻松地读取和写入大量的数据。在Java导入导出Excel文件需要以下步骤: 1. 添加POI库到项目的Classpath中。可以在Maven中添加以下依赖项: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 导入Excel文件。 ```java //创建工作簿 Workbook workbook = WorkbookFactory.create(new FileInputStream(new File("file.xlsx"))); //获取工作表 Sheet sheet = workbook.getSheetAt(0); //获取行数 int rowCount = sheet.getPhysicalNumberOfRows(); //遍历行 for (int i = 0; i < rowCount; i++) { Row row = sheet.getRow(i); ... } ``` 3. 导出Excel文件。 ```java //创建工作簿 Workbook workbook = new XSSFWorkbook(); //创建工作表 Sheet sheet = workbook.createSheet(); //创建行 Row row = sheet.createRow(0); //创建单元格 Cell cell = row.createCell(0); cell.setCellValue("Hello World!"); //将工作簿写入输出流 workbook.write(new FileOutputStream(new File("file.xlsx"))); workbook.close(); ``` 在导入导出Excel文件时,POI提供了很多功能,例如格式化单元格、合并单元格、添加公式计算、读取和写入日期等等。开发人员可以根据自己的需要使用这些功能来轻松地处理Excel文件。 ### 回答3: 在实际的java开发中,很多时候需要对Excel表格进行操作,如导入数据数据库或导出报表等。Java提供了很多开源的库来实现这个功能,其中比较著名的就是poipoi是一个Apache开源项目,它可以访问和处理Microsoft Office格式的文档,包括Word、Excel和PowerPoint。实现Excel导入导出主要使用的是poi的HSSF(Horrible Spreadsheet Format)和XSSF(XML Spreadsheet Format)两个模块。 一般大家都是以导入为主,因为Excel导出可以通过模板来实现,但是导入则需要根据Excel中的数据进行数据库的操作,下面我们就来分别讲解一下Java如何通过poi实现Excel导入导出Excel导入 1. 获取Excel文件 在开发中,我们可以选择手动上传Excel文件,或者通过代码将Excel文件下载到本地。如果需要手动上传Excel文件,可以使用常见的表单提交操作来实现。如果需要实现代码下载Excel文件到本地,后端代码可以像下面这样写: ```java // 文件下载 @RequestMapping("download") public void download(@RequestParam("fileName") String fileName, HttpServletResponse response) throws Exception { // 设置文件名 String fileRealName = file_name + ".xls"; // 设置文件路径 String filePath = "/files/"; // 获取输出流 OutputStream os = response.getOutputStream(); // 设置允许下载的文件类型 response.setContentType("application/x-download"); // 设置文件名 response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileRealName,"UTF-8")); // 读取文件流 InputStream inputStream = new FileInputStream(new File(filePath, fileRealName)); // 写文件流到客户端 byte[] b = new byte[2048]; int length; while ((length = inputStream.read(b)) > 0) { os.write(b, 0, length); } // 关闭流 os.close(); inputStream.close(); } ``` 2. 解析Excel文件 解析Excel文件的过程可以分为两步:读取Excel文件,解析Excel数据。读取Excel文件可以使用POI提供的API:WorkbookFactory.create(File file),即可以将Excel文件转化为Workbook对象,进而进行数据的解析。 解析Excel数据的过程需要了解Excel中的数据结构,主要包括三个部分: - Workbook: 工作簿,一个Excel文件。 - Sheet: 工作表,一个Excel文件中可以包含多个Sheet。 - Row: 行,一个Sheet中有多个行,每一行中又有多个Cell。 ```java // 上传Excel文件 @RequestMapping("upload") public String upload(@RequestParam("file") MultipartFile file) throws Exception { // 获取文件名 String fileName = file.getOriginalFilename(); // 获取文件后缀 String extension = fileName.substring(fileName.lastIndexOf(".")); // 判断文件类型 if (!".xls".equals(extension) && !".xlsx".equals(extension)) { return "文件格式错误"; } // 以流的方式读取文件,防止文件过大内存溢出 Workbook workbook = WorkbookFactory.create(file.getInputStream()); // 获取sheet数量 int sheetsCount = workbook.getNumberOfSheets(); // 遍历所有的sheet for (int i = 0; i < sheetsCount; i++) { Sheet sheet = workbook.getSheetAt(i); // 获取行数 int rowCount = sheet.getPhysicalNumberOfRows(); // 从第二行开始遍历每一行 for (int j = 1; j < rowCount; j++) { Row row = sheet.getRow(j); // 获取单元格中的数据 Cell cell1 = row.getCell(0); String cell1Value = cell1.getStringCellValue(); Cell cell2 = row.getCell(1); String cell2Value = cell2.getStringCellValue(); // 将数据插入到数据库 } } return "上传成功"; } ``` Excel导出 1. 创建Excel文件 在导出Excel时,要先创建一个Workbook对象,在此对象上创建Sheet对象和Row对象,然后再在Row对象上创建Cell对象,最后将数据写入Cell中。POI提供了两种Workbook对象:HSSFWorkbook(xls格式)和XSSFWorkbook(xlsx格式)。 ```java // 导出Excel文件 @RequestMapping("export") public String export(HttpServletResponse response) throws Exception { // 创建一个Workbook HSSFWorkbook workbook = new HSSFWorkbook(); // 创建Sheet HSSFSheet sheet = workbook.createSheet("Sheet1"); // 创建第一行(表头) HSSFRow headerRow = sheet.createRow(0); HSSFCell cell1 = headerRow.createCell(0); cell1.setCellValue("序号"); HSSFCell cell2 = headerRow.createCell(1); cell2.setCellValue("姓名"); // 写入数据 List<User> userList = getUserList(); for (int i = 0; i < userList.size(); i++) { User user = userList.get(i); HSSFRow row = sheet.createRow(i + 1); HSSFCell cell11 = row.createCell(0); cell11.setCellValue(user.getId()); HSSFCell cell12 = row.createCell(1); cell12.setCellValue(user.getUsername()); } // 通过response将生成的Excel文件输出到客户端浏览器 OutputStream outputStream = response.getOutputStream(); response.setContentType("application/binary;charset=UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("用户列表.xls", "UTF-8")); workbook.write(outputStream); outputStream.flush(); outputStream.close(); return "导出成功"; } private List<User> getUserList() { List<User> userList = new ArrayList<>(); User user1 = new User(); user1.setId(1); user1.setUsername("张三"); userList.add(user1); User user2 = new User(); user2.setId(2); user2.setUsername("李四"); userList.add(user2); User user3 = new User(); user3.setId(3); user3.setUsername("王五"); userList.add(user3); return userList; } class User { private int id; private String username; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } ``` 需要注意的是,导出Excel时要设置正确的响应头,否则在下载时会出现乱码问题,同时也要注意Excel的格式问题。另外,在实际的开发中,通过Freemarker等模板引擎生成Excel模板,再将数据填充到模板中,可以提高开发效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值