您的位置:首页 > 编程语言 > Java开发

导出数据到Excle表格的方法详解

2018-01-15 22:25 323 查看
首先,需要一个Util类,楼主已经给大家封装好了。

package com.lanou.util;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.ByteArrayInputStream;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.math.BigDecimal;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Iterator;

import java.util.LinkedHashMap;

import java.util.Map;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.output.ByteArrayOutputStream;

import org.apache.poi.hpsf.SummaryInformation;

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

import org.apache.poi.ss.usermodel.CellStyle;

import org.apache.poi.ss.usermodel.Font;

import org.apache.poi.xssf.streaming.SXSSFCell;

import org.apache.poi.xssf.streaming.SXSSFRow;

import org.apache.poi.xssf.streaming.SXSSFSheet;

import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import com.alibaba.fastjson.JSONArray;

import com.alibaba.fastjson.JSONObject;

public class ExcelUtil{

    public static String NO_DEFINE = "no_define";//未定义的字段

    public static String DEFAULT_DATE_PATTERN="yyyy年MM月dd日";//默认日期格式

    public static int DEFAULT_COLOUMN_WIDTH = 17;

    /**

     * 导出Excel 97(.xls)格式 ,少量数据

     * @param title 标题行 

     * @param headMap 属性-列名

     * @param jsonArray 数据集

     * @param datePattern 日期格式,null则用默认日期格式

     * @param colWidth 列宽 默认 至少17个字节

     * @param out 输出流

     */

    public static void exportExcel(String title,Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) {

        if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;

        // 声明一个工作薄

        HSSFWorkbook workbook = new HSSFWorkbook();

        workbook.createInformationProperties();

        workbook.getDocumentSummaryInformation().setCompany("*****公司");

        SummaryInformation si = workbook.getSummaryInformation();

        si.setAuthor("JACK");  //填加xls文件作者信息

        si.setApplicationName("导出程序"); //填加xls文件创建程序信息

        si.setLastAuthor("最后保存者信息"); //填加xls文件最后保存者信息

        si.setComments("JACK is a programmer!"); //填加xls文件作者信息

        si.setTitle("POI导出Excel"); //填加xls文件标题信息

        si.setSubject("POI导出Excel");//填加文件主题信息

        si.setCreateDateTime(new Date());

         //表头样式

        HSSFCellStyle titleStyle = workbook.createCellStyle();

        titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        HSSFFont titleFont = workbook.createFont();

        titleFont.setFontHeightInPoints((short) 20);

        titleFont.setBoldweight((short) 700);

        titleStyle.setFont(titleFont);

        // 列头样式

        HSSFCellStyle headerStyle = workbook.createCellStyle();

        headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

        headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);

        headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

        headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        HSSFFont headerFont = workbook.createFont();

        headerFont.setFontHeightInPoints((short) 12);

        headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        headerStyle.setFont(headerFont);

        // 单元格样式

