最近公司项目有个需求,是导出列表中的数据并下载。如下图所示的列表数据,并且该数据不是一个表里的数据。
java SSM框架下实现数据EXCEL导出下载功能_第1张图片

-------------------------------------------------华丽的分割线------------------------------------------------------------------------------------------------------
实现步骤如下:本项目实现环境为maven项目
1.引入jia包:

java SSM框架下实现数据EXCEL导出下载功能_第2张图片

2.拷贝ExportExcel文件和ReadExcel文件,是读取和导出excel文件的工具类,通用型的。
2.1 ReadExcel:
package dwz.plugins;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
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.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

                /*****
                 * @category 读取Excel文件的工具类
                 * @author yinzhifu
                 * @version 2017-12-22
                 */
                public class ReadExcel {
                    public static List> readExcel(File file) throws IOException {
                        String fName = file.getName();
                        String extension = fName.lastIndexOf(".") == -1 ? "" : fName.substring(fName.lastIndexOf(".") + 1);
                        if ("xls".equals(extension)) {// 2003
                            System.err.println("读取excel2003文件内容");
                            return read2003Excel(file);
                        } else if ("xlsx".equals(extension)) {// 2007
                            System.err.println("读取excel2007文件内容");
                            return read2007Excel(file);
                        } else {
                            throw new IOException("不支持的文件类型:" + extension);
                        }
                    }

                    /**
                     * 读取2003excel
                     * 
                     * @param file
                     * @return
                     */
                    @SuppressWarnings("deprecation")
                    private static List> read2003Excel(File file) throws IOException {
                        List> dataList = new ArrayList>();
                        HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));
                        HSSFSheet sheet = wb.getSheetAt(0);
                        HSSFRow row = null;
                        HSSFCell cell = null;
                        Object val = null;
                        DecimalFormat df = new DecimalFormat("0");// 格式化数字
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串
                        // 如果加1 则为去掉表头
                        for (int i = sheet.getFirstRowNum() + 1; i < sheet.getPhysicalNumberOfRows(); i++) {
                            row = sheet.getRow(i);
                            if (row == null) {
                                continue;
                            }
                            List objList = new ArrayList();
                            for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {
                                cell = row.getCell(j);
                                if (cell == null) {
                                    val = null;
                                    objList.add(val);
                                    continue;
                                }
                                switch (cell.getCellType()) {
                                case HSSFCell.CELL_TYPE_STRING:
                                    val = cell.getStringCellValue();
                                    break;
                                case HSSFCell.CELL_TYPE_NUMERIC:
                                    if ("@".equals(cell.getCellStyle().getDataFormatString())) {
                                        val = df.format(cell.getNumericCellValue());
                                    } else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
                                        val = df.format(cell.getNumericCellValue());
                                    } else {
                                        val = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
                                    }
                                    break;
                                case HSSFCell.CELL_TYPE_BOOLEAN:
                                    val = cell.getBooleanCellValue();
                                    break;
                                case HSSFCell.CELL_TYPE_BLANK:
                                    val = "";
                                    break;
                                default:
                                    val = cell.toString();
                                    break;
                                }
                                objList.add(val);
                            }
                            dataList.add(objList);
                        }
                        return dataList;
                    }

                    /**
                     * 读取excel表头
                     * 
                     * @param file
                     * @return
                     * @throws IOException
                     */
                    public static String[] readExcelHead(File file) throws IOException {
                        HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(file));
                        HSSFSheet sheet = wb.getSheetAt(0);
                        HSSFRow row = null;
                        HSSFCell cell = null;
                        row = sheet.getRow(0);
                        String[] buff = new String[row.getLastCellNum()];
                        for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {
                            cell = row.getCell(i);
                            buff[i] = cell.getStringCellValue();
                        }
                        return buff;
                    }

                    /**
                     * 读取2007excel
                     * 
                     * @param file
                     * @return 文件内容
                     */

                    private static List> read2007Excel(File file) throws IOException {
                        List> dataList = new ArrayList>();
                        XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));
                        XSSFSheet sheet = xwb.getSheetAt(0);
                        XSSFRow row = null;
                        XSSFCell cell = null;
                        Object val = null;
                        DecimalFormat df = new DecimalFormat("0");// 格式化数字
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串
                        // 如果开始位置加1 则不读取表头
                        for (int i = sheet.getFirstRowNum() + 1; i < sheet.getPhysicalNumberOfRows(); i++) {
                            row = sheet.getRow(i);
                            if (row == null) {
                                continue;
                            }
                            List objList = new ArrayList();
                            for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {
                                cell = row.getCell(j);
                                if (cell == null) {
                                    val = null;
                                    objList.add(val);
                                    continue;
                                }
                                switch (cell.getCellType()) {
                                case XSSFCell.CELL_TYPE_STRING:
                                    val = cell.getStringCellValue();
                                    break;
                                case XSSFCell.CELL_TYPE_NUMERIC:
                                    if ("@".equals(cell.getCellStyle().getDataFormatString())) {
                                        val = df.format(cell.getNumericCellValue());
                                    } else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
                                        val = df.format(cell.getNumericCellValue());
                                    } else {
                                        val = sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
                                    }
                                    break;
                                case XSSFCell.CELL_TYPE_BOOLEAN:
                                    val = cell.getBooleanCellValue();
                                    break;
                                case XSSFCell.CELL_TYPE_BLANK:
                                    val = "";
                                    break;
                                default:
                                    val = cell.toString();
                                    break;
                                }
                                objList.add(val);
                            }
                            dataList.add(objList);
                        }
                        return dataList;
                    }

                    /***
                     * 测试
                     * 
                     * @param args
                     */
                    public static void readExcel() {
                        try {
                            List> list = readExcel(new File("F:\\1.xls"));
                            int num = 1;
                            for (List objList : list) {
                                System.out.print(num + " ");
                                for (Object obj : objList) {
                                    System.out.print(obj + "\t");
                                }
                                System.out.println();
                                num++;
                            }
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }

                    // 测试表头
                    public static void readHed() {
                        String[] sArr;
                        try {
                            sArr = readExcelHead(new File("F:\\1.xls"));
                            for (String s : sArr) {
                                System.out.print(s + "  ");
                            }
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                    }

                    public static void main(String[] args) {
                        readHed();
                        System.out.println("\n" + "-----------------");
                        readExcel();
                    }
                }

       2.2 ExportExcel:
            package dwz.plugins;
            import java.io.BufferedInputStream;
            import java.io.BufferedOutputStream;
            import java.io.File;
            import java.io.FileInputStream;
            import java.io.IOException;
            import java.io.InputStream;
            import java.io.OutputStream;
            import java.lang.reflect.Field;
            import java.lang.reflect.InvocationTargetException;
            import java.lang.reflect.Method;
            import java.net.URLEncoder;
            import java.text.SimpleDateFormat;
            import java.util.Collection;
            import java.util.Date;
            import java.util.Iterator;
            import java.util.regex.Matcher;
            import java.util.regex.Pattern;
            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.HSSFClientAnchor;
            import org.apache.poi.hssf.usermodel.HSSFComment;
            import org.apache.poi.hssf.usermodel.HSSFFont;
            import org.apache.poi.hssf.usermodel.HSSFPatriarch;
            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;

            /****
             * 
             * @author yinzhfu
             * @category excel导出公共类
             * @param 
             * @serial 2017-12-12
             */
            public class ExportExcel {

                public void exportExcelCar(String[] headers, String sheetName, Collection dataset, OutputStream out) {
                    exportExcel(sheetName, headers, dataset, out, "yyyy-MM-dd");
                }

                /**
                 * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
                 * 
                 * @param title
                 *            表格标题名
                 * @param headers
                 *            表格属性列名数组
                 * @param dataset
                 *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的
                 *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
                 * @param out
                 *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
                 * @param pattern
                 *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
                 */
                @SuppressWarnings({ "unchecked", "deprecation", "resource" })
                public void exportExcel(String title, String[] headers, Collection dataset, OutputStream out, String pattern) {
                    // 声明一个工作薄
                    HSSFWorkbook workbook = new HSSFWorkbook();
                    // 生成一个表格
                    HSSFSheet sheet = workbook.createSheet(title);
                    // 设置表格默认列宽度为15个字节
                    sheet.setDefaultColumnWidth((short) 15);
                    // 生成一个样式
                    HSSFCellStyle style = workbook.createCellStyle();
                    // 设置这些样式
                    style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
                    style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
                    style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                    style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                    style.setBorderRight(HSSFCellStyle.BORDER_THIN);
                    style.setBorderTop(HSSFCellStyle.BORDER_THIN);
                    style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                    // 生成一个字体
                    HSSFFont font = workbook.createFont();
                    font.setColor(HSSFColor.VIOLET.index);
                    font.setFontHeightInPoints((short) 12);
                    font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
                    // 把字体应用到当前的样式
                    style.setFont(font);
                    // 生成并设置另一个样式
                    HSSFCellStyle style2 = workbook.createCellStyle();
                    style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
                    style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
                    style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                    style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                    style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
                    style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
                    style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                    style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
                    // 生成另一个字体
                    HSSFFont font2 = workbook.createFont();
                    font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
                    // 把字体应用到当前的样式
                    style2.setFont(font2);

                    // 声明一个画图的顶级管理器
                    HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
                    // 定义注释的大小和位置,详见文档
                    HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
                    // 设置注释内容
                    comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
                    // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
                    comment.setAuthor("leno");

                    // 产生表格标题行
                    HSSFRow row = sheet.createRow(0);
                    for (short i = 0; i < headers.length; i++) {
                        HSSFCell cell = row.createCell(i);
                        cell.setCellStyle(style);
                        HSSFRichTextString text = new HSSFRichTextString(headers[i]);
                        cell.setCellValue(text);
                    }

                    // 遍历集合数据,产生数据行
                    Iterator it = dataset.iterator();
                    int index = 0;
                    while (it.hasNext()) {
                        index++;
                        row = sheet.createRow(index);
                        T t = (T) it.next();
                        // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
                        Field[] fields = t.getClass().getDeclaredFields();
                        for (short i = 0; i < fields.length; i++) {
                            HSSFCell cell = row.createCell(i);
                            cell.setCellStyle(style2);
                            Field field = fields[i];
                            String fieldName = field.getName();
                            String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
                            try {
                                Class tCls = t.getClass();
                                Method getMethod = tCls.getMethod(getMethodName, new Class[] {});
                                Object value = getMethod.invoke(t, new Object[] {});
                                // 判断值的类型后进行强制类型转换
                                String textValue = null;
                                if (value instanceof Boolean) {
                                    boolean bValue = (Boolean) value;
                                    textValue = "男";
                                    if (!bValue) {
                                        textValue = "女";
                                    }
                                } else if (value instanceof Date) {
                                    Date date = (Date) value;
                                    SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                                    textValue = sdf.format(date);
                                } else if (value instanceof byte[]) {
                                    // 有图片时,设置行高为60px;
                                    row.setHeightInPoints(60);
                                    // 设置图片所在列宽度为80px,注意这里单位的一个换算
                                    sheet.setColumnWidth(i, (short) (35.7 * 80));
                                    // sheet.autoSizeColumn(i);
                                    byte[] bsValue = (byte[]) value;
                                    HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6,
                                            index);
                                    anchor.setAnchorType(2);
                                    patriarch.createPicture(anchor, workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
                                } else {
                                    // 其它数据类型都当作字符串简单处理
                                    if (null == value) {
                                        textValue = "";
                                    } else {
                                        textValue = value.toString();
                                    }
                                }
                                // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
                                if (textValue != null) {
                                    Pattern p = Pattern.compile("^//d+(//.//d+)?$");
                                    Matcher matcher = p.matcher(textValue);
                                    if (matcher.matches()) {
                                        // 是数字当作double处理
                                        cell.setCellValue(Double.parseDouble(textValue));
                                    } else {
                                        HSSFRichTextString richString = new HSSFRichTextString(textValue);
                                        HSSFFont font3 = workbook.createFont();
                                        font3.setColor(HSSFColor.BLUE.index);
                                        richString.applyFont(font3);
                                        cell.setCellValue(richString);
                                    }
                                }
                            } catch (SecurityException e) {
                                e.printStackTrace();
                            } catch (NoSuchMethodException e) {
                                e.printStackTrace();
                            } catch (IllegalArgumentException e) {
                                e.printStackTrace();
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            } catch (InvocationTargetException e) {
                                e.printStackTrace();
                            } finally {
                                // 清理资源

                            }
                        }
                    }
                    try {
                        workbook.write(out);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                /***
                 * @category 下载excel文件公共方法
                 * 
                 * @param path
                 *            文件所在路径
                 * @param response
                 */
                public void download(String path, HttpServletResponse response) {
                    try {
                        // path是指欲下载的文件的路径。
                        File file = new File(path);
                        // 取得文件名。
                        String name = file.getName();
                        String filename = URLEncoder.encode(name, "UTF-8");
                        // 以流的形式下载文件。
                        InputStream fis = new BufferedInputStream(new FileInputStream(path));
                        byte[] buffer = new byte[fis.available()];
                        fis.read(buffer);
                        fis.close();
                        // 清空response
                        response.reset();
                        // 设置response的Header
                        response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
                        response.addHeader("Content-Length", "" + file.length());
                        OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
                        response.setContentType("application/vnd.ms-excel;charset=UTF-8");
                        toClient.write(buffer);
                        toClient.flush();
                        toClient.close();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            } 
  

3.controller 部分截图如下:
java SSM框架下实现数据EXCEL导出下载功能_第3张图片

java SSM框架下实现数据EXCEL导出下载功能_第4张图片

4.service 部分截图如下:

java SSM框架下实现数据EXCEL导出下载功能_第5张图片

  1. serviceImpl 部分截图如下:
    java SSM框架下实现数据EXCEL导出下载功能_第6张图片

6.dao 部分截图如下:
java SSM框架下实现数据EXCEL导出下载功能_第7张图片

7.mapper.xml部分截图如下:
java SSM框架下实现数据EXCEL导出下载功能_第8张图片

8.还有个关键点,如下图所示:
java SSM框架下实现数据EXCEL导出下载功能_第9张图片

  1. 所以,我们创建这个实体类,部分如下:
    java SSM框架下实现数据EXCEL导出下载功能_第10张图片
    10.访问得出结果如下所示:
    java SSM框架下实现数据EXCEL导出下载功能_第11张图片

你可能感兴趣的:(java,功能需求,SSM,Java)