基于POI的导出Excel工具类(网上一堆,表示导出的效率很差,本文支持自定义导出)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20086125/article/details/78770337

  前段时间要做一个高效的excel导出,因为是工具类,所以查阅了一些资料,还不错,就是效率差,导入万把以上就要等,所以,借鉴网上的资料,自己写一下方法,具体如下:

  具体思路借鉴了:参考:http://blog.csdn.net/jerehedu/article/details/45195359

  在此基础上去掉样式,重写方法:

         /**
* @Description: 导出excel文件的入口
* @author 
* @param <T>
* @date 2017年4月18日 下午8:13:18
* @param response
*            请求
* @param fileName
*            文件名
* @param excelHeader
*            excel表头数组,存放"姓名#name"格式字符串,"姓名"为excel标题行, "name"为对象字段名
* @param dataList
*            数据集合,需与表头数组中的字段名一致,并且符合javabean规范
* @return 返回一个HSSFWorkbook
* @throws Exception
*/
public static <T> void export(HttpServletResponse response,
HttpServletRequest request, String fileName, String[] excelHeader,
List<T> dataList) throws Exception {

// 创建一个Workbook,对应一个Excel文件
Workbook wb = writeExcel(dataList, excelHeader);
BufferedInputStream bis=null;
BufferedOutputStream bos=null;
try {


ByteArrayOutputStream os = new ByteArrayOutputStream();
wb.write(os);
byte[] content = os.toByteArray();
InputStream is = new ByteArrayInputStream(content);
// 处理浏览器的兼容性乱码问题
fileName = handleFileName(request,
fileName + "_" + DateUtil.getNowDateminStr() + ".xls");// 文件名加入时间戳


// 设置response参数,可以打开下载页面
response.reset();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="
+ fileName);


ServletOutputStream out = response.getOutputStream();
bis = new BufferedInputStream(is);
bos = new BufferedOutputStream(out);


byte[] buff = new byte[2048];
int bytesRead;
// Simple read/write loop.
while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
} catch (Exception e) {
throw new BusinessException("导出异常", e);
} finally {
if (bis != null)
bis.close();
if (bos != null)
bos.close();
// 操作完成时,关闭对象,释放占用的内存空间
wb.close();
}
}



/**

* @Description: 将数据写入excel
* @author
* @param exportList
* @param items
* @return
* @throws Exception
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static <T> Workbook writeExcel(List<T> exportList, String[] items)
throws Exception {
int iExportNum = 0, j = 0, k = 1;
Workbook book = new HSSFWorkbook();
Sheet sheet = null;
Cell cell = null;
// 在workbook中添加一个sheet,对应Excel文件中的sheet
// Sheet sheet = book.createSheet("第" + (j + 1) + "页");
if (exportList != null && exportList.size() != 0) {
Row dataRow = null;// 数据行
Object object = null;
object = exportList.get(iExportNum);
Class clazz = object.getClass();
String[] item_names = new String[items.length];
Method[] methods = new Method[items.length];
for (int m = 0; m < items.length; m++) {
if (!"".equals(items[m])) {
item_names[m] = items[m].split("#")[1].trim();
methods[m] = clazz.getMethod("get"
+ item_names[m].substring(0, 1).toUpperCase()
+ item_names[m].substring(1));
}
}
for (iExportNum = 0; iExportNum < exportList.size(); iExportNum++) {
// 判断,当数据行数大于10000行的时候新建一个sheet
if (iExportNum / 10000 == j) {
j++;
k = 1;
// 生成名为“第一页”的工作表,参数0表示这是第一页
sheet = book.createSheet("第" + j + "页");
// EXCLE 表头
Row headRow = sheet.createRow(0);
for (int i = 0; i < items.length; i++) {
cell = headRow.createCell(i);
// cell.setCellStyle(headStyle);
cell.setCellValue(items[i].split("#")[0]);
}
}
dataRow = sheet.createRow(k);
k++;
object = exportList.get(iExportNum);
for (int m = 0; m < items.length; m++) {
cell = dataRow.createCell(m);
cell.setCellValue(String
.valueOf(methods[m].invoke(object) == null ? ""
: methods[m].invoke(object)));
}
}
}
return book;
}


/**
* @Description: 解决设置名称时的乱码
* @author 
* @date 2017年6月3日 下午2:26:07
* @param request
* @param fileNames
* @return
*/
public static String handleFileName(HttpServletRequest request,
String fileNames) {
String codedfilename = null;
try {
String agent = request.getHeader("USER-AGENT");
if (null != agent && -1 != agent.indexOf("MSIE") || null != agent
&& -1 != agent.indexOf("Trident")) {// ie
String name = java.net.URLEncoder.encode(fileNames, "UTF8");
codedfilename = name;
} else if (null != agent && -1 != agent.indexOf("Mozilla")) {// 火狐,chrome等
codedfilename = new String(fileNames.getBytes("UTF-8"),
"iso-8859-1");
}
} catch (Exception e) {
e.printStackTrace();
}
return codedfilename;
}


猜你喜欢

转载自blog.csdn.net/qq_20086125/article/details/78770337