1. 程式人生 > >java中將資料匯出到Excel

java中將資料匯出到Excel

  //main方法 

package com.example.demo.system.entity;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServlet;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import com.example.demo.system.util.ExcelToolClass;

/**
 *測試匯出資料
 */
@SuppressWarnings("serial")
public class TestExcel extends HttpServlet{
	public static void main(String[] args) throws UnsupportedEncodingException {
        List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("序列", 1);
        map.put("姓名", "張三");
        map.put("年齡", 20);
        map.put("戶籍", "廣東");
        list.add(map);
        list.add(map);
        list.add(map);
        list.add(map);
        list.add(map);
        list.add(map);
         
         
        //System.getProperty("user.dir") 獲取當前專案的路徑
        String fileName=System.getProperty("user.dir")+"\\匯出資料Excel.xls";//定義到處路徑
         
        System.out.println(fileName);
         
         
        String worksheetTitle = "Excel匯出資訊";//sheet名
        String sheetName="資料1";
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet(sheetName);//定義sheet名
        ExcelToolClass exportExcel = new ExcelToolClass(wb,sheet);//呼叫Excel工具類
        fileName = new String(fileName.getBytes("GBK"), "GBK");//修改編碼格式
        //定義第二行標題
        String id = "序列";
        String name = "姓名";
        String age = "年齡";
        String address = "戶籍";
        List<String> l=new ArrayList<String>();
        l.add(id);
        l.add(name);
        l.add(age);
        l.add(address);
             
        // 建立報表頭部
        exportExcel.createNormalHead(worksheetTitle, 3);
        //定義第一行
        exportExcel.createNormalTwoRow(l, 0);
        //匯入資料
        exportExcel.createColumHeader(list);
        //輸出檔案流,把相應的Excel工作簿 輸出到本地
        exportExcel.outputExcel(fileName);
    }
}

 //匯出工具包

package com.example.demo.system.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;

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.Region;

public class ExcelToolClass {

	private HSSFWorkbook wb = null;// 得到Excel工作簿物件
	private HSSFSheet sheet = null;// 得到Excel工作表物件

	public ExcelToolClass(HSSFWorkbook wb, HSSFSheet sheet) {
		this.wb = wb;
		this.sheet = sheet;
	}

	/**
	 * 建立通用的Excel頭
	 *
	 * @param headString
	 *            頭部顯示的字元
	 * @param colSum
	 *            該報表的列數
	 */
	public void createNormalHead(String headString, int colSum) {
		// 設定第一行
		HSSFRow row = sheet.createRow(0);// 建立Excel工作表的行
		HSSFCell cell = row.createCell(0);// 建立Excel工作表指定行的單元格
		row.setHeight((short) 1000);// 設定高度
		// 定義單元格為字串型別
		cell.setCellType(HSSFCell.ENCODING_UTF_16);// 中文處理
		cell.setCellValue(new HSSFRichTextString(headString));

		// 指定合併區域
		sheet.addMergedRegion(new Region(0, (short) 0, 0, (short) colSum));

		// 定義單元格格式,新增單元格表樣式,並新增到工作簿
		HSSFCellStyle cellStyle = wb.createCellStyle();
		// 設定單元格水平對齊型別
		cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊
		cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊
		cellStyle.setWrapText(true);// 指定單元格自動換行
		// 設定單元格字型
		HSSFFont font = wb.createFont();
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		font.setFontName("微軟雅黑");// 字型
		font.setFontHeightInPoints((short) 16);// 設定字型
		cellStyle.setFont(font);
		cell.setCellStyle(cellStyle);
	}

	/**
	 * 建立報表第二行
	 * 
	 * @param params
	 *            統計條件陣列
	 * @param colSum
	 *            需要合併到的列索引
	 *
	 */
	@SuppressWarnings("deprecation")
	public void createNormalTwoRow(List<String> list, int colSum) {
		// 建立第二行
		HSSFRow row1 = sheet.createRow(1);
		row1.setHeight((short) 400);// 設定高度
		HSSFCell cell2 = row1.createCell(0);// 建立Excel工作表指定行的單元格
		cell2.setCellType(HSSFCell.ENCODING_UTF_16);// 中文處理
		// 指定合併區域
		sheet.addMergedRegion(new Region(1, (short) 0, 1, (short) colSum));
		// 定義單元格格式,新增單元格表樣式,並新增到工作簿
		HSSFCellStyle cellStyle = wb.createCellStyle();
		cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊
		cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊
		cellStyle.setWrapText(true);// 指定單元格自動換行

		// 設定單元格字型
		HSSFFont font = wb.createFont();
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		font.setFontName("宋體");// 字型
		font.setFontHeightInPoints((short) 10);// 設定字型
		cellStyle.setFont(font);
		// HSSFCellStyle.ALIGN_CENTER 設定居中
		for (int i = 0; i < list.size(); i++) {
			cteateCell(wb, row1, i, HSSFCellStyle.ALIGN_CENTER, list.get(i), cellStyle);
		}
	}

