Export data to Excel documents

Export data to Excel documents

Tools Code 1:
package cn.xyt.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 2019.05.31
 * 支持大数据导出
 */
public class ExcelUtilNew {

    private final static int MAX_ROW = 65535;//定义最大列数. excel 2003版最大值为MAX_ROW

    public static String NO_DEFINE = "no_define";//未定义的字段
    public static String DEFAULT_DATE_PATTERN = "yyyy年MM月dd日";//默认日期格式
    public static int DEFAULT_COLOUMN_WIDTH = 17;


    public static void exportExcel(String title, Map<String, String> headMap, JSONArray jsonArray, int colWidth, OutputStream out) {
        Object o = jsonArray.get(0);
        JSONObject json = (JSONObject) JSONObject.toJSON(o);
        for (String key : json.keySet()) {

        }

        exportExcel(title, headMap, jsonArray, null, colWidth, out);
    }

    /**
     * 导出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 == MAX_ROW || 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);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 导出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);
        headerStyle.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
        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);
        // 生成一个(带标题)表格
        Sheet 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 == MAX_ROW || rowIndex == 0) {
                if (rowIndex != 0) sheet = workbook.createSheet();//如果数据超过了,则在第二页显示

                Row 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));

                Row 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);
            Row dataRow = sheet.createRow(rowIndex);
            for (int i = 0; i < properties.length; i++) {
                Cell 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.dispose();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Web 导出excel
     *
     * @param fileName 文件名
     * @param title    首行标题
     * @param headMap  行头
     * @param ja       数据
     * @param response
     * @throws IOException
     */
    public static void downloadExcelFile(String fileName, String title, Map<String, String> headMap, JSONArray ja, HttpServletResponse response) throws IOException {
        try {
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ExcelUtilNew.exportExcelX(title, headMap, ja, null, 0, os);
            byte[] content = os.toByteArray();
            InputStream is = new ByteArrayInputStream(content);
            // 设置response参数,可以打开下载页面
            response.reset();
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + new String((fileName + ".xlsx").getBytes(), "iso-8859-1"));
            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();
            is.close();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * web导出excel
     *
     * @param fileName 文件名
     * @param title    标题
     * @param list     数据
     * @param res
     */
    public static void downloadExcelFile(String fileName, String title, List<Map<String, Object>> list, HttpServletResponse res) throws IOException {
        Map<String, String> headMap = new LinkedHashMap<>(1);
        for (String head : list.get(0).keySet()) {
            headMap.put(head, head);
        }
        JSONArray jsonList = JSONArray.parseArray(JSON.toJSONString(list));
        downloadExcelFile(fileName + "_" + getTodayStr(), title, headMap, jsonList, res);
    }

    public static String getTodayStr() {
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        return df.format(new Date());
    }





    //测试2
    public static void main(String[] args) throws IOException {
        List<Map<String, Object>> list = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            Map<String, Object> map = new LinkedHashMap<>();
            map.put("1", 6);
            map.put("2", 6);
            map.put("3", 6);
            list.add(map);
        }
        JSONArray objects = JSONArray.parseArray(JSON.toJSONString(list));
        System.out.println(objects.toJSONString());


        Map<String, String> headMap = new LinkedHashMap<String, String>();
        headMap.put("1", "1");
        headMap.put("2", "2");
        headMap.put("3", "3");


        String title = "测试2";
        OutputStream outXlsx = new FileOutputStream("E://b.xlsx");
        System.out.println("正在导出xlsx....");
        Date d2 = new Date();
        ExcelUtilNew.exportExcelX(title, headMap, objects, null, 0, outXlsx);
        System.out.println("执行完毕" + (new Date().getTime() - d2.getTime()) + "ms");
        outXlsx.close();


    }


    //测试
    public static void main1(String[] args) throws IOException {
        int count = 100000;
        JSONArray ja = new JSONArray();
        for (int i = 0; i < 100000; i++) {
            Student s = new Student();
            s.setName("POI" + i);
            s.setAge(i);
            s.setBirthday(new Date());
            s.setHeight(i);
            s.setWeight(i);
            s.setSex(i / 2 == 0 ? false : true);
            ja.add(s);
        }
        Map<String, String> headMap = new LinkedHashMap<String, String>();
        headMap.put("name", "姓名");
        headMap.put("age", "年龄");
        headMap.put("birthday", "生日");
        headMap.put("height", "身高");
        headMap.put("weight", "体重");
        headMap.put("sex", "性别");

        String title = "测试";
        /*
        OutputStream outXls = new FileOutputStream("E://a.xls");
        System.out.println("正在导出xls....");
        Date d = new Date();
        ExcelUtil.exportExcel(title,headMap,ja,null,outXls);
        System.out.println("共"+count+"条数据,执行"+(new Date().getTime()-d.getTime())+"ms");
        outXls.close();*/
        //
        OutputStream outXlsx = new FileOutputStream("E://b.xlsx");
        System.out.println("正在导出xlsx....");
        Date d2 = new Date();
        ExcelUtilNew.exportExcelX(title, headMap, ja, null, 0, outXlsx);
        System.out.println("共" + count + "条数据,执行" + (new Date().getTime() - d2.getTime()) + "ms");
        outXlsx.close();
    }
}

