POI Excel导出工具类-适配office2003及2007

package com.izhonghong.ubc.dms.article.utils;

/**
* @Auther: CLH
* @Date: 2020/6/19 16:18
* @Description:继承自导出工具类
*/

import java.util.Collection;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

/**
* 供网页端点击按钮,自动生成并下载Excel表
*
* @param <_T_>
*/
@Component
@Transactional
public class ExportExcelWrapper extends ExportExcelUtil {

/**
* 导出带有头部标题行的Excel
* 时间格式默认:yyyy-MM-dd hh:mm:ss
*
* @param fileName 生成的Excel文件名字(不要加后缀)
* @param title 表格标题
* @param headers 头部标题集合
* @param dataset 数据集合
* @param response
* @param version 2003 或者 2007,不传时默认生成2003版本
*/
public void exportExcel(String fileName, String title, String[] headers, Collection dataset, HttpServletResponse response, String version) {
try {
response.setContentType(“application/vnd.ms-excel”);
String suffix = null;
if (StringUtils.isBlank(version) || EXCEL_FILE_2003.equals(version.trim())) {
suffix = “.xls”;
} else {
suffix = “.xlsx”;
}
response.addHeader(“Content-Disposition”, “attachment;filename=” + fileName + suffix);
Workbook workbook = null;
if (StringUtils.isBlank(version) || EXCEL_FILE_2003.equals(version.trim())) {
workbook = new HSSFWorkbook();
} else {
workbook = new XSSFWorkbook();
}
exportExcel(workbook, title, headers, dataset, response.getOutputStream(), “yyyy-MM-dd HH:mm:ss”);
} catch (Exception e) {
e.printStackTrace();
}
}

}

//导出工具类

package com.izhonghong.ubc.dms.article.utils;

/**
* @Auther: CLH
* @Date: 2020/6/19 16:15
* @Description: 导出工具类
*/

