Java导出Excel表格

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

    • Java导出Excel表格
  • 前言
  • 一、企业excel项目导出演示
  • 二、使用步骤
    • 1.引入Maven仓库
    • 2.引入Java操作Excel工具类
    • 3.引入Controller层相关代码
    • 4.Application.yml文件
    • 5.实体类代码
    • 6.具体操作截图(Postman调用接口)
  • 总结

前言

在企业实际开发中,经常会遇到使用Java操作Excel表格并导出,其实这个功能不管是前端Vue还是后端Java,实现起来都是非常简单的,相信看完本文的你一定会有所收获,干货满满.


以下是本篇文章正文内容,下面是个人企业开发的真实案例:可供参考

一、企业excel项目导出演示



下面就来聊聊具体实现吧。

二、使用步骤

1.引入Maven仓库

代码如下(示例):

 <!--excel相关依赖--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17-beta1</version></dependency>

2.引入Java操作Excel工具类

代码如下(示例):

public class ExcelExportUtils {public static List<List<String>> myReadExcel(File file){List<List<String>> resultList = new ArrayList<>();String path = file.getName();Workbook wb = null;Short rowLen = 0;Integer columnLen = 0;try {if (path.endsWith("xls")) {FileInputStream fis = new FileInputStream(file);wb = new HSSFWorkbook(fis);} else if (path.endsWith("xlsx")) {wb = new XSSFWorkbook(file);}} catch (Exception e) {e.printStackTrace();}Sheet firstSheet = wb.getSheetAt(0);if (firstSheet != null)columnLen = firstSheet.getLastRowNum();for (int i = 0; i < columnLen; i++) {Row row = firstSheet.getRow(i);if (row != null) {List<String> rowData = new ArrayList<>();resultList.add(rowData);if (rowLen == 0)rowLen = row.getLastCellNum();for (int i2 = 0; i2 < rowLen; i2++) {Cell cell = row.getCell(i2);if (cell != null)rowData.add(cell.toString());else rowData.add("");}}}return resultList;}/*** 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上** @param title   表格标题名* @param headers 表格属性列名数组* @param dataset 需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的*                javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)* @param out     与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中* @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"*/public static <T> void exportExcelList(String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern, String[]... args) {// 声明一个工作薄HSSFWorkbook workbook = new HSSFWorkbook();// 生成一个表格HSSFSheet sheet = workbook.createSheet(title);// 设置表格默认列宽度为15个字节sheet.setDefaultColumnWidth((short) 15);// 生成一个样式HSSFCellStyle style = workbook.createCellStyle();// 设置这些样式//设置表头的背景颜色(excel的第一行)style.setFillForegroundColor(HSSFColor.WHITE.index);//SKY_BLUEstyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style.setBorderBottom(HSSFCellStyle.BORDER_THIN);style.setBorderLeft(HSSFCellStyle.BORDER_THIN);style.setBorderRight(HSSFCellStyle.BORDER_THIN);style.setBorderTop(HSSFCellStyle.BORDER_THIN);style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 生成一个字体HSSFFont font = workbook.createFont();//设置表头的字体颜色font.setColor(HSSFColor.BLACK.index);//VIOLETfont.setFontHeightInPoints((short) 12);font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 把字体应用到当前的样式style.setFont(font);// 生成并设置另一个样式HSSFCellStyle style2 = workbook.createCellStyle();//设置表体的背景颜色(除了表头)style2.setFillForegroundColor(HSSFColor.WHITE.index);//LIGHT_YELLOWstyle2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);style2.setBorderRight(HSSFCellStyle.BORDER_THIN);style2.setBorderTop(HSSFCellStyle.BORDER_THIN);style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 生成另一个字体HSSFFont font2 = workbook.createFont();font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);// 把字体应用到当前的样式style2.setFont(font2);// 声明一个画图的顶级管理器HSSFPatriarch patriarch = sheet.createDrawingPatriarch();// 定义注释的大小和位置,详见文档HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));// 设置注释内容comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.comment.setAuthor("leno");for (int i = 0; i < args.length - 1; i = i + 2) {//下拉框的位置CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 1, Integer.valueOf(args[i + 1][0]), Integer.valueOf(args[i + 1][0]));//下拉框准备的数据DVConstraint constraint = DVConstraint.createExplicitListConstraint(args[i]);HSSFDataValidation dataValidation = new HSSFDataValidation(cellRangeAddressList, constraint);sheet.addValidationData(dataValidation);}// 产生表格标题行HSSFRow row = sheet.createRow(0);for (short i = 0; i < headers.length; i++) {HSSFCell cell = row.createCell(i);cell.setCellStyle(style);HSSFRichTextString text = new HSSFRichTextString(headers[i]);cell.setCellValue(text);}// 遍历集合数据,产生数据行Iterator<T> it = dataset.iterator();int index = 0;while (it.hasNext()) {index++;row = sheet.createRow(index);T t = it.next();// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值Field[] fields = t.getClass().getDeclaredFields();int i = 0;for (short j = 0; j < fields.length; j++, i++) {Field field = fields[j];String fieldName = field.getName();if (fieldName.equals("serialVersionUID")) {i = -1;continue;}HSSFCell cell = row.createCell(i);cell.setCellStyle(style2);String getMethodName ="get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);try {Class tCls = t.getClass();Method getMethod = tCls.getMethod(getMethodName, new Class[]{});Object value = getMethod.invoke(t, new Object[]{});if (value == null) continue;// 判断值的类型后进行强制类型转换String textValue = null;if (value instanceof Boolean) {boolean bValue = (Boolean) value;textValue = "男";if (!bValue) {textValue = "女";}} else if (value instanceof Date) {Date date = (Date) value;SimpleDateFormat sdf = new SimpleDateFormat(pattern);textValue = sdf.format(date);} else if (value instanceof byte[]) {// 有图片时,设置行高为60px;row.setHeightInPoints(60);// 设置图片所在列宽度为80px,注意这里单位的一个换算sheet.setColumnWidth(i, (short) (35.7 * 80));// sheet.autoSizeColumn(i);byte[] bsValue = (byte[]) value;HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6,index, (short) 6, index);anchor.setAnchorType(2);patriarch.createPicture(anchor,workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));} else {// 其它数据类型都当作字符串简单处理textValue = value.toString();}// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成if (textValue != null) {Pattern p = Pattern.compile("^//d+(//.//d+)?$");Matcher matcher = p.matcher(textValue);if (matcher.matches()) {// 是数字当作double处理cell.setCellValue(Double.parseDouble(textValue));} else {HSSFRichTextString richString = new HSSFRichTextString(textValue);HSSFFont font3 = workbook.createFont();//设置数据的字体颜色(除了第一行)font3.setColor(HSSFColor.BLACK.index);//BLUErichString.applyFont(font3);cell.setCellValue(richString);}}} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} finally {// 清理资源}}}try {workbook.write(out);} catch (IOException e) {e.printStackTrace();}}
}

工具类代码直接复制即可。

3.引入Controller层相关代码

代码如下(示例):

