Apache-POI读写excel文件

文章目录

    • 一.POI介绍
    • 二.POI结构
    • 三.读Excel
      • 3.1 导入maven坐标
      • 3.2 使用SpringMVC上传文件,需要用到commons-fileupload
      • 3.3 代码编写
    • 四.写Excel
      • 4.1 导入maven坐标
      • 4.2 代码编写

一.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://uudwc.com/A/Jq1W

    @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();
    }

原文地址:https://blog.csdn.net/m0_66689823/article/details/127217835

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

h
上一篇 2023年06月15日 14:13
利用VS打包生成可执行程序流程
下一篇 2023年06月15日 14:14