Apache-POI读写excel文件

这篇具有很好参考价值的文章主要介绍了Apache-POI读写excel文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.POI介绍

ApachePOI是用Java编写的免费开源的跨平台的JavaAPI,ApachePOI提供API给Java程序对MicrosoftOffice格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。
依赖导入:

<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi</artifactId>
  <version>3.15</version>
</dependency>
<dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>3.15</version>
</dependency>

二.POI结构

针对不同的文档形式来操作的时候会提供相应的一些类

HSSF - 提供读写Microsoft Excel XLS格式档案的功能
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能
HWPF - 提供读写Microsoft Word DOC格式档案的功能
HSLF - 提供读写Microsoft PowerPoint格式档案的功能
HDGF - 提供读Microsoft Visio格式档案的功能
HPBF - 提供读Microsoft Publisher格式档案的功能
HSMF - 提供读Microsoft Outlook格式档案的功能

HSSF常用类和方法介绍:

  • HSSFWorkbook :工作簿,代表一个excel的整个文档
    • HSSFWorkbook(); // 创建一个新的工作簿
    • HSSFWorkbook(InputStream inputStream); // 创建一个关联输入流的工作簿,可以将一个excel文件封装成工作簿
    • HSSFSheet createSheet(String sheetname); 创建一个新的Sheet
    • HSSFSheet getSheet(String sheetName); 通过名称获取Sheet
    • HSSFSheet getSheetAt(int index); // 通过索引获取Sheet,索引从0开始
    • HSSFCellStyle createCellStyle(); 创建单元格样式
    • write(OutputStream stream);
  • HSSFSheet:工作表
    • HSSFRow createRow(int rownum); 创建新行,需要指定行号,行号从0开始
    • HSSFRow getRow(int index); 根据索引获取指定的行
    • getLastRowNum(); 获取最后的行的索引,没有行或者只有一行的时候返回0
  • HSSFRow :行
    • HSSFCell createCell(int column); 创建新的单元格
    • HSSFCell getCell(shot index);通过下标获取单元格
    • short getLastCellNum(); 获取最后的列的索引+1
  • HSSFCell:单元格
    • getCellType(); 获取单元格类型,如 字符串、数字、布尔等
    • String getStringCellValue(); 获取单元格中的字符串值
  • HSSFCellStyle :单元格样式
    • setFont(Font font); 为单元格设置字体样式
    • setAlignment(HorizontalAlignment align); // 设置水平对齐方式
    • setVerticalAlignment(VerticalAlignment align); // 设置垂直对齐方式
    • setFillPattern(FillPatternType fp);
    • setFillForegroundColor(short bg); 设置前景色
    • setFillBackgroundColor(short bg); 设置背景颜色

三.读Excel

3.1 导入maven坐标

3.2 使用SpringMVC上传文件,需要用到commons-fileupload

pom依赖:commons-fileupload

    <!-- 文件上传 -->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.1</version>
    </dependency>

springmvc.xml中配置文件上传解析器

    <!-- 配置文件上传解析器 id:必须是multipartResolver-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="#{1024*1024*5}"/>
        <property name="defaultEncoding" value="utf-8"/>
    </bean>

3.3 代码编写

前端代码(异步请求):

读取excel,前端可以发送同步请求,也可以发送异步请求

//给"导入"按钮添加单击事件
$("#importActivityBtn").click(function (){
	//获取文件名
	var activityFileName=$("#activityFile").val();
	var suffix=activityFileName.substr(activityFileName.lastIndexOf(".")+1).toLowerCase();
	if(suffix!="xls"){
		alert("只支持.xls");
		return;
	}
	//获取文件本身
	var activityFile = $("#activityFile")[0].files[0];
	if(activityFile.size>5*1024*1024){
		alert("文件大小不能超过5MB");
		return;
	}
	//FormData是ajax提供的接口,可以模拟键值对向后台提供信息
	//FormData最大的优势是不但能提交字符串信息,还能提交二进制数据
	var formData = new FormData();
	formData.append("activityFile",activityFile);
	formData.append("userName","张三");
	//发送ajax请求
	$.ajax({
		url:'workbench/activity/importActivity.do',
		data:formData,
		processData:false,//设置ajax向后台提交参数之前,是否把参数统一转换成字符串:true--是,false--不是,默认是true
		contentType:false,//设置ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码:true--是,false--不是,默认是true
		type:'post',
		dataType:'json',
		success:function (data){
			if(data.code=="1"){
				alert(data.message);
				$("#importActivityModal").modal("hide");
				//刷新市场活动列表,显示第一页数据,保持每页条数不变
				queryActivityByConditionForPage(1,$("#demo_pag1").bs_pagination('getOption', 'rowsPerPage'));
			}else{
				alert(data.message);
				$("#importActivityModal").modal("show");
			}
		}
	});
});

Controller层:

 @RequestMapping("/workbench/activity/importActivity.do")
 @ResponseBody
 public Object importActivity(MultipartFile activityFile,HttpSession session){
     User user= (User) session.getAttribute(Constants.SESSION_USER);
     ReturnObject returnObject=new ReturnObject();
     try {
         //获取输入流
         InputStream inputStream = activityFile.getInputStream();
         //获取excel文本
         HSSFWorkbook wb = new HSSFWorkbook(inputStream);
         HSSFSheet sheet = wb.getSheetAt(0);//页的下标,从0开始
         HSSFRow row=null;
         HSSFCell cell=null;
         //解析excel文本,封装成Activity对象
         Activity activity=null;
         List<Activity> activityList=new ArrayList<>();
         for(int i=1;i<=sheet.getLastRowNum();i++){//sheet.getLastRowNum():最后一行的下标
             row=sheet.getRow(i);//行的下标,下标从0开始
             activity=new Activity();
             activity.setId(UUIDUtils.getUUID());
             activity.setOwner(user.getId());
             activity.setCreateTime(DateUtils.formatDateTime(new Date()));
             activity.setCreateBy(user.getId());
             for(int j=0;j<row.getLastCellNum();j++){//row.getLastCellNum():最后一列的下标+1
                 //根据HSSFRow对象,封装一列信息
                 cell=row.getCell(j);//列的下标,下标从0开始
                 //获取列中的数据
                 String cellValueForStr = HSSFUtils.getCellValueForStr(cell);
                 if(j==0){
                     activity.setName(cellValueForStr);
                 }else if(j==1){
                     activity.setStartDate(cellValueForStr);
                 }else if(j==2){
                     activity.setEndDate(cellValueForStr);
                 }else if(j==3){
                     activity.setCost(cellValueForStr);
                 }else if(j==4) {
                     activity.setDescription(cellValueForStr);
                 }
             }
             //每一行封装完之后,添加到list集合
             activityList.add(activity);
         }
         //调用service层方法,保存导入的市场活动
         int count=activityService.saveCreateActivityByList(activityList);
         if(count>0){
             returnObject.setCode(Constants.RETURN_OBJECT_CODE_SUCCESS);
             returnObject.setMessage("导入"+count+"条市场活动");
         }else{
             returnObject.setCode(Constants.RETURN_OBJECT_CODE_FAIL);
             returnObject.setMessage("系统忙,请稍后重试...");
         }
     }catch (Exception e){
         e.printStackTrace();
         returnObject.setCode(Constants.RETURN_OBJECT_CODE_FAIL);
         returnObject.setMessage("系统忙,请稍后重试...");
     }
     return returnObject;
 }

HSSF的工具类:

package com.jm.crm.commons.utils;

import org.apache.poi.hssf.usermodel.HSSFCell;
/**
 * 关于excel文件操作的工具类
 */
public class HSSFUtils {
    /**
     * 从指定的HSSFCell对象中获取列的值
     * @return
     */
    public static String getCellValueForStr(HSSFCell cell){
        String str="";
        if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){
            str=cell.getStringCellValue();
        }else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){
            str=cell.getNumericCellValue()+"";
        }else if(cell.getCellType()==HSSFCell.CELL_TYPE_FORMULA){
            str=cell.getCellFormula()+"";
        }else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){
            str=cell.getBooleanCellValue()+"";
        }else {
            str="";
        }
        return str;
    }
}