 @RestController
@RequestMapping("/excel")
public class ExcelController {/***  从配置文件中读取值,加: 可以保证配置文件中没有该值的时候不会报错,*  正常这些值是直接从数据库中查询出来,这里为了减少数据操作层才这么做*/@Value("#{'${test.value1:}'.empty ? null : '${test.value1:}'.split(',')}")private List listValue1;@Value("#{'${test.value2:}'.empty ? null : '${test.value2:}'.split(',')}")private List listValue2;@Value("#{'${test.value3:}'.empty ? null : '${test.value3:}'.split(',')}")private List listValue3;@Value("#{'${test.value4:}'.empty ? null : '${test.value4:}'.split(',')}")private List listValue4;/*** 该导出方法最后操作是流,所以不需要返回值,使用void,相反如果写了return是会报错的,不信的可以试试* @param name* @param response*/@GetMapping("/export_list/{name}")public void exportConsumList(@PathVariable("name") String name, HttpServletResponse response){System.out.println("接收到来自前端的参数name :" + name);List<ExcelConsumListResp> exportList = new ArrayList<>();/*** 下面给 exportList  赋值*/setValue(exportList);/*** 下面就是具体的导出方法*/exportNewModel(exportList,response);}private void exportNewModel(List<ExcelConsumListResp> exportList, HttpServletResponse response) {OutputStream bos = null;String fileName = "场馆测试.xls";try{bos = new BufferedOutputStream(response.getOutputStream());response.setHeader(HttpHeaders.CONTENT_TYPE, "application/vnd.ms-excel");/*** 这里的表头,需要与前面定义的 ExcelConsumListResp 类中的属性名保持一致,并且顺序和数量也需要一致*/String[] atrArray = {"序号","场馆名称","场馆地址","服务项目","加入日期"};//调用工具类中的方法,进行导出ExcelExportUtils.exportExcelList(fileName, atrArray, exportList, bos, "yyy-MM-dd");//写出流ResponseEntity.ok().body(bos);bos.close();}catch(Exception e){e.getMessage();}}private void setValue(List<ExcelConsumListResp> resp){List<List<String>> list = new ArrayList<>();list.add(listValue1);list.add(listValue2);list.add(listValue3);list.add(listValue4);list.stream().forEach(p->{int i = 0;ExcelConsumListResp vo = new ExcelConsumListResp();vo.setIndex(p.get(i++)).setStaName(p.get(i++)).setAddress(p.get(i++)).setProjectName(p.get(i++)).setCreateTime(p.get(i));resp.add(vo);});}}

4.Application.yml文件

代码如下(示例):

server:port: 8088# 定义具体导出的数据,正常通过数据库查询即可
test:value1: 1,体育馆1,武汉,羽毛球,2021-11-01value2: 2,体育馆2,北京,篮球,2021-11-02value3: 3,体育馆3,上海,乒乓球,2021-11-03value4: 4,体育馆4,深圳,足球,2021-11-04

5.实体类代码

代码如下(示例):

@Data
public class ExcelConsumListResp {/*** 序号*/private String index;/*** 场馆名称*/private String staName;/*** 场馆地址*/private String address;/*** 服务项目*/private String projectName;/*** 加入日期*/private String createTime;}

6.具体操作截图(Postman调用接口)

调用写好的接口试试:

发现接口已经调用进来,放开端点:

由于后端返回的是流,所以可以看到这里的postman返回值,这个是不可以直接使用的,前端vue自然有办法将流转换为excel文件,那么到这一步可以算是成功了

那么如何查看这个流正不正确呢,其实postman可以这样做:
在调用接口的时候就保存

点击之后会让我们选择保存位置,保存到桌面

打开看看:


总结

提示:这里对文章进行总结:
以上就是今天要讲的内容,一步一步的讲解了java操作excel导出的步骤,如果你是新手小白,可以关注我的微信公众号,即可领取此项目的源码哦,感谢支持,每周分享一些干货给你们 Thanks。

Java操作Excel并导出相关推荐

