Java通用的Excel文件生成工具類,支持生成文件和瀏覽器直接下載
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); } 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("");
}
}</pre>