前端发送同步请求(测试):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
%>
<html>
<head>
    <base href="<%=basePath%>">
    <title>演示文件上传</title>
</head>
<body>
<!--
    文件上传的表单三个条件:
    1.表单组件标签必须用:<input type="file">
      <input type="text|password|radio|checkbox|hidden|button|submit|reset|file">
                      <select>,<textarea>2.请求方式只能用:post
      get:参数通过请求头提交到后台,参数放在URL后边;只能向后台提交文本数据;对参数长度有限制;数据不安全;效率高
      post:参数通过请求体提交到后台;既能能提交文件数据,又能够提交二进制数据;理论上对参数长度没有限制;相对安全;效率相对较低
    3.表单的编码格式只能用:multipart/form-data
      根据HTTP协议的规定,浏览器每次向后台提交参数,都会对参数进行统一编码;默认采用的编码格式是urlencoded,这种编码格式只能对文本数据进行编码;
      浏览器每次向后台提交参数,都会首先把所有的参数转换成字符串,然后对这些数据统一进行urlencoded编码;
      文件上传的表单编码格式只能用multipart/form-data:enctype="multipart/form-data"
-->
<form action="workbench/activity/fileUpload.do" method="post" enctype="multipart/form-data">
    <input type="file" name="myFile"><br>
    <input type="text" name="userName"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

四.写Excel

4.1 导入maven坐标

4.2 代码编写

前端代码:
编写excel,前端必须发送同步请求

//给"批量导出"按钮添加单击事件
$("#exportActivityAllBtn").click(function (){
	//发送同步请求
	window.location.href="workbench/activity/exportAllActivities.do";
});

//给"选择导出"按钮添加单击事件
$("#exportActivityXzBtn").click(function (){
	//收集参数
	var checkedIds=$("#tBody input[type='checkbox']:checked");
	//拼接ids
	var ids="";
	$.each(checkedIds,function (i,obj){
		ids+="id="+obj.value+"&";
	});
	ids.substr(0,ids.length-1);

	//发送同步请求
	window.location.href="workbench/activity/exportActivityXzBtn.do?"+ids;
});

