今天给大家分享的是JAVA如何导出EXCEL表格,因为最近有做这样一个功能,所以分享出来,如有不对之处,敬请指正。
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
现在用的比较多的都是用POI技术来导出或者导入Excel,所以我们就用POI吧,用POI导出Excel我们首先要下载所需的jar包然后导入到我们的项目中,用maven的同学只需找到相关
依赖加入到pom.xml里面即可。
1. 下载jar包:
官方下载:http://poi.apache.org/download.html这里可以下载到它的最新版本和文档,目前最新版本是3.7,这里使用比较稳定的3.6版。
百度网盘下载:https://pan.baidu.com/s/1mjhoaWK 密码:pkur
2. 将jar包加入到项目中:
将下载好的jar包加入到WEBINFO目录下的lib文件夹中,Eclipse用户选中jar包然后右击选择Build Path选项, Idea用户选中jar包然后右击选择Add as Library选项即可。
如果是用maven的可自行到maven中央仓库搜索poi然后选择对应的版本即可,也可以直接将下面代码复制到pom.xml。
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
</dependency>
小提示:用maven引入依赖jar包的可能会遇到包引用不到的bug,但是maven依赖确实已经引入了,而且没有任何报错,但是只要一引用 org.apache.poi.hssf.usermodel下面的类就会报错,报错内容为:Caused by: java.lang.NoClassDefFoundError: org/apache/poi/hssf/usermodel/HSSFWorkbook。
3. Jakarta POI HSSF API组件:
HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,有以下几种常用的对象:
常用组件:
HSSFWorkbook excel的文档对象
HSSFSheet excel的表单
HSSFRow excel的行
HSSFCell excel的格子单元
HSSFFont excel字体
样式:
HSSFCellStyle cell样式
4.基本操作步骤:
首先,我们应该要知道的是,一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成。那么我们用poi要导出一个Excel表格
的正确顺序应该是:
1、用HSSFWorkbook打开或者创建“Excel文件对象”
2、用HSSFWorkbook对象返回或者创建Sheet对象
3、用Sheet对象返回行对象,用行对象得到Cell对象
4、对Cell对象读写。
5、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面
5. 导出Excel工具类:
package com.yung.ppapi.util;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
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.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* 导出Excel
* @author lisheng4
*
* HSSFWorkbook、XSSFWorkbook、SXSSFWorkbook的区别:
* ◎HSSFWorkbook一般用于Excel2003版及更早版本(扩展名为.xls)的导出。
* ◎XSSFWorkbook一般用于Excel2007版(扩展名为.xlsx)的导出。
* ◎SXSSFWorkbook(POI3.8版本)一般用于大数据量的导出。
* 注:HSSFWorkbook的Excel Sheet导出条数上限(<=2003版)是65535行、256列,
* XSSFWorkbook的Excel Sheet导出条数上限(>=2007版)是1048576行,16384列,
* 如果数据量超过了此上限,那么可以使用SXSSFWorkbook来导出。实际上上万条数据, 甚至上千条数据就可以考虑使用SXSSFWorkbook了。
*
*/
public class ExcelUtil{
// 2003 版本 最大支持65536 行
public final static String EXCEL_FILE_2003 = "2003";
// 2007 版本以上 最大支持1048576行
public final static String EXCEl_FILE_2007 = "2007";
// 2007 版本以上 大数据量导出
public final static String EXCEl_FILE_2007_SXSSF = "2007_SXSSF";
/**
* <p>
* 导出无头部标题行Excel <br>
* 时间格式默认:yyyy-MM-dd hh:mm:ss <br>
* </p>
*
* @param title 表格标题
* @param headersField 表格字段集合
* @param dataList 数据集合
* @param out 输出流
* @param version 2003 或者 2007,不传时默认生成2003版本
* @throws IOException
*/
public static void exportExcel(String title, String[] headersField, List<Map<String, Object>> dataList, OutputStream out,
String version) throws IOException {
if (StringUtils.isEmpty(version) || EXCEL_FILE_2003.equals(version.trim())) {
exportExcel2003(title, null, headersField, dataList, out, "yyyy-MM-dd HH:mm:ss");
} else if(EXCEl_FILE_2007_SXSSF.equals(version.trim())) {
exportExcel2007WithSXSSF(title, null, headersField, dataList, out, "yyyy-MM-dd HH:mm:ss");
} else {
exportExcel2007(title, null, headersField, dataList, out, "yyyy-MM-dd HH:mm:ss");
}
}
/**
* <p>
* 导出带有头部标题行的Excel <br>
* 时间格式默认:yyyy-MM-dd hh:mm:ss <br>
* </p>
*
* @param title 表格标题
* @param headers 头部标题集合
* @param headersField 表格头部标题对应的字段集合
* @param dataList 数据集合
* @param out 输出流
* @param version 2003 或者 2007,不传时默认生成2003版本
* @throws IOException
*/
public static void exportExcel(String title, String[] headers, String[] headersField, List<Map<String, Object>> dataList,
OutputStream out, String version) throws IOException {
if (StringUtils.isBlank(version) || EXCEL_FILE_2003.equals(version.trim())) {
exportExcel2003(title, headers, headersField, dataList, out, "yyyy-MM-dd HH:mm:ss");
} else if(EXCEl_FILE_2007_SXSSF.equals(version.trim())) {
exportExcel2007WithSXSSF(title, headers, headersField, dataList, out, "yyyy-MM-dd HH:mm:ss");
} else {
exportExcel2007(title, headers, headersField, dataList, out, "yyyy-MM-dd HH:mm:ss");
}
}
/**
* <p>
* 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>
* 此版本生成2007以上版本的文件 (文件后缀:xlsx)
* </p>
*
* @param title
* 表格标题名
* @param headers
* 表格头部标题集合
* @param headersField
* 表格头部标题对应的字段集合
* @param dataList
* 需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
* JavaBean属性的数据类型有基本数据类型及String,Date
* @param out
* 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param pattern
* 如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
* @throws IOException
*/
public static void exportExcel2007WithSXSSF(String title, String[] headers, String[] headersField,
List<Map<String, Object>> dataList, OutputStream out, String pattern) throws IOException {
SXSSFWorkbook workbook = null;
try {
// 声明一个工作薄
workbook = new SXSSFWorkbook();
// 生成一个表格
Sheet sheet = workbook.createSheet(title);
sheet.setDefaultColumnWidth(20);
// 生成一个样式
CellStyle headerStyle = workbook.createCellStyle();
headerStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
headerStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
headerStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
headerStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
headerStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
headerStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
headerStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
// 生成一个字体
Font font = workbook.createFont();
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setFontHeightInPoints((short) 11);
headerStyle.setFont(font);
// 生成并设置另一个样式
CellStyle dataStyle = workbook.createCellStyle();
dataStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
dataStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
dataStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
dataStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
dataStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
dataStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
dataStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
// 生成另一个字体
Font font2 = workbook.createFont();
font2.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
dataStyle.setFont(font2);
// 产生表格标题行
Row row = sheet.createRow(0);
Cell cellHeader;
for (int i = 0; i < headers.length; i++) {
cellHeader = row.createCell(i);
cellHeader.setCellStyle(dataStyle);
cellHeader.setCellValue(headers[i]);
}
// 遍历集合数据,产生数据行
Iterator<Map<String, Object>> it = dataList.iterator();
Map<String, Object> map;
int index = 0;
Object value;
String textValue;
Cell cell;
Matcher matcher;
Pattern p = Pattern.compile("^//d+(//.//d+)?$");
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
map = (Map<String,Object>) it.next();
for (int n = 0; n < headersField.length; n++) {
cell = row.createCell(n);
cell.setCellStyle(dataStyle);
value = map.get(headersField[n]);
// 判断值的类型后进行强制类型转换
textValue = null;
if (value instanceof Integer) {
cell.setCellValue((Integer) value);
} else if (value instanceof Float) {
textValue = String.valueOf((Float) value);
cell.setCellValue(textValue);
} else if (value instanceof Double) {
textValue = String.valueOf((Double) value);
cell.setCellValue(textValue);
} else if (value instanceof Long) {
cell.setCellValue((Long) value);
}
if (value instanceof Boolean) {
textValue = "是";
if (!(Boolean) value) {
textValue = "否";
}
} else if (value instanceof Date) {
textValue = sdf.format((Date) value);
} else {
// 其它数据类型都当作字符串简单处理
if (value != null) {
textValue = value.toString();
}
}
if (textValue != null) {
matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
cell.setCellValue(textValue);
}
}
}
}
workbook.write(out);
out.flush();
} catch (IOException e) {
e.printStackTrace();
throw e;
}finally {
if(workbook != null) {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* <p>
* 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>
* 此版本生成2007以上版本的文件 (文件后缀:xlsx)
* </p>
*
* @param title
* 表格标题名
* @param headers
* 表格头部标题集合
* @param headersField
* 表格头部标题对应的字段集合
* @param dataList
* 需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
* JavaBean属性的数据类型有基本数据类型及String,Date
* @param out
* 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param pattern
* 如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
* @throws IOException
*/
public static void exportExcel2007(String title, String[] headers, String[] headersField,
List<Map<String, Object>> dataList, OutputStream out, String pattern) throws IOException {
XSSFWorkbook workbook = null;
try {
// 声明一个工作薄
workbook = new XSSFWorkbook();
// 生成一个表格
XSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为20个字节
sheet.setDefaultColumnWidth(20);
// 生成一个样式
XSSFCellStyle headerStyle = workbook.createCellStyle();
// 设置这些样式
headerStyle.setFillForegroundColor(new XSSFColor(java.awt.Color.gray));
headerStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
headerStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
headerStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
headerStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
headerStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
headerStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
XSSFFont font = workbook.createFont();
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setColor(new XSSFColor(java.awt.Color.BLACK));
font.setFontHeightInPoints((short) 11);
// 把字体应用到当前的样式
headerStyle.setFont(font);
// 生成并设置另一个样式
XSSFCellStyle dataStyle = workbook.createCellStyle();
dataStyle.setFillForegroundColor(new XSSFColor(java.awt.Color.WHITE));
dataStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
dataStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
dataStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
dataStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
dataStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
dataStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
dataStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
// 生成另一个字体
XSSFFont font2 = workbook.createFont();
font2.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);
// 把字体应用到当前的样式
dataStyle.setFont(font2);
// 产生表格标题行
XSSFRow row = sheet.createRow(0);
XSSFCell cellHeader;
for (int i = 0; i < headers.length; i++) {
cellHeader = row.createCell(i);
cellHeader.setCellStyle(headerStyle);
cellHeader.setCellValue(new XSSFRichTextString(headers[i]));
}
// 遍历集合数据,产生数据行
Iterator<Map<String, Object>> it = dataList.iterator();
Map<String, Object> map;
int index = 0;
Object value;
String textValue;
XSSFCell cell;
XSSFRichTextString richString;
Matcher matcher;
Pattern p = Pattern.compile("^//d+(//.//d+)?$");
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
map = (Map<String,Object>) it.next();
for (int n = 0; n < headersField.length; n++) {
cell = row.createCell(n);
cell.setCellStyle(dataStyle);
value = map.get(headersField[n]);
// 判断值的类型后进行强制类型转换
textValue = null;
if (value instanceof Integer) {
cell.setCellValue((Integer) value);
} else if (value instanceof Float) {
textValue = String.valueOf((Float) value);
cell.setCellValue(textValue);
} else if (value instanceof Double) {
textValue = String.valueOf((Double) value);
cell.setCellValue(textValue);
} else if (value instanceof Long) {
cell.setCellValue((Long) value);
}
if (value instanceof Boolean) {
textValue = "是";
if (!(Boolean) value) {
textValue = "否";
}
} else if (value instanceof Date) {
textValue = sdf.format((Date) value);
} else {
// 其它数据类型都当作字符串简单处理
if (value != null) {
textValue = value.toString();
}
}
if (textValue != null) {
matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
richString = new XSSFRichTextString(textValue);
cell.setCellValue(richString);
}
}
}
}
workbook.write(out);
out.flush();
} catch (IOException e) {
e.printStackTrace();
throw e;
}finally {
if(workbook != null) {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* <p>
* 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中 <br>
* 此方法生成2003版本的excel,文件名后缀:xls <br>
* </p>
*
* @param title
* 表格标题名
* @param headers
* 表格头部标题集合
* @param headersField
* 表格头部标题对应的字段集合
* @param dataList
* 需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
* JavaBean属性的数据类型有基本数据类型及String,Date
* @param out
* 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param pattern
* 如果有时间数据,设定输出格式。默认为"yyyy-MM-dd hh:mm:ss"
* @throws IOException
*/
public static void exportExcel2003(String title, String[] headers, String[] headersField,
List<Map<String, Object>> dataList, OutputStream out, String pattern) throws IOException {
HSSFWorkbook workbook = null;
try {
// 声明一个工作薄
workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为20个字节
sheet.setDefaultColumnWidth(20);
// 生成一个样式
HSSFCellStyle headerStyle = workbook.createCellStyle();
// 设置这些样式
headerStyle.setFillForegroundColor(HSSFColor.GREY_50_PERCENT.index);
headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
font.setFontName("宋体");
font.setColor(HSSFColor.WHITE.index);
font.setFontHeightInPoints((short) 11);
// 把字体应用到当前的样式
headerStyle.setFont(font);
// 生成并设置另一个样式
HSSFCellStyle dataStyle = workbook.createCellStyle();
dataStyle.setFillForegroundColor(HSSFColor.WHITE.index);
dataStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
dataStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
dataStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
dataStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
dataStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
dataStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
dataStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 生成另一个字体
HSSFFont font2 = workbook.createFont();
font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
// 把字体应用到当前的样式
dataStyle.setFont(font2);
// 产生表格标题行
HSSFRow row = sheet.createRow(0);
HSSFCell cellHeader;
for (int i = 0; i < headers.length; i++) {
cellHeader = row.createCell(i);
cellHeader.setCellStyle(headerStyle);
cellHeader.setCellValue(new HSSFRichTextString(headers[i]));
}
// 遍历集合数据,产生数据行
Iterator<Map<String,Object>> it = dataList.iterator();
Map<String,Object> map;
int index = 0;
Object value;
String textValue;
HSSFCell cell;
HSSFRichTextString richString;
Matcher matcher;
Pattern p = Pattern.compile("^//d+(//.//d+)?$");
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
map = (Map<String,Object>) it.next();
for (int n = 0; n < headersField.length; n++) {
cell = row.createCell(n);
cell.setCellStyle(dataStyle);
value = map.get(headersField[n]);
// 判断值的类型后进行强制类型转换
textValue = null;
if (value instanceof Integer) {
cell.setCellValue((Integer) value);
} else if (value instanceof Float) {
textValue = String.valueOf((Float) value);
cell.setCellValue(textValue);
} else if (value instanceof Double) {
textValue = String.valueOf((Double) value);
cell.setCellValue(textValue);
} else if (value instanceof Long) {
cell.setCellValue((Long) value);
}
if (value instanceof Boolean) {
textValue = "是";
if (!(Boolean) value) {
textValue = "否";
}
} else if (value instanceof Date) {
textValue = sdf.format((Date) value);
} else {
// 其它数据类型都当作字符串简单处理
if (value != null) {
textValue = value.toString();
}
}
if (textValue != null) {
matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
richString = new HSSFRichTextString(textValue);
cell.setCellValue(richString);
}
}
}
}
workbook.write(out);
out.flush();
} catch (IOException e) {
e.printStackTrace();
throw e;
}finally {
if(workbook != null) {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
6、输出前端页面时,流的创建
//将文件存到浏览器设置的下载位置
OutputStream out = response.getOutputStream();//获得输出流
response.reset();// 清空输出流
response.setContentType("application/msexcel");// 定义输出类型
String filename = sheetName + ".xls";
try {
response.setContentType("application/ms-excel;charset=UTF-8");// 定义输出类型 ;charset=UTF-8
response.addHeader("Content-Disposition", "attachment;filename="+
new String(filename.getBytes(“utf-8”), "iso-8859-1"));// 设定输出文件头 new String(filename.getBytes())
workbook.write(out);// 将数据写出去
String str = "导出" + sheetName + "成功!";
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
String str1 = "导出" + sheetName + "失败!";
System.out.println(str1);
} finally {
out.close();
}
参考文章:https://www.cnblogs.com/gudongcheng/p/8268909.html
楼主这么辛苦,请使用楼主的推荐码领取支付宝红包吧,记得一定要消费掉哦。双赢^_^。
1、打开支付宝首页搜索“8282987” 立即领红包。