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

Java通用的Excel文件生成工具类,支持生成文件和浏览器直接下载(未测试)

2016-07-22 01:39 781 查看
java通用的Excel文件创建方法,支持同文件多tab页创建。只需要调用静态方法,传递List<String>表头和List<Map>数据集合等,即可生成Excel文件。
package com.matols.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletResponse;

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 com.google.common.collect.Lists;

/**
* Excel工具类
*/
public class ExcelUtils {
public static void main(String[] args) throws Throwable {
String path = "D:/tj/统计报表.xls";
//表头
List<String> headers = Lists.newArrayList();
for (int i = 1; i < 10; i++) {
headers.add("表头"+i);
}
//数据行
List<Map> datas = new ArrayList<Map>();
Map m = null;
for(int i=1;i<10;i++){
m = new HashMap(); //一行数据集
for(int j=0;j<headers.size();j++){
m.put(j, "第"+i+" 行数据:"+j);

4000
}
datas.add(m);
}
ExpExs(path,"","统计报表",headers,datas);
}

/*
* 通用的Excel文件创建方法
*   title:首行标题: 2015年度统计报表
*  sheets:sheet的tab标签页说明: 15年度报表
* headers:表头:List存放表头  编号、姓名、备注
*   datas:数据行:list存放实体数据,map存放具体每一行数据,和headers对应。
*      rs:HttpServletResponse响应作用域,如果不为null,会直接将文件流输出到客户端,下载文件
*/
public static void ExpExs(String title,String sheets,List headers,List<Map> datas,HttpServletResponse rs){
try {
if(sheets== null || "".equals(sheets)){ sheets = "sheet"; }

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(sheets); //+workbook.getNumberOfSheets()

HSSFRow row;
HSSFCell cell;

// 设置这些样式
HSSFFont font = workbook.createFont();
font.setFontName(HSSFFont.FONT_ARIAL);//字体
font.setFontHeightInPoints((short) 16);//字号
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗
//font.setColor(HSSFColor.BLUE.index);//颜色

HSSFCellStyle cellStyle= workbook.createCellStyle(); //设置单元格样式
cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER );
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellStyle.setFont(font);

//产生表格标题行
row = sheet.createRow(0);
row.setHeightInPoints(20);
for (int i = 0; i < headers.size(); i++) {
HSSFRichTextString text = new HSSFRichTextString(headers.get(i).toString());
cell = row.createCell(i);
cell.setCellValue(text);
cell.setCellStyle(cellStyle);
}

cellStyle= workbook.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellStyle.setDataFormat((short)0x31);//设置显示格式,避免点击后变成科学计数法了
//cellStyle.setWrapText(true);//设置自动换行
Map map;
//遍历集合数据,产生数据行
for (int i=0; i <datas.size(); i++) {
row=sheet.createRow((i+1));
row.setHeightInPoints(20);
map = datas.get(i);

for(int j=0;j<map.size();j++) {
cell = row.createCell(j);
cell.setCellStyle(cellStyle);

cell.setCellType(HSSFCell.CELL_TYPE_STRING);
if(map.get(j) != null) {
cell.setCellValue(new HSSFRichTextString(map.get(j).toString()));
}else{
cell.setCellValue(new HSSFRichTextString(""));
}
}
}

for (int i = 0; i < headers.size(); i++) {
sheet.autoSizeColumn((short)i);
}

rs.reset();
rs.setContentType("multipart/form-data"); //自动识别
rs.setHeader("Content-Disposition","attachment;filename=data.xls");
//文件流输出到rs里
workbook.write(rs.getOutputStream());
rs.getOutputStream().flush();
rs.getOutputStream().close();
} catch (Exception e) {
System.out.println("#Error ["+e.getMessage()+"] ");
}
System.out.println("["+sheets+"] 创建成功...");
System.out.println("");
}

/*
* 通用的Excel文件创建方法
*    path:保存路径: C:/xls/统计报表.xls
*   title:首行标题: 2015年度统计报表
*  sheets:sheet的tab标签页说明: 15年度报表
* headers:表头:List存放表头  编号、姓名、备注
*   datas:数据行:list存放实体数据,map存放具体每一行数据,和headers对应。
*/
public static void ExpExs(String path,String title,String sheets,List headers,List<Map> datas){
try {
if(sheets== null || "".equals(sheets)){ sheets = "sheet"; }

boolean isExist = new File(path).exists();
if(!isExist){
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(sheets);

FileOutputStream out = new FileOutputStream(new File(path));
workbook.write(out);
out.flush();
out.close();
}
FileInputStream file = new FileInputStream(new File(path));
HSSFWorkbook workbook = new HSSFWorkbook(file);

HSSFSheet sheet = null;
if(!isExist){
sheet = workbook.getSheetAt(0);
}else{
if(workbook.getSheet(sheets) == null){
sheet = workbook.createSheet(sheets); //+workbook.getNumberOfSheets()
}else{
System.out.println("文件:["+path+"] ["+sheets+"] 已经存在...");
System.out.println("");
return;
}
}
HSSFRow row;
HSSFCell cell;

// 设置这些样式
HSSFFont font = workbook.createFont();
font.setFontName(HSSFFont.FONT_ARIAL);//字体
font.setFontHeightInPoints((short) 16);//字号
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗
//font.setColor(HSSFColor.BLUE.index);//颜色

HSSFCellStyle cellStyle= workbook.createCellStyle(); //设置单元格样式
cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER );
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellStyle.setFont(font);

//产生表格标题行
row = sheet.createRow(0);
row.setHeightInPoints(20);
for (int i = 0; i < headers.size(); i++) {
HSSFRichTextString text = new HSSFRichTextString(headers.get(i).toString());
cell = row.createCell(i);
cell.setCellValue(text);
cell.setCellStyle(cellStyle);
}

cellStyle= workbook.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
cellStyle.setDataFormat((short)0x31);//设置显示格式,避免点击后变成科学计数法了
//cellStyle.setWrapText(true);//设置自动换行
Map map;
//遍历集合数据,产生数据行
for (int i=0; i <datas.size(); i++) {
row=sheet.createRow((i+1));
row.setHeightInPoints(20);
map = datas.get(i);

for(int j=0;j<map.size();j++) {
cell = row.createCell(j);
cell.setCellStyle(cellStyle);

cell.setCellType(HSSFCell.CELL_TYPE_STRING);
if(map.get(j) != null) {
cell.setCellValue(new HSSFRichTextString(map.get(j).toString()));
}else{
cell.setCellValue(new HSSFRichTextString(""));
}
}
}

for (int i = 0; i < headers.size(); i++) {
sheet.autoSizeColumn((short)i);
}

FileOutputStream out = new FileOutputStream(new File(path));
workbook.write(out);
out.flush();
out.close();

/*
HSSFRow row = sheet.createRow(sheets);
HSSFCell cell = null;
cell=row.createCell(sheets);
cell.setCellValue(new HSSFRichTextString("-["+sheets+"]-"));
sheets=sheets+2;//中间空一行
row=sheet.createRow(sheets);
*/

} catch (Exception e) {
System.out.println("#Error ["+e.getMessage()+"] ");
}
System.out.println("文件:["+path+"] ["+sheets+"] 创建成功...");
System.out.println("");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: