easyui DataGrid 工具类之 WorkbookUtil class

/**
 * @Title: WorkbookUtil.java
 * @Description: excel工具类
 * @date 2014年5月29日 上午10:36:42
 * @version V1.0
 */

package com.gsoft.modules.ggcz.utils.excel;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.json.JSONArray;
import net.sf.json.JsonConfig;
import org.apache.commons.collections.MapUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
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.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.ss.util.CellRangeAddress;
import com.gsoft.cos.core.dto.ResponseMessageDto;
import com.gsoft.cos.core.util.Assert;
import com.gsoft.modules.ggcz.utils.GgczUtil;
import com.gsoft.modules.ggcz.utils.TableUtil;

/**
 * @ClassName: WorkbookUtil
 * @Description: excel工具类
 */
public class WorkbookUtil {

    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    private static DecimalFormat df = new DecimalFormat("0");

    @SuppressWarnings("unchecked")
    public static HSSFWorkbook export(List<List<ColumnVO>> list, List<?> datas) {
        // 声明工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成表格
        HSSFSheet sheet = workbook.createSheet();
        // 创建单元格样式
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        // style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 表头

        HSSFRow row = null;
        Map<String, String> keyMap = new HashMap<String, String>();
        int totalColumn = 0;
        List<String> contains = new ArrayList<String>();
        for (int i = 0; i < list.size(); i++) {
            List<ColumnVO> columns = list.get(i);
            int startColumn = 0;
            row = sheet.createRow(i);
            int size = 0;
            if (i == 0) {
                size = columns.size();
            } else {
                size = totalColumn;
            }
            int index = 0;
            int p = 0;
            for (int j = 0; j < size; j++) {
                if (i > 0) {
                    if (p == columns.size()) {
                        break;
                    }
                }
                if (!contains.contains(startColumn + "," + i)) {
                    ColumnVO column = null;
                    if (i == 0) {
                        column = columns.get(j);
                    } else {
                        column = columns.get(j - index);
                    }
                    if ((Assert.isNotEmpty(column.getHidden()) && column
                            .getHidden()) || !column.isExported()) {
                        continue;
                    }
                    if (Assert.isNotEmpty(column.getField())) {
                        if (Assert.isNotEmpty(column.getFieldType())) {
                            keyMap.put(
                                    String.valueOf(startColumn),
                                    column.getField() + ","
                                            + column.getFieldType());
                        } else {
                            keyMap.put(String.valueOf(startColumn),
                                    column.getField());
                        }

                    }
                    HSSFCell cell = row.createCell(startColumn);
                    cell.setCellStyle(style);
                    if (Assert.isNotEmpty(column.getTitle())) {
                        cell.setCellValue(column.getTitle().replaceAll("<br>",
                                ""));
                    } else {
                        cell.setCellValue(column.getTitle());
                    }
                    int colspan = 1;
                    if ((Assert.isNotEmpty(column.getColspan()) && column
                            .getColspan() > 1)) {
                        colspan = column.getColspan();
                    }
                    int rowspan = 1;
                    if (Assert.isNotEmpty(column.getRowspan())
                            && column.getRowspan() > 1) {
                        rowspan = column.getRowspan();
                    }
                    if (colspan > 1 || rowspan > 1) {
                        // 合并单元格(startRow,endRow,startColumn,endColumn)
                        sheet.addMergedRegion(new CellRangeAddress(i, i
                                + rowspan - 1, startColumn, startColumn
                                + colspan - 1));
                    }
                    if (rowspan > 1) {
                        for (int k = 0; k < rowspan; k++) {
                            contains.add(startColumn + ","
                                    + (rowspan - i - 1 + k));
                        }
                    }
                    startColumn += colspan;
                    p += 1;
                } else {
                    startColumn += 1;
                    index += 1;
                }
            }
            if (i == 0) {
                totalColumn = startColumn;
            }
        }

        //Object object = null;
        // 遍历集合
        //int rownum = list.size() - 1;
        int rownum = list.size();
        if (datas != null) {
            for (int i = 0; i < datas.size(); i++) {
                Map<String, Object> map =(Map<String, Object>) datas.get(i);
                int number = 0;
                row = sheet.createRow(i + rownum);
/*                object = datas.get(i);
                row = sheet.createRow(i + rownum + 1);
                int number = 0;
                Map<String, Object> map = new HashMap<String, Object>();
                if (!(object instanceof Map)) {
                    try {
                        map = BeanUtils.describe(object);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (NoSuchMethodException e) {
                        e.printStackTrace();
                    }
                }*/

                for (int j = 0; j < keyMap.size(); j++) {
                    String key = keyMap.get(String.valueOf(j));
                    String fieldType = "";
                    if (key.contains(",")) {
                        fieldType = key.substring(key.indexOf(",") + 1,
                                key.length());
                        key = key.substring(0, key.indexOf(","));
                    }
                    String value = MapUtils.getString(map, key);
                    if (fieldType.equals("date")&& Assert.isNotEmpty(value)) {
                        try {
                            value =  GgczUtil.getDateToString(value,
                                    "yyyy-MM-dd");
                        } catch (ParseException e) {
                            e.printStackTrace();
                        }
                    }
                    HSSFCell cell = row.createCell(number);
                    cell.setCellValue(value);
                    number++;
                }
            }
        }

        return workbook;
    }

