Excel导出数据库数据

package com.hxkr.util;

import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

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.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Workbook;

/**
 * 
 * @author     陈欢
 * @Date    2019年3月7日
 * 数据库导出数据到Excel
 *
 */
public class ExportUtil {
    
    public static void main(String[] args) {
        List<HashMap<String, Object>> professionField = testField();
        System.out.println(professionField);
        List<HashMap<String, Object>> professionMsg = testData();
        System.out.println(professionMsg);
        export("C:\\Users\\Administrator\\Desktop\\export.xls", "sheet","测试标题",professionField,professionMsg);
    }
    
    /**
     * 测试字段
     * @return
     */
    private static List<HashMap<String, Object>> testField(){
        HashMap<String, Object> hashMap = new HashMap<>();
        HashMap<String, Object> hashMap1 = new HashMap<>();
        List<HashMap<String, Object>> professionField = new ArrayList<>();
        hashMap.put("field_guid", "5657a72d-4270-46a6-a635-78b09f267f78");
        hashMap.put("name", "专业名称");
        hashMap.put("state", "yes");
        professionField.add(hashMap);
        hashMap1.put("field_guid", "b111fabd-9752-4ca6-9ac1-84e0ef175c50");
        hashMap1.put("name", "专业代码");
        hashMap1.put("state", "yes");
        professionField.add(hashMap1);
        return professionField;
    }
    /**
     * 测试字段
     * @return
     */
    private static List<HashMap<String, Object>> testData(){
        HashMap<String, Object> hashMap = new HashMap<>();
        HashMap<String, Object> hashMap1 = new HashMap<>();
        List<HashMap<String, Object>> professionField = new ArrayList<>();
        hashMap.put("5657a72d-4270-46a6-a635-78b09f267f78", "生物学");
        hashMap.put("b111fabd-9752-4ca6-9ac1-84e0ef175c50", "1010101");
        professionField.add(hashMap);
        hashMap1.put("5657a72d-4270-46a6-a635-78b09f267f78", "物理学");
        hashMap1.put("b111fabd-9752-4ca6-9ac1-84e0ef175c50", "2020202");
        professionField.add(hashMap1);
        return professionField;
    }
    /**
     * 生成一个Excel
     * @param address           文件存放地址
     * @param sheetName          工作表名称
     * @param headerName        标题名称
     * @param professionField    表头字段数据源
     * @param professionMsg      表数据数据源
     * 
     * 
     */
    public static void export(String address,String sheetName,String headerName,List<HashMap<String, Object>> professionField,List<HashMap<String, Object>> professionMsg){
        HSSFWorkbook workbook = new HSSFWorkbook();//创建一个Excel文件
        HSSFSheet sheet = workbook.createSheet(sheetName);//创建一个工作表
        setTop(workbook, sheet, headerName,headerDataList(professionField).size()-1);//设置标题
        setheader(workbook, sheet, professionField);//设置表头字段
        setData(workbook, sheet, professionField,professionMsg);//设置数据
        try {
            FileOutputStream out = new FileOutputStream(address);
            workbook.write(out);
            out.close();
            System.out.println("完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
        
    }
    
    /**
     * 设置标题
     * @param workbook
     * @param sheet
     * @param topContent    标题名称
     */
    public static void setTop(HSSFWorkbook workbook,HSSFSheet sheet,String topContent,Integer num) {
        HSSFRow row = sheet.createRow((int) 0);  //创建第一行
        HSSFCell cell = row.createCell((short) 0); //创建第一列
        /** 
         * CellRangeAddress(firstRow, lastRow, firstCol, lastCol)
         *  firstRow    区域中第一个单元格的行号
            lastRow     区域中最后一个单元格的行号
            firstCol    区域中第一个单元格的列号
            lastCol     区域中最后一个单元格的列号
         */
        CellRangeAddress cellRangeAddress = new CellRangeAddress(0,0,0,num);
        sheet.addMergedRegion(cellRangeAddress);
        row.setHeightInPoints((short)40);//行高
        cell.setCellStyle(topStyle(workbook));//设置样式
        cell.setCellValue(topContent);
    }
    /**
     * 设置标题字体
     * @param wb
     * @return
     */
    private static CellStyle topStyle(Workbook wb){
        CellStyle cellStyle=wb.createCellStyle();
        // 设置字体
        Font font = wb.createFont(); 
        font.setFontName("微软雅黑");//字体类型
        font.setFontHeightInPoints((short) 20);// 字号 
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗 
        font.setColor(HSSFColor.RED.index);//设置字体颜色
        cellStyle.setFont(font);
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
        return cellStyle;
    }
    
    /**
     * 设置表头字段
     * @param workbook
     * @param sheet
     * @param professionMsg    数据源
     */
    public static void setheader(HSSFWorkbook workbook,HSSFSheet sheet,List<HashMap<String, Object>> professionMsg) {
        HSSFRow row = sheet.createRow((int) 2);  //创建第三行
        row.setHeightInPoints((short)25);//行高
        List<String> headerDataList = headerDataList(professionMsg);
        for (int i = 0; i < headerDataList.size(); i++) {
            sheet.setColumnWidth(i, headerDataList.get(i).toString().getBytes().length*256+1500);
            HSSFCell cell = row.createCell((short) i); //创建每一列
            cell.setCellStyle(headerStyle(workbook,HSSFColor.LIGHT_GREEN.index));
            cell.setCellValue(headerDataList.get(i));//每一列赋值
        }
    }
    
    /**
     * 设置表头字段样式
     * @param wb
     * @param color    前景色下标
     * @return
     */
    private static CellStyle headerStyle(Workbook wb,short color){
        CellStyle cellStyle=wb.createCellStyle();
        // 设置字体
        Font font = wb.createFont(); 
        font.setFontName("微软雅黑");//字体类型
        font.setFontHeightInPoints((short) 14);// 字号 
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗 
        font.setColor(HSSFColor.BLACK.index);//设置字体颜色
        cellStyle.setFont(font);
        cellStyle.setWrapText(true);//自动换行
        cellStyle.setFillForegroundColor(color); // 前景色
        cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
        borderStyle(cellStyle, IndexedColors.BLACK.getIndex());
        return cellStyle;
    }
    
    /**
     * 边框颜色
     * @param wb
     * @param color    颜色代码
     * @return
     */
    private static void borderStyle(CellStyle cellStyle,short color){
        /**
         * CellStyle.BORDER_THIN 实线
         * CellStyle.BORDER_MEDIUM_DASHED    虚线
         */
        cellStyle.setBorderBottom(CellStyle.BORDER_THIN); // 底部边框
        cellStyle.setBottomBorderColor(color); // 底部边框颜色         
        cellStyle.setBorderLeft(CellStyle.BORDER_THIN);  // 左边边框
        cellStyle.setLeftBorderColor(color); // 左边边框颜色
        cellStyle.setBorderRight(CellStyle.BORDER_THIN); // 右边边框
        cellStyle.setRightBorderColor(color);  // 右边边框颜色         
        cellStyle.setBorderTop(CellStyle.BORDER_THIN); // 上边边框
        cellStyle.setTopBorderColor(color);  // 上边边框颜色
        
    }
    
    
    /**
     * 获取所有的表头字段
     * @param professionMsg    数据源
     * @return    所有的表头字段
     */
    public static List<String> headerDataList(List<HashMap<String, Object>> professionMsg){
        List<String> list = new ArrayList<>();
        for (HashMap<String, Object> hashMap : professionMsg) {
            String state = hashMap.get("state").toString();
            String fieldName = hashMap.get("name").toString();
            if(!"del".equals(state) && !"no".equals(state) && !"简介".equals(fieldName) && !"专业所属大类".equals(fieldName)){
                list.add(fieldName);
            }
        }
        return list;
    }
    
    
    /**
     * 设置数据
     * @param workbook
     * @param sheet
     * @param professionField    字段数据
     * @param professionMsg        数据源
     */
    public static void setData(HSSFWorkbook workbook,HSSFSheet sheet,List<HashMap<String, Object>> professionField,List<HashMap<String, Object>> professionMsg) {
        for (int d = 0; d < professionMsg.size(); d++) {
            HSSFRow row = sheet.createRow((int) d+3);  //创建第四行、五行...
            row.setHeightInPoints((short)20);//行高
            List<String> headerDataList = headerDataList(professionField);
            for (int i = 0; i < headerDataList.size(); i++) {
                HSSFCell cell = row.createCell((short) i); //创建每一列
                String guid = getGuId(headerDataList.get(i).toString(), professionField);
                if(professionMsg.get(d).get(guid).toString().getBytes().length > headerDataList.get(i).toString().getBytes().length){
                    sheet.setColumnWidth(i, professionMsg.get(d).get(guid).toString().getBytes().length*256+1500);
                }
                cell.setCellStyle(dataStyle(workbook));
                cell.setCellValue(professionMsg.get(d).get(guid).toString());//每一列赋值
            }
            
        }
    }
    
    /**
     * 设置表头字段样式
     * @param wb
     * @param color    前景色下标
     * @return
     */
    private static CellStyle dataStyle(Workbook wb){
        CellStyle cellStyle=wb.createCellStyle();
        // 设置字体
        Font font = wb.createFont(); 
        font.setFontName("微软雅黑");//字体类型
        font.setFontHeightInPoints((short) 12);// 字号 
        font.setColor(HSSFColor.BLACK.index);//设置字体颜色
        cellStyle.setFont(font);
        cellStyle.setWrapText(true);//自动换行
        cellStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); 
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平居中
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
        borderStyle(cellStyle, IndexedColors.BLACK.getIndex());
        return cellStyle;
    }
    
    /**
     * 根据字段名称查询字段field_guid
     * @param fieldName        字段名称
     * @param professionMsg    数据源
     * @return
     */
    private static String getGuId(String fieldName,List<HashMap<String, Object>> professionField){
        for (HashMap<String, Object> hashMap : professionField) {
            if(!"".equals(fieldName)){
                if(fieldName.equals(hashMap.get("name"))){
                    return hashMap.get("field_guid").toString();
                }
            }
        }
        return null;
    }
}

 

posted @ 2019-03-07 09:48  代码酷  阅读(269)  评论(0编辑  收藏  举报