Java导出Excel
作者:互联网
POI简介
POI简介:Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。
官方主页http://poi.apache.org/index.html,
API文档http://poi.apache.org/apidocs/index.html
引入pom
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.6</version> </dependency> 或者 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency>
Jakarta POI HSSF API组件:
HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,有以下几种常用的对象:
常用组件:
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的格子单元
HSSFFont excel字体
样式:
HSSFCellStyle cell样式
基本操作步骤:
首先,我们应该要知道的是,一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成。那么我们用poi要导出一个Excel表格
的正确顺序应该是:
1、用HSSFWorkbook打开或者创建“Excel文件对象”
2、用HSSFWorkbook对象返回或者创建Sheet对象
3、用Sheet对象返回行对象,用行对象得到Cell对象
4、对Cell对象读写。
5、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面
3.6版本的Excel工具类:
package com.example.demo.utils; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; /** * @author 谢辉 * @Classname ExcelUtil * @Description TODO * @Date 2020/12/9 18:29 * Jakarta POI HSSF API组件: * HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象, * 样式和格式,有以下几种常用的对象: * <p> * 常用组件: * <p> * HSSFWorkbook excel的文档对象 * <p> * HSSFSheet excel的表单 * <p> * HSSFRow excel的行 * <p> * HSSFCell excel的格子单元 * <p> * HSSFFont excel字体 * <p> * 样式: * <p> * HSSFCellStyle cell样式 * <p> * 基本操作步骤: * 一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成。 * 那么我们用poi要导出一个Excel表格的正确顺序应该是: * <p> * 1、用HSSFWorkbook打开或者创建“Excel文件对象” * <p> * 2、用HSSFWorkbook对象返回或者创建Sheet对象 * <p> * 3、用Sheet对象返回行对象,用行对象得到Cell对象 * <p> * 4、对Cell对象读写。 * <p> * 5、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面 */ public class ExcelUtil { /** * 导出Excel * * @param sheetName sheet名称 * @param title 标题 * @param values 内容 * @param wb HSSFWorkbook对象 * @return */ public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) { // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if (wb == null) { wb = new HSSFWorkbook(); } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet HSSFSheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 HSSFRow row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 HSSFCellStyle style = wb.createCellStyle(); style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式 //声明列对象 HSSFCell cell = null; //创建标题 for (int i = 0; i < title.length; i++) { cell = row.createCell(i); cell.setCellValue(title[i]); cell.setCellStyle(style); } //创建内容 for (int i = 0; i < values.length; i++) { row = sheet.createRow(i + 1); for (int j = 0; j < values[i].length; j++) { //将内容按顺序赋给对应的列对象 row.createCell(j).setCellValue(values[i][j]); } } return wb; } }
3.17版本的Excel工具类:
package com.resafety.util; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; 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.HorizontalAlignment; import org.apache.poi.ss.usermodel.VerticalAlignment; /** * * @author 谢辉 * */ public class ExcelUtil { /** * 导出Excel * * @param sheetName sheet名称 * @param title 标题 * @param values 内容 * @param wb HSSFWorkbook对象 * @return */ public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) { // 第一步,创建一个HSSFWorkbook,对应一个Excel文件 if (wb == null) { wb = new HSSFWorkbook(); } // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet HSSFSheet sheet = wb.createSheet(sheetName); // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 HSSFRow row = sheet.createRow(0); // 第四步,创建单元格,并设置值表头 设置表头居中 HSSFCellStyle style = wb.createCellStyle(); // 水平居中 style.setAlignment(HorizontalAlignment.CENTER); // 垂直居中 // style.setVerticalAlignment(VerticalAlignment.CENTER); // 声明列对象 HSSFCell cell = null; // 创建标题 for (int i = 0; i < title.length; i++) { cell = row.createCell(i); cell.setCellValue(title[i]); cell.setCellStyle(style); } // 创建内容 for (int i = 0; i < values.length; i++) { row = sheet.createRow(i + 1); for (int j = 0; j < values[i].length; j++) { // 将内容按顺序赋给对应的列对象 row.createCell(j).setCellValue(values[i][j]); } } return wb; } }
关于poi3.17居中的问题
用到poi居中的3.6版本写法都是这样的:
HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 居中
然后设置到cell中就不多说啦
这样是不行的
poi3.17正确的写法:
//水平居中 cellStyle.setAlignment(HorizontalAlignment.CENTER); //垂直居中 cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
后面略..
controller(模拟数据):
package com.resafety.port.controller; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.resafety.util.ExcelUtil; @Controller @RequestMapping("/excel") public class ExcelController { @RequestMapping(value = "/export") @ResponseBody public void export2(HttpServletRequest request, HttpServletResponse response) throws Exception { // 模拟获取数据 List<Map<String, String>> list = tempData(); // excel标题 String[] title = { "序号", "线路", "年份", "年日均满载率(%)" }; // 内容 String[][] content = new String[list.size()][title.length]; // excel文件名 String fileName = "线路客流满载率.xls"; // sheet名 String sheetName = "线路客流满载率"; for (int i = 0; i < list.size(); i++) { Map<String, String> obj = list.get(i); content[i][0] = obj.get("index"); content[i][1] = obj.get("road"); content[i][2] = obj.get("year"); content[i][3] = obj.get("bfb"); } // 创建HSSFWorkbook HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null); // 响应到客户端 try { this.setResponseHeader(response, fileName); OutputStream os = response.getOutputStream(); wb.write(os); os.flush(); os.close(); } catch (Exception e) { e.printStackTrace(); } } // 发送响应流方法 private void setResponseHeader(HttpServletResponse response, String fileName) { try { try { fileName = new String(fileName.getBytes(), "ISO8859-1"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } response.setContentType("application/octet-stream;charset=ISO8859-1"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.addHeader("Pargam", "no-cache"); response.addHeader("Cache-Control", "no-cache"); } catch (Exception ex) { ex.printStackTrace(); } } private List<Map<String, String>> tempData() { List<Map<String, String>> temp = new ArrayList<Map<String, String>>(); int year = 2015; int bfb = 98; for (int i = 1; i <= 6; i++) { Map<String, String> tempMap = new HashMap<String, String>(); year++; bfb = bfb - ((int) (Math.random() * (5 - 1) + 1)); tempMap.put("index", i + ""); tempMap.put("road", "线路" + i); tempMap.put("year", year + "年"); tempMap.put("bfb", bfb + "%"); } return temp; } }
前端使用:
$(".Excel").click(function() { window.location.href = basePath + "/excel/export"; });
结语:
Excel工具类供参考,可以自己拓展~~~~
码云地址:https://gitee.com/xieh-gitee/SpringBootExcleQRcode
标签:Java,HSSFWorkbook,org,Excel,导出,poi,apache,import 来源: https://www.cnblogs.com/xiejn/p/14111219.html