最近在做一个文史类统计项目,许多地方需要用到导出excel报表。之前用的是公司的poi导出,最后听群友说csv的导出会比poi快很多。但是csv文件是以“,”分割文件的。如果数据中逗号比较多就会导致数据混乱。
①POI导出
1.导入poi依赖或者导入jar包E:\百度\poi-3.9.jar
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
<scope>compile</scope>
</dependency>
2.excel帮助类
package com.yszh.pdf.listdemo;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.util.CellRangeAddress;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.List;
public class ExcelUtil {
/**
* 导出excel,带合并单元格表头
* @param title sheet名称及excel标题名称
* @param rowsName 每列列头名称数组
* @param dataList 数据内容
* @param fileName 文件名
* @param response 输出流
* @throws Exception
*/
public void exportExcel(String title,String[] rowsName,List<Object[]> dataList,String fileName,HttpServletResponse response) throws Exception{
OutputStream output = response.getOutputStream();
response.reset();
response.setHeader("Content-disposition",
"attachment; filename=" + fileName + ".xls");
response.setContentType("application/msexcel");
this.export(title,rowsName,dataList,true,output);
this.close(output);
}
/**
* 导出excel,不带合并单元格表头
* @param title sheet名称及excel标题名称
* @param rowsName 每列列头名称数组
* @param dataList 数据内容
* @param fileName 文件名
* @param response 输出流
* @throws Exception
*/
public void exportExcelNoTitle(String title,String[] rowsName,List<Object[]> dataList,String fileName,HttpServletResponse response) throws Exception{
OutputStream output = response.getOutputStream();
response.reset();
response.setHeader("Content-disposition",
"attachment; filename=" + fileName + ".xls");
response.setContentType("application/msexcel");
this.export(title,rowsName,dataList,false,output);
this.close(output);
}
/**
* 导出excel
* @param title sheet名称及excel标题名称
* @param rowName 每列列头名称数组
* @param dataList 数据内容
* @param tag 是否带表头
* @param out 输出流
* @throws Exception
*/
private void export(String title,String[] rowName,List<Object[]> dataList,boolean tag,OutputStream out) throws Exception {
try {
// 创建工作簿对象
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建工作表
HSSFSheet sheet = workbook.createSheet(title);
// 产生表格标题行
HSSFRow rowm = sheet.createRow(0);
//创建表格标题列
HSSFCell cellTiltle = rowm.createCell(0);
// sheet样式定义; getColumnTopStyle(); getStyle()均为自定义方法 --在下面,可扩展
// 获取列头样式对象
HSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook);
// 获取单元格样式对象
HSSFCellStyle style = this.getStyle(workbook);
//设置居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
int titleNum = 0;
if(tag){
//合并表格标题行,合并列数为列名的长度,第一个0为起始行号,第二个1为终止行号,第三个0为起始列好,第四个参数为终止列号