class Student {
    private String name;
    private int age;
    private Date birthday;
    private float height;
    private double weight;
    private boolean sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public float getHeight() {
        return height;
    }

    public void setHeight(float height) {
        this.height = height;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public boolean isSex() {
        return sex;
    }

    public void setSex(boolean sex) {
        this.sex = sex;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

This code is available, the main method that appears abnormal operation: java.lang.NoClassDefFoundError: javax / servlet / ServletOutputStream package to introducing the following, this package annotations when running the program starts the deployment tomcat

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
Tools Code 2:

This code is used as a reference, because it no longer meets the needs of large data export, it will no longer be used.

package cn.xyt.util;

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

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.Region;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
//import org.apache.poi.xssf.usermodel.XSSFRow;
//import org.apache.poi.xssf.usermodel.XSSFSheet;
//import org.apache.poi.xssf.usermodel.XSSFWorkbook;


@SuppressWarnings("deprecation")
public class ExcelUtil{

    private static final Log log = LogFactory.getLog(ExcelUtil.class);

    /**
     * 创建excel
     * @param res
     * @param list
     * @param fileName
     * @throws IOException
     */
    public static void createExcel(HttpServletResponse res,List<Map<String, Object>> list,String fileName) throws IOException {
        try {
            fileName = new String(fileName.getBytes(), "ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            log.error(e);
        }
        res.setCharacterEncoding("utf-8");
        res.reset(); // 清空数据
        res.setContentType("applicatoin/octet-stream;charset=utf-8");
        res.addHeader("Content-Disposition", "attachment; filename=\""+ fileName + "\";");

        // 创建Excel的工作书册 Workbook,对应到一个excel文档
        HSSFWorkbook wb = new HSSFWorkbook();
        // 创建Excel的工作sheet,对应到一个excel文档的tab
        HSSFSheet sheet = wb.createSheet("sheet1");

        HSSFCellStyle titleStyle = wb.createCellStyle();
        HSSFCellStyle contentStyle = wb.createCellStyle();

        // 居中
        titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        titleStyle.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
        titleStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);
        contentStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        //设置字体大小
        HSSFFont font = wb.createFont();
        font.setFontName("楷书");
        font.setFontHeightInPoints((short) 15);
        font.setBoldweight((short)3);
        titleStyle.setFont(font);

        HSSFFont contentfont = wb.createFont();
        contentfont.setFontHeightInPoints((short) 11);
        contentStyle.setFont(contentfont);

        //设置自动换行
//      titleStyle.setWrapText(true);
//      contentStyle.setWrapText(true);

        // 建立新行
        HSSFRow titlerow = sheet.createRow(0);
        titlerow.setHeightInPoints(30);
        Map<String, Object> title = list.get(0);
        int i=0;
        for(String key: title.keySet()){
            HSSFCell cell = titlerow.createCell(i);
            sheet.setColumnWidth(i, 60*100);
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue(key);
            cell.setCellStyle(titleStyle);
            i++;
        }
        int j = 1;
        for (Map<String, Object> map: list) {
            HSSFRow contentrow = sheet.createRow(j);
            j++;
            contentrow.setHeightInPoints(20);
            int jj =0;
            for(String key: map.keySet()){
                HSSFCell cell = contentrow.createCell(jj);
                jj++;
                cell.setCellType(Cell.CELL_TYPE_STRING);
                String content = ""+map.get(key);
                cell.setCellValue(content);
                cell.setCellStyle(contentStyle);
            }
        }
        wb.write(res.getOutputStream());
    }



    /**
     * 生成并下载Excel
     * @param res HTTP响应
     * @param list Excel内数据
     * @param titleArray 标题数组
     * @param fileName 文件名
     */
    public static void createExcel(HttpServletResponse res,List<List<String>> list,String[] titleArray,String fileName) {
        try {
            fileName = new String(fileName.getBytes(), "ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            log.error(e);
        }
        res.setCharacterEncoding("utf-8");
        res.reset(); // 清空数据
        res.setContentType("applicatoin/octet-stream;charset=utf-8");
        res.addHeader("Content-Disposition", "attachment; filename=\""+ fileName + "\";");

        // 创建Excel的工作书册 Workbook,对应到一个excel文档
        HSSFWorkbook wb = new HSSFWorkbook();
        // 创建Excel的工作sheet,对应到一个excel文档的tab
        HSSFSheet sheet = wb.createSheet("sheet1");

        HSSFCellStyle titleStyle = wb.createCellStyle();
        HSSFCellStyle contentStyle = wb.createCellStyle();

        // 居中
        titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        contentStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        //设置字体大小
        HSSFFont font = wb.createFont();
        font.setFontName("楷书");
        font.setFontHeightInPoints((short) 15);
        font.setBoldweight((short)3);
        titleStyle.setFont(font);

        HSSFFont contentfont = wb.createFont();
        contentfont.setFontHeightInPoints((short) 11);
        contentStyle.setFont(contentfont);

        //设置自动换行
//      titleStyle.setWrapText(true);
//      contentStyle.setWrapText(true);

        // 建立新行
        HSSFRow titlerow = sheet.createRow(0);
        titlerow.setHeightInPoints(30);
        for(int i=0;i<titleArray.length;i++){
            HSSFCell cell = titlerow.createCell(i);
            sheet.setColumnWidth(i, 60 * 256);
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue(titleArray[i]);
            cell.setCellStyle(titleStyle);
        }
        for (int i=0;i<list.size();i++) {
            HSSFRow contentrow = sheet.createRow(i+1);
            contentrow.setHeightInPoints(20);
            List<String> li=list.get(i);
            for(int j=0;j<li.size();j++){
                HSSFCell cell = contentrow.createCell(j);
                cell.setCellType(Cell.CELL_TYPE_STRING);
                String content=li.get(j);
//              try {
//                  content = new String(li.get(j).getBytes("UTF-8"), "GBK");
//              } catch (UnsupportedEncodingException e) {
//                  // TODO Auto-generated catch block
//                  e.printStackTrace();
//              }
                cell.setCellValue(content);
                cell.setCellStyle(contentStyle);
            }
        }
        try {
            wb.write(res.getOutputStream());
        } catch (IOException e) {
            log.error(e);
        }
    }


    /**
     * 读取office2007之前的Excel文件(后缀为.xls)
     * @param is
     * @return
     */
    public static List<Map<String, Object>> getxls(InputStream is) {
        List<Map<String, Object>> list=new ArrayList<Map<String, Object>>();
        try {
            // 构造 XSSFWorkbook 对象,strPath 传入文件路径
            HSSFWorkbook xwb = new HSSFWorkbook(is);
            // 读取第一章表格内容
            HSSFSheet sheet = xwb.getSheetAt(0);
            // 定义 row、cell
            HSSFRow row;
            String cell;
            List<String> title=new ArrayList<String>();
            //输出表头信息
            row = sheet.getRow(0);
            if(row==null){
                return list;
            }
            for (int j = row.getFirstCellNum(); j < row.getPhysicalNumberOfCells(); j++) {
                // 通过 row.getCell(j).toString() 获取单元格内容,
                cell =row.getCell(j).toString();
                title.add(cell);
            }
            Map<String, Object> titlemap=new HashMap<String, Object>();
            titlemap.put("title", title);
            list.add(titlemap);
            // 循环输出表格中的内容
            for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {
                row = sheet.getRow(i);
                Map<String, Object> map=new HashMap<String, Object>();
                map.put("row", (i+1));
                for (int j = row.getFirstCellNum(); j < title.size(); j++) {
                    // 通过 row.getCell(j).toString() 获取单元格内容,
                    if(row.getCell(j)==null){
                        continue;
                    }
                    row.getCell(j).setCellType(Cell.CELL_TYPE_STRING);
                    cell=row.getCell(j).toString();
                    map.put(title.get(j), cell);
                    map.put(title.get(j), cell);
                }
                list.add(map);
            }
        } catch (Exception e) {
            log.error(e);
        }
        return list;
    }

    /**
     * 读取office2007以后(包括)的Excel文件(后缀为.xlsx)
     * @param is
     * @return
     */
//  public static List<Map<String, Object>> getxlsx(InputStream is) {
//      List<Map<String, Object>> list=new ArrayList<Map<String, Object>>();
//      try {
//          // 构造 XSSFWorkbook 对象,strPath 传入文件路径
//          XSSFWorkbook xwb = new XSSFWorkbook(is);
//          // 读取第一章表格内容
//          XSSFSheet sheet = xwb.getSheetAt(0);
//          // 定义 row、cell
//          XSSFRow row;
//          String cell;
//          List<String> title=new ArrayList<String>();
//          //输出表头信息
//          row = sheet.getRow(0);
//          if(row==null){
//              return list;
//          }
//          for (int j = row.getFirstCellNum(); j < row.getPhysicalNumberOfCells(); j++) {
//              // 通过 row.getCell(j).toString() 获取单元格内容,
//              cell = row.getCell(j).toString();
//              title.add(cell);
//          }
//          Map<String, Object> titlemap=new HashMap<String, Object>();
//          titlemap.put("title", title);
//          list.add(titlemap);
//          
//          // 循环输出表格中的内容
//          for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++) {
//              row = sheet.getRow(i);
//              Map<String, Object> map=new HashMap<String, Object>();
//              map.put("row", (i+1));
//              for (int j = row.getFirstCellNum(); j < title.size(); j++) {
//                  // 通过 row.getCell(j).toString() 获取单元格内容,
//                  if(row.getCell(j)==null){
//                      continue;
//                  }
//                  row.getCell(j).setCellType(Cell.CELL_TYPE_STRING); 
//                  cell=row.getCell(j).toString();
//                  map.put(title.get(j), cell);
//              }
//              list.add(map);
//          }
//      } catch (Exception e) {
//          e.printStackTrace();
//      }
//      return list;
//  }




    /**
     * 生成并下载Excel(带合并单元格)
     * @param res HTTP响应
     * @param list Excel内数据
     * @param titleArray 标题数组
     * @param fileName 文件名
     */
    public static void createMergeExcel(HttpServletResponse res,List<List<String>> list,String[] titleArray,String fileName) {
        try {
            fileName = new String(fileName.getBytes(), "ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            log.error(e);
        }
        res.setCharacterEncoding("utf-8");
        res.reset(); // 清空数据
        res.setContentType("applicatoin/octet-stream;charset=utf-8");
        res.addHeader("Content-Disposition", "attachment; filename=\""+ fileName + "\";");

        // 创建Excel的工作书册 Workbook,对应到一个excel文档
        HSSFWorkbook wb = new HSSFWorkbook();
        // 创建Excel的工作sheet,对应到一个excel文档的tab
        HSSFSheet sheet = wb.createSheet("sheet1");

        HSSFCellStyle titleStyle = wb.createCellStyle();
        HSSFCellStyle contentStyle = wb.createCellStyle();

        // 居中
        titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        contentStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        contentStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

        //设置字体大小
        HSSFFont font = wb.createFont();
        font.setFontName("楷书");
        font.setFontHeightInPoints((short) 15);
        font.setBoldweight((short)3);
        titleStyle.setFont(font);

        HSSFFont contentfont = wb.createFont();
        contentfont.setFontHeightInPoints((short) 11);
        contentStyle.setFont(contentfont);

        //设置自动换行
//      titleStyle.setWrapText(true);
//      contentStyle.setWrapText(true);

        // 建立新行
        HSSFRow titlerow = sheet.createRow(0);
        titlerow.setHeightInPoints(30);
        for(int i=0;i<titleArray.length;i++){
            HSSFCell cell = titlerow.createCell(i);
            sheet.setColumnWidth(i, 50 * 256);
            cell.setCellType(Cell.CELL_TYPE_STRING);
            cell.setCellValue(titleArray[i]);
            cell.setCellStyle(titleStyle);
        }

        int begin=1;
        int end=1;
        for (int i=0;i<list.size();i++) {
            HSSFRow contentrow = sheet.createRow(begin);
            contentrow.setHeightInPoints(20);
            List<String> li=list.get(i);

            //TODO 优化
            for(int j=0;j<=3;j++){
                int cnt=Integer.parseInt(li.get(3));
                end=begin+(cnt-1);
                //合并单元格(new Region(从第几行,(short)第几列,到第几行,(short)第几列))行列下标都从0开始
                sheet.addMergedRegion(new Region(begin,(short)j,end,(short)j));
                HSSFCell cell = contentrow.createCell(j);
                cell.setCellType(Cell.CELL_TYPE_STRING);
                String content=li.get(j);
                cell.setCellValue(content);
                cell.setCellStyle(contentStyle);
            }
            String[] u=li.get(4).split("\r\n");
            for(int j=0;j<u.length;j++){
                String[] contentarr=u[j].split(",");
                for(int z=0;z<contentarr.length;z++){
                    HSSFCell cell = contentrow.createCell(z+4);
                    cell.setCellType(Cell.CELL_TYPE_STRING);
                    String content=contentarr[z];
                    cell.setCellValue(content);
                    cell.setCellStyle(contentStyle);
                }
                contentrow = sheet.createRow(begin+j+1);
                contentrow.setHeightInPoints(20);
            }
            begin=end+1;
        }
        try {
            wb.write(res.getOutputStream());
        } catch (IOException e) {
            log.error(e);
        }
    }
}

Guess you like

Origin www.cnblogs.com/zongJianKun/p/10956223.html