Java实现文件批量导入导出实践(兼容xls,xlsx) 您所在的位置:网站首页 java实现列表的批量导入 Java实现文件批量导入导出实践(兼容xls,xlsx)

Java实现文件批量导入导出实践(兼容xls,xlsx)

2023-04-02 21:14| 来源: 网络整理| 查看: 265

小Hub领读:

使用poi导入导出xls文件还是比较容易的,有完整的项目代码,可以clone下来好好研究哈!

作者: 小卖铺的老爷爷https://cnblogs.com/laoyeye/p/6938889.htmlhttps://github.com/allanzhuo/myport.git1、介绍

java 实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小 demo 来理解其原理,没接触过的同学也可以看看参考下。

目前我所接触过的导入导出技术主要有 POI 和 iReport,poi 主要作为一些数据批量导入数据库,iReport 做报表导出。另外还有 jxl 类似 poi 的方式,不过貌似很久没跟新了,2007 之后的 office 好像也不支持,这里就不说了。

2、POI 使用详解2.1 什么是 Apache POI?

Apache POI 是 Apache 软件基金会的开放源码函式库,POI 提供 API 给 Java 程序对 Microsoft Office 格式档案读和写的功能。

2.2 POI 的 jar 包导入

本次讲解使用 maven 工程,jar 包版本使用 poi-3.14 和 poi-ooxml-3.14。目前最新的版本是 3.16。因为 3.15 以后相关 api 有更新,部分操作可能不一样,大家注意下。

org.apache.poi poi 3.14 org.apache.poi poi-ooxml 3.14 2.3 POI 的 API 讲解2.3.1 结构HSSF - 提供读写 Microsoft Excel 格式档案的功能。XSSF - 提供读写 Microsoft Excel OOXML 格式档案的功能。HWPF - 提供读写 Microsoft Word 格式档案的功能。HSLF - 提供读写 Microsoft PowerPoint 格式档案的功能。HDGF - 提供读写 Microsoft Visio 格式档案的功能。2.3.2 对象

本文主要介绍 HSSF 和 XSSF 两种组件,简单的讲 HSSF 用来操作 Office 2007 版本前 excel.xls 文件,XSSF 用来操作 Office 2007 版本后的 excel.xlsx 文件,注意二者的后缀是不一样的。

HSSF 在 org.apache.poi.hssf.usermodel 包中。它实现了 Workbook 接口,用于 Excel 文件中的. xls 格式

常用组件:

HSSFWorkbook : excel 的文档对象HSSFSheet : excel 的表单HSSFRow : excel 的行HSSFCell : excel 的格子单元HSSFFont : excel 字体HSSFDataFormat: 日期格式HSSFHeader : sheet 头HSSFFooter : sheet 尾(只有打印的时候才能看到效果)

样式:

HSSFCellStyle : cell 样式

辅助操作包括:

HSSFDateUtil : 日期HSSFPrintSetup : 打印HSSFErrorConstants : 错误信息表

XSSF 在 org.apache.xssf.usemodel 包,并实现 Workbook 接口,用于 Excel 文件中的. xlsx 格式

常用组件:

XSSFWorkbook : excel 的文档对象XSSFSheet: excel 的表单XSSFRow: excel 的行XSSFCell: excel 的格子单元XSSFFont: excel 字体XSSFDataFormat : 日期格式

和 HSSF 类似;

2.3.3 两个组件共同的字段类型描述

其实两个组件就是针对 excel 的两种格式,大部分的操作都是相同的。

单元格类型 描述 CELL_TYPE_BLANK 代表空白单元格 CELL_TYPE_BOOLEAN 代表布尔单元(true或false) CELL_TYPE_ERROR 表示在单元的误差值 CELL_TYPE_FORMULA 表示一个单元格公式的结果 CELL_TYPE_NUMERIC 表示对一个单元的数字数据 CELL_TYPE_STRING 表示对一个单元串(文本)2.3.4 操作步骤

以 HSSF 为例,XSSF 操作相同。

首先,理解一下一个 Excel 的文件的组织形式,一个 Excel 文件对应于一个 workbook(HSSFWorkbook),一个 workbook 可以有多个 sheet(HSSFSheet)组成,一个 sheet 是由多个 row(HSSFRow)组成,一个 row 是由多个 cell(HSSFCell)组成。

1、用 HSSFWorkbook 打开或者创建 “Excel 文件对象”

2、用 HSSFWorkbook 对象返回或者创建 Sheet 对象

3、用 Sheet 对象返回行对象,用行对象得到 Cell 对象

4、对 Cell 对象读写。

3、代码操作3.1 效果图

惯例,贴代码前先看效果图

Excel 文件两种格式各一个:

代码结构:

导入后:(我导入了两遍,没做校验)

导出效果:

3.2 代码详解

这里我以 Spring+SpringMVC+Mybatis 为基础

Controller:

package com.allan.controller; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.apache.poi.ss.formula.functions.Mode; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.ModelAndView; import com.allan.pojo.Student; import com.allan.service.StudentService; /** * * @author 小卖铺的老爷爷 * */ @Controller public class StudentController { @Autowired private StudentService studentService; /** * 批量导入表单数据 * * @param request * @param myfile * @return */ @RequestMapping(value="/importExcel",method=RequestMethod.POST) public String importExcel(@RequestParam("myfile") MultipartFile myFile) { ModelAndView modelAndView = new ModelAndView(); try { Integer num = studentService.importExcel(myFile); } catch (Exception e) { modelAndView.addObject("msg", e.getMessage()); return "index"; } modelAndView.addObject("msg", "数据导入成功"); return "index"; } @RequestMapping(value="/exportExcel",method=RequestMethod.GET) public void exportExcel(HttpServletResponse response) { try { studentService.exportExcel(response); } catch (Exception e) { e.printStackTrace(); } } }

Service

package com.allan.service.impl; import java.io.OutputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; 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.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.allan.mapper.StudentMapper; import com.allan.pojo.Student; import com.allan.service.StudentService; /** * * @author 小卖铺的老爷爷 * */ @Service public class StudentServiceImpl implements StudentService{ private final static String XLS = "xls"; private final static String XLSX = "xlsx"; @Autowired private StudentMapper studentMapper; /** * 导入Excel,兼容xls和xlsx */ @SuppressWarnings("resource") public Integer importExcel(MultipartFile myFile) throws Exception { // 1、用HSSFWorkbook打开或者创建“Excel文件对象” // // 2、用HSSFWorkbook对象返回或者创建Sheet对象 // // 3、用Sheet对象返回行对象,用行对象得到Cell对象 // // 4、对Cell对象读写。 //获得文件名 Workbook workbook = null ; String fileName = myFile.getOriginalFilename(); if(fileName.endsWith(XLS)){ //2003 workbook = new HSSFWorkbook(myFile.getInputStream()); }else if(fileName.endsWith(XLSX)){ //2007 workbook = new XSSFWorkbook(myFile.getInputStream()); }else{ throw new Exception("文件不是Excel文件"); } Sheet sheet = workbook.getSheet("Sheet1"); int rows = sheet.getLastRowNum();// 指的行数,一共有多少行+ if(rows==0){ throw new Exception("请填写数据"); } for (int i = 1; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有