    /**
     * 获取excel中行数据
     */
    public static List<Map<String, Object>> getData(InputStream is) {
        List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();

        try {
            Workbook wb = WorkbookFactory.create(is);
            Sheet sheet = wb.getSheetAt(0);
            // int lastRowNum = sheet.getLastRowNum();
            int rowsCount = sheet.getPhysicalNumberOfRows();
            int firstRowNum = sheet.getFirstRowNum();

            int cellsCount = 0;
            Row row = sheet.getRow(0);
            if (row != null) {
                cellsCount = row.getPhysicalNumberOfCells();
            }

            List<String> headers = new ArrayList<String>();
            for (int j = 0; j < cellsCount; j++) {
                Cell cell = row.getCell(j);
                headers.add(getCellValue(cell));
            }
            Map<String, Object> map = null;
            for (int i = firstRowNum + 1; i < rowsCount; i++) {
                row = sheet.getRow(i);

                if (row == null) {
                    continue;
                }
                map = new HashMap<String, Object>();

                String value = null;
                for (int j = 0; j < cellsCount; j++) {
                    Cell cell = row.getCell(j);

                    value = getCellValue(cell);
                    map.put(headers.get(j), value);
                }

                rows.add(map);
            }
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return rows;
    }

    /**
     * 根据隐藏第一字段列
     * 获取excel中行数据
     */
    public static List<Map<String, Object>> getDataToField(InputStream is) {
        List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();

        try {
            Workbook wb = WorkbookFactory.create(is);
            Sheet sheet = wb.getSheetAt(0);
            // int lastRowNum = sheet.getLastRowNum();
            int rowsCount = sheet.getPhysicalNumberOfRows();
            int firstRowNum = sheet.getFirstRowNum();

            int cellsCount = 0;
            Row row = sheet.getRow(0);
            if (row != null) {
                cellsCount = row.getPhysicalNumberOfCells();
            }

            List<String> headers = new ArrayList<String>();
            for (int j = 0; j < cellsCount; j++) {
                Cell cell = row.getCell(j);
                headers.add(getCellValue(cell));
            }
            Map<String, Object> map = null;
            for (int i = firstRowNum + 2; i < rowsCount; i++) {
                row = sheet.getRow(i);

                if (row == null) {
                    continue;
                }
                map = new HashMap<String, Object>();

                String value = null;
                for (int j = 0; j < cellsCount; j++) {
                    Cell cell = row.getCell(j);

                    value = getCellValue(cell);
                    map.put(headers.get(j), value);
                }

                rows.add(map);
            }
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return rows;
    }
    
    /**
     * 根据字段名加“|”中文名
     * 获取excel中行数据
     */
    public static List<Map<String, Object>> getDataToShowField(InputStream is) {
        List<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();

        try {
            Workbook wb = WorkbookFactory.create(is);
            Sheet sheet = wb.getSheetAt(0);
            // int lastRowNum = sheet.getLastRowNum();
            int rowsCount = sheet.getPhysicalNumberOfRows();
            int firstRowNum = sheet.getFirstRowNum();

            int cellsCount = 0;
            Row row = sheet.getRow(0);
            if (row != null) {
                cellsCount = row.getPhysicalNumberOfCells();
            }

            List<String> headers = new ArrayList<String>();
            for (int j = 0; j < cellsCount; j++) {
                Cell cell = row.getCell(j);
                String returnCell=getCellValue(cell);
                int fristStr=returnCell.indexOf("|");
                Assert.isTrue(fristStr>=0, "标题定义错误");
                headers.add(returnCell.substring(fristStr+1,returnCell.length()));
            }
            Map<String, Object> map = null;
            for (int i = firstRowNum + 1; i < rowsCount; i++) {
                row = sheet.getRow(i);

                if (row == null) {
                    continue;
                }
                map = new HashMap<String, Object>();

                String value = null;
                for (int j = 0; j < cellsCount; j++) {
                    Cell cell = row.getCell(j);

                    value = getCellValue(cell);
                    map.put(headers.get(j), value);
                }

                rows.add(map);
            }
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return rows;
    }

    /**
     * 获取单元格数据
     */
    protected static String getCellValue(Cell cell) {
        String cellValue = "";
        if (cell != null) {
            switch (cell.getCellType()) {
            case Cell.CELL_TYPE_STRING:
                cellValue = cell.getStringCellValue();
                break;
            case Cell.CELL_TYPE_NUMERIC:
                String dataFormat = cell.getCellStyle().getDataFormatString();
                if (DateUtil.isCellDateFormatted(cell)) {
                    cellValue = sdf.format(cell.getDateCellValue());
                } else if ("@".equals(dataFormat)) {
                    cellValue = df.format(cell.getNumericCellValue());
                } else {
                    cellValue = String.valueOf(cell.getNumericCellValue());
                    DecimalFormat df = new DecimalFormat("#.#########");
                    cellValue = df.format(Double.valueOf(cellValue));
                }
                break;
            case Cell.CELL_TYPE_BOOLEAN:
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case Cell.CELL_TYPE_FORMULA:
                cellValue = cell.getCellFormula();
                break;
            default:
                cellValue = "";
            }
        }
        return cellValue;
    }

    /**
     *
     * @param request
     * @param response
     * @param operate
     *            导入还是导出 export or print
     * @param title
     *            表明
     * @param columnJson
     *            列值
     * @param datas
     *            数据集
     * @throws UnsupportedEncodingException
     * @throws IOException
     */
    public void export(HttpServletRequest request,
            HttpServletResponse response, String operate, String title,
            String columnJson, List<?> datas)
            throws UnsupportedEncodingException, IOException {
        
        List<List<ColumnVO>> list = new ArrayList<List<ColumnVO>>();
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setIgnoreDefaultExcludes(true);
        jsonConfig.setExcludes(new String[] { "checkbox", "boxWidth",
                "deltaWidth", "cellClass", "iconCls", "sortable", "order",
                "editor", "auto" });
        JSONArray array = JSONArray.fromObject(columnJson, jsonConfig);
        for (int i = 0; i < array.size(); i++) {
            JSONArray columns = (JSONArray) array.get(i);
            @SuppressWarnings("unchecked")
            List<ColumnVO> temp = (List<ColumnVO>) JSONArray.toList(columns,
                    new ColumnVO(), jsonConfig);
            list.add(temp);
        }
        if ("export".equals(operate)) {
            try {
                HSSFWorkbook workbook = WorkbookUtil.export(list, datas);
                response.setContentType("APPLICATION/x-msdownload");
//                response.setHeader(
//                        "Content-Disposition",
//                        "attachment;filename*=UTF-8''"
//                                + URLEncoder.encode("测试导出.xls", "UTF-8"));
                response.addHeader(
                        "Content-Disposition",
                        "attachment;filename="
                                + new String(title.getBytes("GBK"), "ISO8859-1")
                                + ".xls");
                /*response.setHeader("Content-disposition", "attachment;filename="
                        + URLEncoder.encode(title+".xls", "UTF-8"));*/
                OutputStream os = response.getOutputStream();
                workbook.write(os);
                os.close();
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        } else if ("print".equals(operate)) {
            request.setCharacterEncoding("UTF-8");
            response.setContentType("text/html; charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            OutputStream os = response.getOutputStream();
            String text = TableUtil.print(list, title, datas);
            os.write(text.getBytes("UTF-8"));
            
        }
    }
    
    /**
     *
     * @param request
     * @param response
     * @param operate
     *            导入还是导出 export or print
     * @param title
     *            表明
     * @param columnJson
     *            列值
     * @param datas
     *            数据集
     * @throws UnsupportedEncodingException
     * @throws IOException
     */
    public void exportTree(HttpServletRequest request,
            HttpServletResponse response, String operate, String title,
            String columnJson, List<?> datas)
            throws UnsupportedEncodingException, IOException {
        List<List<ColumnVO>> list = new ArrayList<List<ColumnVO>>();
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setIgnoreDefaultExcludes(true);
        jsonConfig.setExcludes(new String[] { "checkbox", "boxWidth",
                "deltaWidth", "cellClass", "iconCls", "sortable", "order",
                "editor", "auto" });
        JSONArray array = JSONArray.fromObject(columnJson, jsonConfig);
        for (int i = 0; i < array.size(); i++) {
            JSONArray columns = (JSONArray) array.get(i);
            @SuppressWarnings("unchecked")
            List<ColumnVO> temp = (List<ColumnVO>) JSONArray.toList(columns,
                    new ColumnVO(), jsonConfig);
            list.add(temp);
        }
        if ("export".equals(operate)) {
            try {
                HSSFWorkbook workbook = WorkbookUtil.exportTree(list, datas);
                response.setContentType("APPLICATION/x-msdownload");
//                response.setHeader(
//                        "Content-Disposition",
//                        "attachment;filename*=UTF-8''"
//                                + URLEncoder.encode("测试导出.xls", "UTF-8"));
                response.addHeader(
                        "Content-Disposition",
                        "attachment;filename="
                                + new String(title.getBytes("GBK"), "ISO8859-1")
                                + ".xls");
                /*response.setHeader("Content-disposition", "attachment;filename="
                        + URLEncoder.encode(title+".xls", "UTF-8"));*/
                OutputStream os = response.getOutputStream();
                workbook.write(os);
                os.close();
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        } else if ("print".equals(operate)) {
            request.setCharacterEncoding("UTF-8");
            response.setContentType("text/html; charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            OutputStream os = response.getOutputStream();
            String text = TableUtil.print(list, title, datas);
            os.write(text.getBytes("UTF-8"));
        }
    }
    
    private static int  rowNumbers=0;
    @SuppressWarnings("unchecked")
    public static HSSFWorkbook exportTree(List<List<ColumnVO>> list, List<?> datas) {
        // 声明工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成表格
        HSSFSheet sheet = workbook.createSheet();
        // 创建单元格样式
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        // style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        // style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        // style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        // 表头

        HSSFRow row = null;
        Map<String, String> keyMap = new HashMap<String, String>();
        int totalColumn = 0;
        List<String> contains = new ArrayList<String>();
        for (int i = 0; i < list.size(); i++) {
            List<ColumnVO> columns = list.get(i);
            int startColumn = 0;
            row = sheet.createRow(i);
            int size = 0;
            if (i == 0) {
                size = columns.size();
            } else {
                size = totalColumn;
            }
            int index = 0;
            int p = 0;
            for (int j = 0; j < size; j++) {
                if (i > 0) {
                    if (p == columns.size()) {
                        break;
                    }
                }
                if (!contains.contains(startColumn + "," + i)) {
                    ColumnVO column = null;
                    if (i == 0) {
                        column = columns.get(j);
                    } else {
                        column = columns.get(j - index);
                    }
                    if ((Assert.isNotEmpty(column.getHidden()) && column
                            .getHidden()) || !column.isExported()) {
                        continue;
                    }
                    if (Assert.isNotEmpty(column.getField())) {
                        if (Assert.isNotEmpty(column.getFieldType())) {
                            keyMap.put(
                                    String.valueOf(startColumn),
                                    column.getField() + ","
                                            + column.getFieldType());
                        } else {
                            keyMap.put(String.valueOf(startColumn),
                                    column.getField());
                        }

                    }
                    HSSFCell cell = row.createCell(startColumn);
                    cell.setCellStyle(style);
                    if (Assert.isNotEmpty(column.getTitle())) {
                        cell.setCellValue(column.getTitle().replaceAll("<br>",
                                ""));
                    } else {
                        cell.setCellValue(column.getTitle());
                    }
                    int colspan = 1;
                    if ((Assert.isNotEmpty(column.getColspan()) && column
                            .getColspan() > 1)) {
                        colspan = column.getColspan();
                    }
                    int rowspan = 1;
                    if (Assert.isNotEmpty(column.getRowspan())
                            && column.getRowspan() > 1) {
                        rowspan = column.getRowspan();
                    }
                    if (colspan > 1 || rowspan > 1) {
                        // 合并单元格(startRow,endRow,startColumn,endColumn)
                        sheet.addMergedRegion(new CellRangeAddress(i, i
                                + rowspan - 1, startColumn, startColumn
                                + colspan - 1));
                    }
                    if (rowspan > 1) {
                        for (int k = 0; k < rowspan; k++) {
                            contains.add(startColumn + ","
                                    + (rowspan - i - 1 + k));
                        }
                    }
                    startColumn += colspan;
                    p += 1;
                } else {
                    startColumn += 1;
                    index += 1;
                }
            }
            if (i == 0) {
                totalColumn = startColumn;
            }
        }

        //Object object = null;
        // 遍历集合
        //int rownum = list.size() - 1;
        int rownum = list.size();
        int valueRownum=0;
        rowNumbers=0;
        if (datas != null) {
            for (int i = 0; i < datas.size(); i++) {
                Map<String, Object> map =(Map<String, Object>) datas.get(i);
                int number = 0;
                int rowNumber=i + rownum+rowNumbers;
                row = sheet.createRow(rowNumber);
                for (int j = 0; j < keyMap.size()+1; j++) {
                    if(j==keyMap.size()){
                        valueRownum+=loadChildren( rownum, valueRownum, row, sheet, i, map, keyMap);
                    }else{
                        String key = keyMap.get(String.valueOf(j));
                        String fieldType = "";
                        if (key.contains(",")) {
                            fieldType = key.substring(key.indexOf(",") + 1,
                                    key.length());
                            key = key.substring(0, key.indexOf(","));
                        }
                        String value = MapUtils.getString(map, key);
                        if (fieldType.equals("date")) {
                            try {
                                value = GgczUtil.getDateToString(value,
                                        "yyyy-MM-dd");
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                        }
                        HSSFCell cell = row.createCell(number);
                        cell.setCellValue(value);
                    }
                    number++;
                }
            }
        }

        return workbook;
    }
    
    /**
     * 加载children
     * @param rownum
     * @param valueRownum
     * @param row
     * @param sheet
     * @param i
     * @param map
     * @param keyMap
     */
    @SuppressWarnings("unchecked")
    public static int loadChildren(int rownum,int valueRownum,HSSFRow row,HSSFSheet sheet,int i,Map<String, Object> map,Map<String, String> keyMap){
        List<Map<String, Object>> valueList= new ArrayList<Map<String,Object>>();
        Object object=map.get("children");
        if(Assert.isNotEmpty(object)){
            valueList=(List<Map<String, Object>>) object;
            for (int k = 0; k < valueList.size(); k++) {
                Map<String, Object> valueMap =(Map<String, Object>) valueList.get(k);
                int valueNumber = 0;
                int rowNumber=i + rownum+rowNumbers+1;
                rowNumbers++;
                row = sheet.createRow(rowNumber);
                for (int m = 0; m < keyMap.size()+1; m++) {
                    if(m==keyMap.size()){
                        valueRownum+=loadChildren( rownum, valueRownum, row, sheet, i, valueMap, keyMap);
                    }else{
                        String valueKey = keyMap.get(String.valueOf(m));
                        String valueFieldType = "";
                        if (valueKey.contains(",")) {
                            valueFieldType = valueKey.substring(valueKey.indexOf(",") + 1,
                                    valueKey.length());
                            valueKey = valueKey.substring(0, valueKey.indexOf(","));
                        }
                        String value = MapUtils.getString(valueMap, valueKey);
                        if (valueFieldType.equals("date")) {
                            try {
                                value =  GgczUtil.getDateToString(value,
                                        "yyyy-MM-dd");
                            } catch (ParseException e) {
                                e.printStackTrace();
                            }
                        }
                        HSSFCell cell = row.createCell(valueNumber);
                        cell.setCellValue(value);
                        valueNumber++;
                    }
                }
            }
            valueRownum+=valueList.size();
        }
        return valueRownum;
    }

    /**
     * 汇总明细table和 datagrid 拼接
     *
     * @param request
     * @param response
     * @param operate
     *            导入还是导出 export or print
     * @param title
     *            表明
     * @param columnJson
     *            列值
     * @param datas
     *            数据集
     * @throws UnsupportedEncodingException
     * @throws IOException
     */
    @SuppressWarnings("unchecked")
    public void exportToCollect(HttpServletRequest request,
            HttpServletResponse response, String operate, String title,
            String columnJson, List<?> datas)
            throws UnsupportedEncodingException, IOException {
        columnJson = columnJson.replaceAll("undefined", "");
        List<List<List<ColumnVO>>> list = new ArrayList<List<List<ColumnVO>>>();
        JsonConfig jsonConfig = new JsonConfig();
        jsonConfig.setIgnoreDefaultExcludes(true);
        jsonConfig.setExcludes(new String[] { "checkbox", "boxWidth",
                "deltaWidth", "cellClass", "iconCls", "sortable", "order",
                "editor", "auto" });
        JSONArray array = JSONArray.fromObject(columnJson, jsonConfig);
        for (int i = 0; i < array.size(); i++) {
            List<List<ColumnVO>> list1 = (List<List<ColumnVO>>) array.get(i);
            List<List<ColumnVO>> list2 = new ArrayList<List<ColumnVO>>();
            for (int j = 0; j < list1.size(); j++) {
                JSONArray columns = (JSONArray) list1.get(j);
                List<ColumnVO> temp = (List<ColumnVO>) JSONArray.toList(
                        columns, new ColumnVO(), jsonConfig);
                list2.add(temp);
            }
            list.add(list2);
        }

        if ("export".equals(operate)) {
            try {
                HSSFWorkbook workbook = WorkbookUtil.exportToCollect(list,
                        datas);
                response.setContentType("APPLICATION/x-msdownload");
                response.addHeader(
                        "Content-Disposition",
                        "attachment;filename="
                                + new String(title.getBytes("GBK"), "ISO8859-1")
                                + ".xls");
                /*response.setHeader("Content-disposition", "attachment;filename="
                        + URLEncoder.encode(title+".xls", "UTF-8"));*/
                OutputStream os = response.getOutputStream();
                workbook.write(os);
                os.close();
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }
    }

    @SuppressWarnings("unchecked")
    public static HSSFWorkbook exportToCollect(List<List<List<ColumnVO>>> list,
            List<?> datas) {
        // 声明工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成表格
        HSSFSheet sheet = workbook.createSheet();
        // 创建单元格样式
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 表头
        HSSFRow row = null;
        int rownum = 0;
        Map<String, String> keyMap = new HashMap<String, String>();
        for (int f = 0; f < list.size(); f++) {
            List<List<ColumnVO>> list1 = list.get(f);
            int totalColumn = 0;
            List<String> contains = new ArrayList<String>();
            for (int i = 0; i < list1.size(); i++) {
                List<ColumnVO> columns = list1.get(i);
                int startColumn = 0;
                row = sheet.createRow(i + rownum);
                int size = 0;
                if (i == 0) {
                    size = columns.size();
                } else {
                    size = totalColumn;
                }
                int index = 0;
                int p = 0;
                for (int j = 0; j < size; j++) {
                    if (i > 0) {
                        if (p == columns.size()) {
                            break;
                        }
                    }
                    if (!contains.contains(startColumn + "," + (i + rownum))) {
                        ColumnVO column = null;
                        if (i == 0) {
                            column = columns.get(j);
                        } else {
                            column = columns.get(j - index);
                        }
                        if ((Assert.isNotEmpty(column.getHidden()) && column
                                .getHidden()) || !column.isExported()) {
                            continue;
                        }
                        if (Assert.isNotEmpty(column.getField())) {
                            keyMap.put(String.valueOf(startColumn),
                                    column.getField());
                        }
                        HSSFCell cell = row.createCell(startColumn);
                        cell.setCellStyle(style);
                        if (Assert.isNotEmpty(column.getTitle())) {
                            cell.setCellValue(column.getTitle().replaceAll(
                                    "<br>", ""));
                        } else {
                            cell.setCellValue(column.getTitle());
                        }
                        int colspan = 1;
                        if ((Assert.isNotEmpty(column.getColspan()) && column
                                .getColspan() > 1)) {
                            colspan = column.getColspan();
                        }
                        int rowspan = 1;
                        if (Assert.isNotEmpty(column.getRowspan())
                                && column.getRowspan() > 1) {
                            rowspan = column.getRowspan();
                        }
                        if (colspan > 1 || rowspan > 1) {
                            // 合并单元格(startRow,endRow,startColumn,endColumn)
                            sheet.addMergedRegion(new CellRangeAddress(i
                                    + rownum, i + rownum + rowspan - 1,
                                    startColumn, startColumn + colspan - 1));
                        }
                        if (rowspan > 1) {
                            for (int k = 0; k < rowspan; k++) {
                                contains.add(startColumn + ","
                                        + (rowspan - i + rownum - 1 + k));
                            }
                        }
                        startColumn += colspan;
                        p += 1;
                    } else {
                        startColumn += 1;
                        index += 1;
                    }
                }
                if (i == 0) {
                    totalColumn = startColumn;
                }
            }
            if (list.size() > 1 && f == list.size() - 2) {
                rownum += list.get(f).size() + 1;
            } else {
                rownum += list.get(f).size();
            }
        }
        //Object object = null;
        // 遍历集合
        //int rownum = list.size() - 1;
        //rownum = list.get(1).size();
        if (datas != null) {
            for (int i = 0; i < datas.size(); i++) {
                Map<String, Object> map = (Map<String, Object>) datas.get(i);
                int number = 0;
                row = sheet.createRow(i + rownum);
                for (int j = 0; j < keyMap.size(); j++) {
                    String key = keyMap.get(String.valueOf(j));
                    String value = MapUtils.getString(map, key);
                    HSSFCell cell = row.createCell(number);
                    cell.setCellValue(value);
                    number++;
                }
            }
        }

        return workbook;
    }

    /**
     * 根据List Map<String,Object>导出Excel
     *
     * @param request
     * @param response
     * @param operate
     * @param title
     *            表名
     * @param titleMp
     *            表头map,为空则根据datas中Map的Key
     * @param datas
     *            数据集
     * @throws UnsupportedEncodingException
     * @throws IOException
     */
    public static void exportToTitleMap(HttpServletRequest request,
            HttpServletResponse response, String title,
            Map<String, String> titleMp, List<?> datas)
            throws UnsupportedEncodingException, IOException {
        try {
            HSSFWorkbook workbook = WorkbookUtil.exportToTitleMap(titleMp,
                    datas);
            response.setContentType("APPLICATION/x-msdownload");
            response.addHeader("Content-Disposition", "attachment;filename="
                    + new String(title.getBytes("GBK"), "ISO8859-1") + ".xls");
            OutputStream os = response.getOutputStream();
            workbook.write(os);
            os.close();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
    }
    
    /**
     * 根据List Map<String,Object>导出Excel
     *
     * @param request
     * @param response
     * @param operate
     * @param title
     *            表名
     * @param titleMp
     *            表头map,为空则根据datas中Map的Key
     * @param datas
     *            数据集
     * @throws UnsupportedEncodingException
     * @throws IOException
     */
    public static void exportToTitleList(HttpServletRequest request,
            HttpServletResponse response, String title,
            List<Map<String, String>> titleMp, List<?> datas)
            throws UnsupportedEncodingException, IOException {
        try {
            HSSFWorkbook workbook = WorkbookUtil.exportToTitleList(titleMp,
                    datas);
            response.setContentType("APPLICATION/x-msdownload");
            response.addHeader("Content-Disposition", "attachment;filename="
                    + new String(title.getBytes("GBK"), "ISO8859-1") + ".xls");
            OutputStream os = response.getOutputStream();
            workbook.write(os);
            os.close();
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
    }
    
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static HSSFWorkbook exportToTitleMap(Map<String, String> titleMp,
            List<?> datas) {
        // 声明工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成表格
        HSSFSheet sheet = workbook.createSheet();
        // 创建单元格样式
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 表头
        HSSFRow row = null;
        List<String> keyArray = new ArrayList<String>();
        row = sheet.createRow(0);
        Set mapKey = null;
        if (Assert.isNotEmpty(titleMp)) {
            mapKey = titleMp.keySet();
        } else {
            if (Assert.isNotEmpty(datas)) {
                Map<String, Object> map = (Map<String, Object>) datas.get(0);
                mapKey = map.keySet();
            } else {
                return workbook;
            }
        }
        int s = 0;
        for (Object object : mapKey) {
            HSSFCell cell = row.createCell(s);
            String str = object.toString();
            int i = str.length();
            sheet.setColumnWidth(s, 500 * i);
            cell.setCellStyle(style);
            keyArray.add(object.toString());
            if (Assert.isNotEmpty(titleMp)) {
                cell.setCellValue(titleMp.get(object));
            } else {
                cell.setCellValue(object.toString());
            }
            s++;
        }
        if (datas != null) {
            for (int i = 0; i < datas.size(); i++) {
                Map<String, Object> map = (Map<String, Object>) datas.get(i);
                row = sheet.createRow(i + 1);
                for (int j = 0; j < keyArray.size(); j++) {
                    String key = keyArray.get(j);
                    String value = MapUtils.getString(map, key);
                    HSSFCell cell = row.createCell(j);
                    cell.setCellValue(value);
                }
            }
        }
        return workbook;
    }
    
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static HSSFWorkbook exportToTitleList(List<Map<String, String>> list,
            List<?> datas) {
        // 声明工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成表格
        HSSFSheet sheet = workbook.createSheet();
        // 创建单元格样式
        HSSFCellStyle style = workbook.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        // 表头
        HSSFRow row = null;
        List<String> keyArray = new ArrayList<String>();
        row = sheet.createRow(0);
        Set mapKey = null;
        if (Assert.isNotEmpty(list)&&list.size()>0) {
            for (int i = 0; i < list.size(); i++) {
                HSSFCell cell = row.createCell(i);
                cell.setCellStyle(style);
                cell.setCellValue(list.get(i).get("title"));
                keyArray.add(list.get(i).get("name"));
            }
        } else {
            if (Assert.isNotEmpty(datas)) {
                Map<String, Object> map = (Map<String, Object>) datas.get(0);
                mapKey = map.keySet();
                int s = 0;
                for (Object object : mapKey) {
                    HSSFCell cell = row.createCell(s);
                    cell.setCellStyle(style);
                    keyArray.add(object.toString());
                    cell.setCellValue(object.toString());
                    s++;
                }
            } else {
                return workbook;
            }
        }
        
        if (datas != null) {
            for (int i = 0; i < datas.size(); i++) {
                Map<String, Object> map = (Map<String, Object>) datas.get(i);
                row = sheet.createRow(i + 1);
                for (int j = 0; j < keyArray.size(); j++) {
                    String key = keyArray.get(j);
                    String value = MapUtils.getString(map, key);
                    HSSFCell cell = row.createCell(j);
                    cell.setCellValue(value);
                }
            }
        }
        return workbook;
    }
    
    
    /**
     * 根据模板及List Map<String,Object>导出Excel
     * @param request
     * @param response
     * @param operate
     * @param title
     *            表名
     * @param fileName
     *               模板位置
     * @param datas
     *            数据集
     * @throws UnsupportedEncodingException
     * @throws IOException
     */
    public static ResponseMessageDto exportToModefile(HttpServletRequest request,
            HttpServletResponse response, String title,String fileName, List<?> datas)
            throws UnsupportedEncodingException, IOException {
        Map<String, String> titleMp = new HashMap<String, String>();
        File file = new File(fileName);
        InputStream in = null;
        in = new FileInputStream(file);
        Workbook wb;
        try {
            wb = WorkbookFactory.create(in);
            Sheet sheet = wb.getSheetAt(0);
            int cellsCount = 0;
            Row row = sheet.getRow(0);
            if (row != null) {
                cellsCount = row.getPhysicalNumberOfCells();
            }
            for (int j = 0; j < cellsCount; j++) {
                Cell cell = row.getCell(j);
                String returnCell=getCellValue(cell);
                int fristStr=returnCell.indexOf("|");
                if(fristStr<0){
                    return new ResponseMessageDto(true,"提示信息", "模板标题格式错误!");
                }
                //Assert.isTrue(fristStr>=0, "模板错误");
                titleMp.put(returnCell.substring(fristStr+1,returnCell.length()),returnCell);
            }
            in.close();
            WorkbookUtil.exportToTitleMap(request,response,title,titleMp,
                    datas);
            return null;
        } catch (InvalidFormatException e1) {
            e1.printStackTrace();
        }
        return null;
    }
    
    /**
     * 根据模板及List Map<String,Object>导出Excel
     * @param request
     * @param response
     * @param operate
     * @param title
     *            表名
     * @param fileName
     *               模板位置
     * @param datas
     *            数据集
     * @throws UnsupportedEncodingException
     * @throws IOException
     */
    public static ResponseMessageDto exportToModefileList(HttpServletRequest request,
            HttpServletResponse response, String title,String fileName, List<?> datas)
            throws UnsupportedEncodingException, IOException {
        List<Map<String, String>> titleMp = new ArrayList<Map<String,String>>();
        File file = new File(fileName);
        InputStream in = null;
        in = new FileInputStream(file);
        Workbook wb;
        try {
            wb = WorkbookFactory.create(in);
            Sheet sheet = wb.getSheetAt(0);
            int cellsCount = 0;
            Row row = sheet.getRow(0);
            if (row != null) {
                cellsCount = row.getPhysicalNumberOfCells();
            }
            for (int j = 0; j < cellsCount; j++) {
                Cell cell = row.getCell(j);
                String returnCell=getCellValue(cell);
                int fristStr=returnCell.indexOf("|");
                if(fristStr<0){
                    return new ResponseMessageDto(true,"提示信息", "模板标题格式错误!");
                }
                //Assert.isTrue(fristStr>=0, "模板错误");
                Map<String, String> m= new HashMap<String, String>();
                m.put("name", returnCell.substring(fristStr+1,returnCell.length()));
                m.put("title", returnCell);
                titleMp.add(m);
            }
            in.close();
            WorkbookUtil.exportToTitleList(request,response,title,titleMp,
                    datas);
            return null;
        } catch (InvalidFormatException e1) {
            e1.printStackTrace();
        }
        return null;
    }
    
    public static void main(String[] args) {
        TreeMap<String, String> m = new TreeMap<String, String>();
        m.put("aa", "d1");
        m.put("a", "d0");
        m.put("b", "ddd");
        for (Entry<String, String> o : m.entrySet())
        {
            System.out.println(o.getKey() + ", " + o.getValue());
        }
    }
    
    public void test(Map<Integer, String> m){
        
    }
}

原文地址:https://www.cnblogs.com/ckaifeng/p/5130941.html