        HSSFCellStyle cellStyle = workbook.createCellStyle();

        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);

        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

        HSSFFont cellFont = workbook.createFont();

        cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);

        cellStyle.setFont(cellFont);

        // 生成一个(带标题)表格

        HSSFSheet sheet = workbook.createSheet();

        // 声明一个画图的顶级管理器

        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("JACK");

        //设置列宽

        int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//至少字节数

        int[] arrColWidth = new int[headMap.size()];

        // 产生表格标题行,以及设置列宽

        String[] properties = new String[headMap.size()];

        String[] headers = new String[headMap.size()];

        int ii = 0;

        for (Iterator<String> iter = headMap.keySet().iterator(); iter

                .hasNext();) {

            String fieldName = iter.next();

            properties[ii] = fieldName;

            headers[ii] = fieldName;

            int bytes = fieldName.getBytes().length;

            arrColWidth[ii] =  bytes < minBytes ? minBytes : bytes;

            sheet.setColumnWidth(ii,arrColWidth[ii]*256);

            ii++;

        }

        // 遍历集合数据,产生数据行

        int rowIndex = 0;

        for (Object obj : jsonArray) {

            if(rowIndex == 65535 || rowIndex == 0){

                if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第二页显示

                HSSFRow titleRow = sheet.createRow(0);//表头 rowIndex=0

                titleRow.createCell(0).setCellValue(title);

                titleRow.getCell(0).setCellStyle(titleStyle);

                sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));

                HSSFRow headerRow = sheet.createRow(1); //列头 rowIndex =1

                for(int i=0;i<headers.length;i++)

                {

                    headerRow.createCell(i).setCellValue(headers[i]);

                    headerRow.getCell(i).setCellStyle(headerStyle);

                }

                rowIndex = 2;//数据内容从 rowIndex=2开始

            }

            JSONObject jo = (JSONObject) JSONObject.toJSON(obj);

            HSSFRow dataRow = sheet.createRow(rowIndex);

            for (int i = 0; i < properties.length; i++)

            {

                HSSFCell newCell = dataRow.createCell(i);

                Object o =  jo.get(properties[i]);

                String cellValue = ""; 

                if(o==null) cellValue = "";

                else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);

                else cellValue = o.toString();

                newCell.setCellValue(cellValue);

                newCell.setCellStyle(cellStyle);

            }

            rowIndex++;

        }

        // 自动调整宽度

        /*for (int i = 0; i < headers.length; i++) {

            sheet.autoSizeColumn(i);

        }*/

        try {

            workbook.write(out);

            workbook.close();

        } catch (IOException e) {

            e.printStackTrace();

        }<