Controller层:文章来源地址https://www.toymoban.com/news/detail-447860.html

    @RequestMapping("/workbench/activity/exportAllActivities.do")
    public void exportAllActivities(HttpServletResponse response) throws IOException {
        //调用service层方法,查询所有市场活动
        List<Activity> activityList = activityService.queryAllActivities();
        //创建excel文件,并且把activityList写入到excel文件中
        HSSFWorkbook wb=new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("市场活动列表");
        HSSFRow row = sheet.createRow(0);//第一行
        HSSFCell cell = row.createCell(0);//第一列
        cell.setCellValue("ID");
        cell=row.createCell(1);
        cell.setCellValue("所有者");
        cell=row.createCell(2);
        cell.setCellValue("名称");
        cell=row.createCell(3);
        cell.setCellValue("开始日期");
        cell=row.createCell(4);
        cell.setCellValue("结束日期");
        cell=row.createCell(5);
        cell.setCellValue("成本");
        cell=row.createCell(6);
        cell.setCellValue("描述");
        cell=row.createCell(7);
        cell.setCellValue("创建时间");
        cell=row.createCell(8);
        cell.setCellValue("创建者");
        cell=row.createCell(9);
        cell.setCellValue("修改时间");
        cell=row.createCell(10);
        cell.setCellValue("修改者");
        //遍历activityList,创建HSSFRow对象,生成所有数据行
        if(activityList!=null&&activityList.size()>0){
            Activity activity=null;
            for(int i=0;i<activityList.size();i++){
                activity=activityList.get(i);
                //每遍历出一个activity,生成一行
                row=sheet.createRow(i+1);
                cell=row.createCell(0);
                cell.setCellValue(activity.getId());
                cell=row.createCell(1);
                cell.setCellValue(activity.getOwner());
                cell=row.createCell(2);
                cell.setCellValue(activity.getName());
                cell=row.createCell(3);
                cell.setCellValue(activity.getStartDate());
                cell=row.createCell(4);
                cell.setCellValue(activity.getEndDate());
                cell=row.createCell(5);
                cell.setCellValue(activity.getCost());
                cell=row.createCell(6);
                cell.setCellValue(activity.getDescription());
                cell=row.createCell(7);
                cell.setCellValue(activity.getCreateTime());
                cell=row.createCell(8);
                cell.setCellValue(activity.getCreateBy());
                cell=row.createCell(9);
                cell.setCellValue(activity.getEditTime());
                cell=row.createCell(10);
                cell.setCellValue(activity.getEditBy());
            }
        }
        //把生成的excel文件下载到客户端
        //设置响应的内容类型和编码方式
        response.setContentType("application/octet-stream;charset=UTF-8");
        //实现文件下载的时候,避免浏览器自动打开文件
        response.addHeader("Content-Disposition","attachment;filename=activityList.xls");
        //从response中获取输出流
        ServletOutputStream outputStream = response.getOutputStream();
        //将内存中文件写入到客户端
        wb.write(outputStream);
        //关闭刷新流
        wb.close();
        outputStream.flush();
    }

    @RequestMapping("/workbench/activity/exportActivityXzBtn.do")
    public void exportActivityXzBtn(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //获取参数
        String[] ids = request.getParameterValues("id");
        //调用service层方法,查询符合条件的市场活动
        List<Activity> activityList = activityService.queryActivityByIds(ids);
        //创建excel文件,将activityList内容写到excel中
        HSSFWorkbook wb=new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("市场活动列表");
        HSSFRow row = sheet.createRow(0);//第一行
        HSSFCell cell = row.createCell(0);//第一列
        cell.setCellValue("ID");
        cell=row.createCell(1);
        cell.setCellValue("所有者");
        cell=row.createCell(2);
        cell.setCellValue("名称");
        cell=row.createCell(3);
        cell.setCellValue("开始日期");
        cell=row.createCell(4);
        cell.setCellValue("结束日期");
        cell=row.createCell(5);
        cell.setCellValue("成本");
        cell=row.createCell(6);
        cell.setCellValue("描述");
        cell=row.createCell(7);
        cell.setCellValue("创建时间");
        cell=row.createCell(8);
        cell.setCellValue("创建者");
        cell=row.createCell(9);
        cell.setCellValue("修改时间");
        cell=row.createCell(10);
        cell.setCellValue("修改者");
        //遍历activityList,创建HSSFRow对象,生成所有数据行
        if(activityList!=null&&activityList.size()>0){
            Activity activity=null;
            for(int i=0;i<activityList.size();i++){
                activity=activityList.get(i);
                //每遍历出一个activity,生成一行
                row=sheet.createRow(i+1);
                cell=row.createCell(0);
                cell.setCellValue(activity.getId());
                cell=row.createCell(1);
                cell.setCellValue(activity.getOwner());
                cell=row.createCell(2);
                cell.setCellValue(activity.getName());
                cell=row.createCell(3);
                cell.setCellValue(activity.getStartDate());
                cell=row.createCell(4);
                cell.setCellValue(activity.getEndDate());
                cell=row.createCell(5);
                cell.setCellValue(activity.getCost());
                cell=row.createCell(6);
                cell.setCellValue(activity.getDescription());
                cell=row.createCell(7);
                cell.setCellValue(activity.getCreateTime());
                cell=row.createCell(8);
                cell.setCellValue(activity.getCreateBy());
                cell=row.createCell(9);
                cell.setCellValue(activity.getEditTime());
                cell=row.createCell(10);
                cell.setCellValue(activity.getEditBy());
            }
        }
        //把生成的excel文件下载到客户端
        //设置响应内容和编码
        response.setContentType("application/octet-stream;charset=UTF-8");
        //实现下载的时候,防止浏览器打开文件
        response.addHeader("Content-Disposition","attachment;filename=activityList"+UUIDUtils.getUUID()+".xls");
        ServletOutputStream outputStream = response.getOutputStream();
        //写入客户端
        wb.write(outputStream);
        //关闭刷新流
        wb.close();
        outputStream.flush();
    }