  1. Java操作Excel导入导出(EasyExcel)

    在管理一个系统时,总会有许多的数据,为了方便浏览查看数据,系统总会提供「导出Excel」的功能:有导出就有导入,在要向数据库中插入大量的数据时,我们向程序提供准备好的 Excel,然后程序读取表格内容 ...

  2. java实现excel导入导出,对象图片读取,上传七牛云

    java实现excel导入导出以及解决方案 因为公司业务需求,要完成针对表格的导入导出,excel这里使用MultipartFile类接收 ,下面是部分关键代码,希望有所帮助 //获取excel文件的 ...

  3. java操作excel表

    文章分类:Java编程 http://developers.sun.com.cn/blog/functionalca/entry/java读写excel简介 JAVA EXCEL API简介 Java ...

  4. Java操作Excel之Excel文件的下载

    1.有的时候在Web应用会有下载Excel的需求,现分享下后台实现下载Excel文件的代码 @RequestMapping(value = "/exportExcel", meth ...

  5. java操作excel

    使用Java操作excel可以使用两种方式: 关于表格导入导出,市面上比较知名的开源就是 Apache 的POI 和 阿里巴巴的 EasyExcel了.EasyExcel 也是对 POI 的改进和封装 ...

  6. Java POI Excel导入导出

    Java POI Excel导入导出 1.maven引入依赖 2.导入Excel 3.导出Excel 1.maven引入依赖 <!-- POI Excel 操作 --> <depen ...

  7. JAVA操作excel生成报表

    JAVA操作excel生成报表 列标题根据选择的项目动态生成 1 模板文件 2 返回结果集 需要在结果集中对返回的数据进行处理,需要返回所在行数据以及所处项目,从而确定所处单元格的位置. 3将报表统计 ...

  8. java excel读取操作,Java 操作 Excel (读取Excel2003 2007,Poi兑现)

    Java 操作 Excel (读取Excel2003 2007,Poi实现) 一. Apache POI 简介( http://poi.apache.org/) 使用Java程序读写Microsoft ...

  9. java excel类库,jExcelApi Java 操作 Excel 的类库

    jExcelApi Java 操作 Excel 的类库 Java Excel API(JXL)是一个成熟,开源的用来操作Excel电子表格的Java类库,支持读取,修改,写入等操作.这个项目基于GPL ...

最新文章

  1. 关于routerOS设置PPPOE与HOTSPOT并存的说明
  2. 使用PowerShell 链接Azure 查看信息
  3. Zookeeper_实际应用讲解
  4. 【测试点分析】1072 开学寄语 (20分)_42行代码AC
  5. 7-2 单源最短路径 (10 分)(思路+详解+邻接表做法)Come Brather!!!!!!!!!!
  6. 浅谈大前端的代表技术及其影响,值得我们思考
  7. java implements interface_java接口(interface)与现实(implements)
  8. 详解数据科学与数理统计的基本概念
  9. 计算机控制台win10,寻找win10电脑的控制面板工具
  10. 跨域支持与返回json数据--mvc访问api接口
  11. The Python Challenge 题解
  12. Eclipse,新建web项目后 出现jax-ws webservice
  13. eda多功能时钟设计_Altera FPGACPLD设计 基础篇+高级篇(附随书光盘)
  14. 暗黑战神项目详细总结
  15. STM32中使用PS2手柄
  16. 计算机网络基础知识点总结
  17. idea 怎么快速创建类的快捷键_Idea 常用快捷键整理
  18. 雷击浪涌设计:保险丝选型
  19. 大气的品牌化妆品官网模板
  20. 射频电路板设计常见的问题分析和解决办法

热门文章

  1. Tomcat日志记录post请求参数
  2. python实现植物大战僵尸_Python开发植物大战僵尸游戏
  3. 解决Mybatis3.3中NVARCHAR2生僻字乱码
  4. 宏记录器 Macro Recorder 2.0 注册版
  5. KISSY基础篇乄KISSY之Anim(1)
  6. 华为秘密“达芬奇计划”首次曝光:自主研发AI芯片要对标英伟达?
  7. 2020年985大学计算机分数线,2020年985大学名单分数线
  8. 允许远程协助连接这台计算机 灰色
  9. 博优商业管理系统SQL Anywhere(ASA) 数据库“File is shorter than expected -- transaction rolled back”错误修复
  10. MP530注墨 连供及传真的心得体会