	/**
	 * 設定報表標題
	 *
	 * @param columHeader
	 *            標題字串陣列
	 */
	public void createColumHeader(List<Map<String, Object>> listInfo) {
		// 定義單元格格式,新增單元格表樣式,並新增到工作簿
		HSSFCellStyle cellStyle = wb.createCellStyle();
		cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊
		cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊
		cellStyle.setWrapText(true);// 指定單元格自動換行

		// 單元格字型
		HSSFFont font = wb.createFont();
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		font.setFontName("宋體");// 字型
		font.setFontHeightInPoints((short) 10);// 設定字型
		cellStyle.setFont(font);

		// 設定單元格背景色
		// cellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);
		// cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

		HSSFCell cell3 = null;

		for (int i = 0; i < listInfo.size(); i++) {
			// 迴圈插入資料
			HSSFRow row2 = sheet.createRow(i + 2);
			row2.setHeight((short) 400);// 指定行高
			cell3 = row2.createCell(0);
			cell3.setCellStyle(cellStyle);
			cell3.setCellValue(new HSSFRichTextString(listInfo.get(i).get("序列").toString()));

			cell3 = row2.createCell(1);
			cell3.setCellStyle(cellStyle);
			cell3.setCellValue(new HSSFRichTextString((String) listInfo.get(i).get("姓名")));

			cell3 = row2.createCell(2);
			cell3.setCellStyle(cellStyle);
			cell3.setCellValue(new HSSFRichTextString(listInfo.get(i).get("年齡").toString()));

			cell3 = row2.createCell(3);
			cell3.setCellStyle(cellStyle);
			cell3.setCellValue(new HSSFRichTextString((String) listInfo.get(i).get("戶籍")));
		}
	}

	/**
	 * 建立內容單元格
	 *
	 * @param wb
	 *            HSSFWorkbook
	 * @param row
	 *            HSSFRow
	 * @param col
	 *            short型的列索引
	 * @param align
	 *            對齊方式
	 * @param val
	 *            列值
	 */
	public void cteateCell(HSSFWorkbook wb, HSSFRow row, int col, short align, String val, HSSFCellStyle cellstyle) {
		HSSFCell cell = row.createCell(col);
		cell.setCellType(HSSFCell.ENCODING_UTF_16);
		cell.setCellValue(new HSSFRichTextString(val));
		cell.setCellStyle(cellstyle);
	}

	/**
	 * 建立合計行
	 *
	 * @param colSum
	 *            需要合併到的列索引
	 * @param cellValue
	 */
	public void createLastSumRow(int colSum, List<String> list) {
		// 定義單元格格式,新增單元格表樣式,並新增到工作簿
		HSSFCellStyle cellStyle = wb.createCellStyle();
		cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 指定單元格居中對齊
		cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 指定單元格垂直居中對齊
		cellStyle.setWrapText(true);// 指定單元格自動換行

		// 單元格字型
		HSSFFont font = wb.createFont();
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		font.setFontName("宋體");
		font.setFontHeight((short) 250);
		cellStyle.setFont(font);
		// 獲取工作表最後一行
		HSSFRow lastRow = sheet.createRow((short) (sheet.getLastRowNum() + 1));
		HSSFCell sumCell = lastRow.createCell(0);// 建立Excel工作表指定行的單元格

		sumCell.setCellValue(new HSSFRichTextString("合計"));
		sumCell.setCellStyle(cellStyle);
		// 合併 最後一行的第零列-最後一行的第一列
		sheet.addMergedRegion(new Region(sheet.getLastRowNum(), (short) 0, sheet.getLastRowNum(), (short) colSum));// 指定合併區域

		for (int i = 2; i < (list.size() + 2); i++) {
			// 定義最後一行的第三列
			sumCell = lastRow.createCell(i);
			sumCell.setCellStyle(cellStyle);
			// 定義陣列 從0開始。
			sumCell.setCellValue(new HSSFRichTextString(list.get(i - 2)));
		}
	}

	/**
	 * 輸入EXCEL檔案
	 *
	 * @param fileName
	 *            檔名
	 */
	public void outputExcel(String fileName) {
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(new File(fileName));
			wb.write(fos);
			fos.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public HSSFWorkbook getWb() {
		return wb;
	}

	public void setWb(HSSFWorkbook wb) {
		this.wb = wb;
	}

	public HSSFSheet getSheet() {
		return sheet;
	}

	public void setSheet(HSSFSheet sheet) {
		this.sheet = sheet;
	}
}

maven依賴版本為3.11 

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.11</version>
</dependency>