import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExportExcelUtil {

// 2007 版本以上 最大支持1048576行
public final static String EXCEl_FILE_2007 = “2007”;
// 2003 版本 最大支持65536 行
public final static String EXCEL_FILE_2003 = “2003”;

/**
* 通过版本类判断是
*
* @param sheetName 表格标题名
* @param headers 表格头部标题集合
* @param dataset 数据集合
* @param out 输出流
* @param version 指定生成Excel文件的版本
*/
public void exportExcel(String sheetName, String[] headers, Collection dataset, OutputStream out, String version) {
Workbook workbook = null;
if (StringUtils.isBlank(version) || EXCEL_FILE_2003.equals(version.trim())) {
workbook = new HSSFWorkbook();
} else {
workbook = new XSSFWorkbook();
}
exportExcel(workbook, sheetName, headers, dataset, out, “yyyy-MM-dd HH:mm:ss”);
}

/**
* 通用Excel导出方法,利用反射机制遍历对象的所有字段,将数据写入Excel文件中

* 此版本生成2007以上版本的文件 (文件后缀:xlsx)
*
* @param sheetName 表格标题名
* @param headers 表格头部标题集合
* @param dataset 需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
* JavaBean属性的数据类型有基本数据类型及String,Date
* @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
* @param pattern 如果有时间数据,设定输出格式。默认为”yyyy-MM-dd hh:mm:ss”
*/
public void exportExcel(Workbook workbook, String sheetName, String[] headers, Collection dataset, OutputStream out, String pattern) {
// 生成一个表格
Sheet sheet = workbook.createSheet(sheetName);
// 设置表格默认列宽度为15个字节
//设置宽度
//sheet.setDefaultColumnWidth(20);
sheet.setDefaultColumnWidth(18);
//sheet.trackAllColumnsForAutoSizing();
// sheet.autoSizeColumn(0);
// 生成一个样式
CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);//内容居中
// 生成一个字体
Font font = workbook.createFont();
font.setFontName(“宋体”);
font.setBold(true);//加粗
font.setFontHeightInPoints((short) 11);
// 把字体应用到当前的样式
style.setFont(font);
// 生成并设置另一个样式
CellStyle style2 = workbook.createCellStyle();
style2.setAlignment(HorizontalAlignment.CENTER);
// 生成另一个字体
Font font2 = workbook.createFont();
// font2.setBold(true);//加粗
// 把字体应用到当前的样式
style2.setFont(font2);
// 产生表格标题行
Row row = sheet.createRow(0);
Cell cellHeader;
for (int i = 0; i < headers.length; i++) {
cellHeader = row.createCell(i);
cellHeader.setCellStyle(style);
cellHeader.setCellValue(headers[i]);
}

// 遍历集合数据,产生数据行
Iterator it = dataset.iterator();
int index = 0;
T t;
Field[] fields;
Field field;
//HSSFRichTextString richString;
Pattern p = Pattern.compile(“^//d+(//.//d+)?$”);
Matcher matcher;
String fieldName;
String getMethodName;
Cell cell;
Class tCls;
Method getMethod;
Object value;
String textValue;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
t = (T) it.next();
// 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值
fields = t.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
cell = row.createCell(i);
cell.setCellStyle(style2);
field = fields[i];
fieldName = field.getName();
getMethodName = “get” + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
tCls = t.getClass();
getMethod = tCls.getMethod(getMethodName, new Class[]{});
value = getMethod.invoke(t, new Object[]{});
// 判断值的类型后进行强制类型转换
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(textValue);
}
}
} 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();
}
}
}
try {
workbook.write(out);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
//关闭资源
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//调用方式

// 多条件查询,用一个方法即可,根据条件拼sql
List articleList=new ArrayList();
if(paramMap.get(“ids”) !=null && paramMap.get(“ids”) !=”” && paramMap.get(“ids”) !=” “) {
List list=new ArrayList();
String ids=String.valueOf(paramMap.get(“ids”));
list=Arrays.asList(ids.split(“,”));
paramMap.put(“list”, list);
articleList = imyservice.articleExp(paramMap);
}else {
articleList = imyservice.adminIndexExcel(paramMap);
}
//设置headers
List header = new ArrayList();
header.add(“标题”);
header.add(“作者”);
header.add(“发布时间”);
header.add(“发现时间”);
header.add(“来源”);
header.add(“信息渠道”);
header.add(“下发状态”);
header.add(“链接”);
String[] headers = header.toArray(new String[header.size()]);
String fileName = “舆情列表”; // 文件的默认保存名
fileName = this.urlEncoder(req, fileName);
excelUtil.exportExcel(fileName,”舆情列表”,headers,articleList,reqs,ExportExcelUtil.EXCEL_FILE_2003);
//注意事项 fileName需根据不同浏览器设置编码格式,否则会导出失败
protected String urlEncoder(HttpServletRequest request, String text) throws UnsupportedEncodingException {
if (request.getHeader(“User-Agent”).toUpperCase().indexOf(“MSIE”) > 0)
text = URLEncoder.encode(text, “UTF-8”);// IE浏览器
else
// text = new String(text.getBytes(“UTF-8”), “ISO8859-1”);
//poi导出谷歌浏览器需要设置编码格式
text = new String(text.getBytes(“UTF-8”), “ISO-8859-1”);
return text;
}import fileDownload from ‘js-file-download’

axios.post(postUrl, params, {responseType: ‘arraybuffer’}).then(res => {
fileDownload(res.data, ‘xxx.xls’)
})
————————————————
版权声明:本文为CSDN博主「艾欢欢」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/AiHuanhuan110/java/article/details/101767967

问题补充,当前端为vue,有时会自动识别文件,强制更改后缀名为xlsx
更换下载方法为

import fileDownload from ‘js-file-download’

axios.post(postUrl, params, {responseType: ‘arraybuffer’}).then(res => {
fileDownload(res.data, ‘xxx.xls’)
})

npm需安装

npm install js-file-download —save

npm install —save element-china-area-data