到了这里,关于Apache-POI读写excel文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Apache POI操作Excel文件

            Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用 POI操作Excel文件 。 POI结构: 我们使用:XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能 POI操作Excel表格封装了几个核心

    2024年02月10日
    浏览(66)
  • Apache POI | Java操作Excel文件

    目录 1、介绍 2、代码示例 2.1、将数据写入Excel文件 2.2、读取Excel文件中的数据 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎Python人工智能开发和前端开发。 🦅主页:@逐梦苍穹 📕您的一

    2024年02月20日
    浏览(56)
  • Apache POI及easyExcel读取及写入excel文件

    目录 1.excel 2.使用场景 3.Apache POI 4.easyExcel 5.总结 1.excel excel分为两版,03版和07版。 03版的后缀为xls,最大有65536行。 07版的后缀为xlsx,最大行数没有限制。 2.使用场景 将用户信息导出到excel表格中。 将excel中的数据读取到数据库中。 3.Apache POI (1)说明 Apache POI是Apache软件基金会

    2024年02月06日
    浏览(52)
  • 浏览器生成Excel文件 ,Apache POI 使用方法及示例

    Apache POI 是 Apache 软件基金会的开源项目,它提供 API 用于读取和写入 Microsoft Office 格式的文件,如 Excel、Word 等。在 Spring Boot 应用中,结合使用 Apache POI 可以方便地处理 Excel 文件 一 引入依赖: 二 读取Excel示例: 三 写入Excel示例: 四 浏览器下载Excel示例(api示例):

    2024年04月22日
    浏览(36)
  • Apache POI 导出Excel报表

    大家好我是苏麟 , 今天聊聊Apache POI . 介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下,POI 都是用于操作 Excel 文件。 官网 : Apache POI - the Java API for Microsoft Do

    2024年01月17日
    浏览(44)
  • Apache POI 以及 导出Excel表

    Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下,POI 都是用于操作 Excel 文件。 导依赖 将数据写入Excel文件 读取Excel文件数据 学习

    2024年02月11日
    浏览(39)
  • Apache POI 操作Excel常用方法

    一、Java使用Apache POI导出excel 二、Apache POI 操作Excel常用方法 三、Apache poi 拆分单元格并赋值 四、使用easypoi模板方法导出excel 五、Apache poi给excel单元格添加下拉框或数据验证 POI提供了HSSF、XSSF以及SXSSF三种方式操作Excel。 HSSF:Excel97-2003版本,扩展名为.xls。一个sheet最大行数6

    2024年02月09日
    浏览(54)
  • hutool poi、apache poi实现导入导出以及解析excel

    一、前言 看了例子之后后续需要更加深入学习或者更多理解其他API的话,建议看官方文档。hutool项目是中国人维护的,有中文文档,阅读起来很方便。apache poi比较底层一点,可以更加自由去二次开发自己所需的功能。 hutool官方文档 hutool官方gitee apache poi官方文档 二、基于

    2024年02月09日
    浏览(54)
  • Apache POI 解析复杂的excel表格

    一:场景说明        最近接到一个需求,让我解析Excel表。这要是简单常规的Excel表,那我还能摸一摸鱼给他整出来,主要是给我的Excel表长得跟下图中的Excel表一样复杂难搞,这可把我难倒了。于是开启了我的百度之旅,有可能是我不会百度或者理解能力太差,反正就是

    2024年02月04日
    浏览(42)
  • Apache POI,springboot中导出excel报表

    2.1 介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下,POI 都是用于操作 Excel 文件。 Apache POI 的应用场景: 银行网银系统导出交易明细 各种业务系统导出Excel报

    2024年02月02日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包