c5a3
br />
    }

    /**

     * 导出Excel 2007 OOXML (.xlsx)格式

     * @param title 标题行

     * @param headMap 属性-列头

     * @param jsonArray 数据集

     * @param datePattern 日期格式,传null值则默认 年月日

     * @param colWidth 列宽 默认 至少17个字节

     * @param out 输出流

     */

    public static void exportExcelX(String title,Map<String, String> headMap,JSONArray jsonArray,String datePattern,int colWidth, OutputStream out) {

        if(datePattern==null) datePattern = DEFAULT_DATE_PATTERN;

        // 声明一个工作薄

        SXSSFWorkbook workbook = new SXSSFWorkbook(1000);//缓存

        workbook.setCompressTempFiles(true);

         //表头样式

        CellStyle titleStyle = workbook.createCellStyle();

        titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        Font titleFont = workbook.createFont();

        titleFont.setFontHeightInPoints((short) 20);

        titleFont.setBoldweight((short) 700);

        titleStyle.setFont(titleFont);

        // 列头样式

        CellStyle headerStyle = workbook.createCellStyle();

        headerStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

        headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);

        headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

        headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        Font headerFont = workbook.createFont();

        headerFont.setFontHeightInPoints((short) 12);

        headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);

        headerStyle.setFont(headerFont);

        // 单元格样式

        CellStyle cellStyle = workbook.createCellStyle();

        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);

        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);

        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);

        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

        Font cellFont = workbook.createFont();

        cellFont.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);

        cellStyle.setFont(cellFont);

        // 生成一个(带标题)表格

        SXSSFSheet sheet = workbook.createSheet();

        //设置列宽

        int minBytes = colWidth<DEFAULT_COLOUMN_WIDTH?DEFAULT_COLOUMN_WIDTH:colWidth;//至少字节数

        int[] arrColWidth = new int[headMap.size()];

        // 产生表格标题行,以及设置列宽

        String[] properties = new String[headMap.size()];

        String[] headers = new String[headMap.size()];

        int ii = 0;

        for (Iterator<String> iter = headMap.keySet().iterator(); iter

                .hasNext();) {

            String fieldName = iter.next();

            properties[ii] = fieldName;

            headers[ii] = headMap.get(fieldName);

            int bytes = fieldName.getBytes().length;

            arrColWidth[ii] =  bytes < minBytes ? minBytes : bytes;

            sheet.setColumnWidth(ii,arrColWidth[ii]*256);

            ii++;

        }

        // 遍历集合数据,产生数据行

        int rowIndex = 0;

        for (Object obj : jsonArray) {

            if(rowIndex == 65535 || rowIndex == 0){

                if ( rowIndex != 0 ) sheet = workbook.createSheet();//如果数据超过了,则在第二页显示

                SXSSFRow titleRow = sheet.createRow(0);//表头 rowIndex=0

                titleRow.createCell(0).setCellValue(title);

                titleRow.getCell(0).setCellStyle(titleStyle);

                sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headMap.size() - 1));

                SXSSFRow headerRow = sheet.createRow(1); //列头 rowIndex =1

                for(int i=0;i<headers.length;i++)

                {

                    headerRow.createCell(i).setCellValue(headers[i]);

                    headerRow.getCell(i).setCellStyle(headerStyle);

                }

                rowIndex = 2;//数据内容从 rowIndex=2开始

            }

            JSONObject jo = (JSONObject) JSONObject.toJSON(obj);

            SXSSFRow dataRow = sheet.createRow(rowIndex);

            for (int i = 0; i < properties.length; i++)

            {

                SXSSFCell newCell = dataRow.createCell(i);

                Object o =  jo.get(properties[i]);

                String cellValue = ""; 

                if(o==null) cellValue = "";

                else if(o instanceof Date) cellValue = new SimpleDateFormat(datePattern).format(o);

                else if(o instanceof Float || o instanceof Double) 

                    cellValue= new BigDecimal(o.toString()).setScale(2,BigDecimal.ROUND_HALF_UP).toString();

                else cellValue = o.toString();

                newCell.setCellValue(cellValue);

                newCell.setCellStyle(cellStyle);

            }

            rowIndex++;

        }

        // 自动调整宽度

        /*for (int i = 0; i < headers.length; i++) {

            sheet.autoSizeColumn(i);

        }*/

        try {

            workbook.write(out);

            workbook.close();

            workbook.dispose();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    //Web 导出excel

    public static void downloadExcelFile(String title,Map<String,String> headMap,JSONArray ja,HttpServletResponse response){

        try {

            ByteArrayOutputStream os = new ByteArrayOutputStream();

            ExcelUtil.exportExcelX(title,headMap,ja,null,0,os);

            byte[] content = os.toByteArray();

            InputStream is = new ByteArrayInputStream(content);

            // 设置response参数,可以打开下载页面

            response.reset();

            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmssms");  
        String dateStr = sdf.format(new Date());  
        

            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8"); 

            response.setHeader("Content-Disposition", "attachment;filename="+title+dateStr+".xlsx");

            response.setContentLength(content.length);

            ServletOutputStream outputStream = response.getOutputStream();

            BufferedInputStream bis = new BufferedInputStream(is);

            BufferedOutputStream bos = new BufferedOutputStream(outputStream);

            byte[] buff = new byte[8192];

            int bytesRead;

            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {

                bos.write(buff, 0, bytesRead);

            }

            bis.close();

            bos.close();

            outputStream.flush();

            outputStream.close();

        }catch (Exception e) {

            e.printStackTrace();

        }

    }

    public static void main(String[] args) throws IOException {

       

    }

}

下面是测试类的书写方法

System.out.println("打印");
Map<String, Object> map = new HashMap<String, Object>();
List<ContractAndProductBean> list = contractService.showJOutProduct(map);
Map<String, String> headMap = new HashMap<String, String>();
headMap.put("contractproductid", "合同货物编号");
headMap.put("customname", "客户名称");
headMap.put("contractno", "合同编号");
headMap.put("deliveryperiod", "交货期限");
headMap.put("shiptime", "船期");
headMap.put("factoryname", "工厂名字");
headMap.put("productno", "货号");
headMap.put("cnumber", "数量");
System.out.println(JSON.toJSONString(list));
JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(list));
ExcelUtil.downloadExcelFile("工厂信息", headMap, jsonArray, response);

大家要注意的是,使用前需要下载对应的jar包!

Util导入后,报错的导包语句,粘贴百度一下,很容易就找到对应的jar包了。

值得注意的是,导出的excle表头要和页面上的数据对应,不然会出现导出失败的情况!

有任何问题可随时联系我!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  excle java