您的位置:首页 > 编程语言 > Java开发

一个程序猿成长记:Java导出Excel文件(弹出下载框)

2017-07-18 15:26 477 查看
一、HSSFWorkbook导出Excel文件(xls格式。适用于一般数据量少文件)

1.0 用到的JAR包

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
</dependency>

<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.3.0</version>
</dependency>

<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>

1.1、action类

/**
* 测试导出Excel文件
* @throws Exception
*/
public void test() throws Exception{
String sheetName = "导出Excel";
String fileName = "测试导出账单.xls";
String[] title = new String[]{"星期一","星期二","星期三","星期四","星期五","星期六","星期日"}; // 显示列
String[][] values=null;
List<String> list=new ArrayList<>();//list自定义
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");

values=new String[list.size()][];
for(int i=0;i<values.length;i++){
values[i] = new String[title.length];
values[i][0] = list.get(i);
values[i][1] = list.get(i);
values[i][2] = list.get(i);
values[i][3] = list.get(i);
values[i][4] = list.get(i);
values[i][5] = list.get(i);
values[i][6] = list.get(i);
}
// 导出xls格式
HSSFWorkbook workbook =Util.getHssFWorkbook(sheetName, title, values);
               // 导出xlsx格式
SXSSFWorkbook workbook =Util.getSXSSFWorkbook(sheetName, title, values);
// 网页端弹出下载框,将文件保存到指定位置
try {
this.setResponseHeader(response,fileName);
OutputStream os=response.getOutputStream();
workbook.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}

1.2.1、HSSFWorkbook工具类(导出xls格式文件)

HSSFWorkboook对象,最多支持65535行,[b]适用于一般数据量少导出。
[/b]

/**
* 导出Excel(xls)工具类
* @param sheetName
* @param title
* @param values
* @param workbook
* @return
* @throws ParseException
*/
public static HSSFWorkbook getHssFWorkbook(String sheetName,String[] title,String[][] values) throws ParseException{
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
HSSFWorkbook workbook = new HSSFWorkbook();

// 创建一个sheet
HSSFSheet sheet = workbook.createSheet(sheetName);
// 添加表头
HSSFRow row = sheet.createRow(0);

// 单元格样式
HSSFCellStyle style = workbook.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);
if(i==title.length-1){
sheet.setDefaultColumnWidth(20);
}
}

// 创建内容
if(values !=null && values.length>0){
for(int j=0;j<values.length;j++){
row = sheet.createRow(j+1);
for(int k=0;k<values[j].length;k++){
cell = row.createCell(k);
//	    			if(k == values[j].length-1){
//	    				cell.setCellValue(format.format(format.parse(values[j][k])));
//	    			}else{
if(k == 0){
cell.setCellValue(Long.parseLong(values[j][k]));
}else{
if(numType(values[j][k])){
cell.setCellValue(Double.parseDouble(values[j][k]));
}else{
cell.setCellValue(values[j][k]);
}
}
//	    			}
cell.setCellStyle(style);
}
}
}
return workbook;
}


1.2.2 SXSSFWorkbook工具类(导出xlsx格式文件。适用于数据量大的文件导出)

SXSSFWorkbook对象,只支持xlsl格式.它就是用来解决大数据量以及超大数据量的导入导出操作的,单个sheet表就支持近104万条数据了.要是导出104万以上的数据,这时我们必须拆分到多个工作表来实现

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
/**
* 导出xlsx格式数据(支持导出百万级数据)
* @param sheetName
* @param title
* @param values
* @return
*/
public static SXSSFWorkbook getSXSSFWorkbook(String sheetName,String[] title,String[][] values){
// 内存中只创建100个临时对象,超过100个将释放不用对象
SXSSFWorkbook wb =new SXSSFWorkbook(100);
// 工作表对象
Sheet sheet =null;
// 行对象
Row row = null;
// 列对象
Cell cell = null;
int rowNo = 0;
int pageRowNo = 0;
// 表单样式风格
CellStyle style = wb.createCellStyle();
style.setAlignment(CellStyle.ALIGN_CENTER);
if(values !=null && values.length>0){
for(int j=0;j<values.length;j++){
// 超过一百万行后换一个工作簿,单个sheet最多1048576行
if(rowNo%1000000 == 0){
sheet = wb.createSheet("这是我的第"+(rowNo/1000000 +1)+"个工作簿");
sheet = wb.getSheetAt(rowNo/1000000);
pageRowNo = 0;
}
rowNo++;
// 创建标题
if(pageRowNo == 0){
row = sheet.createRow(0);
for(int i=0;i<title.length;i++){
cell = row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
if(i==title.length-1){
sheet.setDefaultColumnWidth(20);
}
}
}else{
// 创建行
row = sheet.createRow(pageRowNo);
for(int k=0;k<values[j].length;k++){
// 创建列
cell = row.createCell(k);
if(k == 0){
// 对列进行赋值
cell.setCellValue(Long.parseLong(values[j][k]));
}else{
if(numType(values[j][k])){
cell.setCellValue(Double.parseDouble(values[j][k]));
}else{
cell.setCellValue(String.valueOf(values[j][k]));
}
}
cell.setCellStyle(style);
}
}
pageRowNo++;
}
}
return wb;
}


1.3、设置返回浏览器头文件信息

private void setResponseHeader(HttpServletResponse response2, String fileName) {
try {
try {
fileName = new String(fileName.getBytes(),"ISO8859-1");
} catch (UnsupportedEncodingException e) {
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 e) {
e.printStackTrace();
}

}
1.4、测试成功

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: