关于poi导出excel三种方式HSSFWorkbook

关于poi导出excel三种方式HSSFWorkbook,SXSSFWorkbook,csv的总结 poi导出excel最常用的是第一种方式HSSFWorkbook,不过这种方式数据量大的话会产生内存溢出问题,SXSSFWorkbook是一种大数据量导出格式,csv是另一种excel导出的一种轻快的实现。先介绍一下这三种格式的特点1 HSSFWorkbook  excel文件底层是txt实现,我们经常见到的excel都是这种实现的。2 SXSSFWorkbook  excel文件底层是xml实现,同样的数据量,大约是第一种的1/6-1/4之间3 csv 这个比较新潮,数据量应该更小,可以百度。一 HSSFWorkbook 实现Map dataMap = service.AssignMiddleExcel(page);
ObjectExcelView erv = new ObjectExcelView(“逾期客户表”); //执行excel操作
mv = new ModelAndView(erv,dataMap);dataMap 是个map ,包含两个键值对 一个是标题列 Map dataMap = new HashMap();
List titles = new ArrayList();

  titles.add("借款人姓名");        //1
  titles.add("身份证号");         //2
  titles.add("借款人手机号");   dataMap.put("titles", titles);

这是标题列
vpd是个mapvpd.put(“var1”, userList.get(i).getString(“realName”)); //1
vpd.put(“var2”, userList.get(i).getString(“contIdCard”)); //2
vpd.put(“var3”, userList.get(i).getString(“telephone”)); //3List varList = new ArrayList();PageData就是个HashMapvarList.add(vpd);dataMap.put(“varList”, varList);
这就是dataMap的由来

public class ObjectExcelView extends AbstractExcelView{

private String fileName;

public ObjectExcelView(){

}
public ObjectExcelView(String fileName){

  this.fileName = fileName;

}

@Override
protected void buildExcelDocument(Map model,
HSSFWorkbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
//String fileName = “逾期客户表-待催收”;
HSSFSheet sheet;
HSSFCell cell;
response.setContentType(“application/x-download”);//下面三行是关键代码,处理乱码问题
response.setCharacterEncoding(“utf-8”);
response.setHeader(“Content-Disposition”, “attachment;filename=”+new String(fileName.getBytes(“gbk”), “iso8859-1”)+".xls");
sheet = workbook.createSheet(“sheet1”);

  List titles = (List) model.get("titles");
  int len = titles.size();
  HSSFCellStyle headerStyle = workbook.createCellStyle(); //标题样式
  headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  HSSFFont headerFont = workbook.createFont();   //标题字体
  headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  headerFont.setFontHeightInPoints((short)11);
  headerStyle.setFont(headerFont);
  short width = 20,height=25*20;
  sheet.setDefaultColumnWidth(width);
  for(int i=0; i varList = (List) model.get("varList");
  int varCount = varList.size();
  for(int i=0; i

}

}

二 SXSSFWorkbook  @RequestMapping("/excel111")
public Object exportExcel(Page page,HttpServletRequest request,HttpServletResponse response){
PageData pd = new PageData();
pd = this.getPageData();
try{
//检索条件===========
PageData pageData = service.setPdWithTrim(this.getPageData());
page.setPd(pageData);
//检索条件===========
Map dataMap = service.AssignMiddleExcel(page);
OutputStream outputStream = response.getOutputStream();
String sheetName = “逾期客户表”;
List list = (List)dataMap.get(“titles”);
String[] headers = new String[list.size()];
for(int i = 0;i headers[i]=list.get(i);
}
List dataList = new ArrayList<>();
List varList = new ArrayList();
varList = (List)dataMap.get(“varList”);

    varList.forEach(e ->{
        List ObjectList =  new ArrayList<>();
        for(int i=0;i 
  

}

package com.fh.controller.assign_out;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.springframework.util.StringUtils;
/**

  • Created by dell、 on 2017/10/12.
    */
    public class ExportUtil {
    private SXSSFWorkbook wb = null;//大数据导出格式

    private Sheet sheet = null;

    private String sheetName;

    private String[] headers;//表头字段

    private List dataList = new ArrayList();//表内容数据
    //构造
    public ExportUtil(SXSSFWorkbook wb, Sheet sheet) {
    this.wb = wb;
    this.sheet = sheet;
    }
    //构造
    public ExportUtil(String sheetName, String[] headers, List dataList) {
    this.dataList = dataList;
    this.headers = headers;
    this.sheetName = sheetName;
    }
    //不知道做什么
    public void setRegionStyle(CellRangeAddress region, XSSFCellStyle cs) {
    int toprowNum = region.getFirstRow();
    for (int i = toprowNum; i <= region.getLastRow(); i++) {
    SXSSFRow row = (SXSSFRow) sheet.getRow(i);

         for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {
             SXSSFCell cell = (SXSSFCell) row.getCell(j);
             cell.setCellStyle(cs);
         }
     }
    

    }

    // 设置表头的单元格样式
    public CellStyle getHeadStyle() {
    // 创建单元格样式
    CellStyle cellStyle = wb.createCellStyle();
    // 设置单元格的背景颜色为淡蓝色
    cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
    // 设置填充字体的样式
    cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);

     // 设置单元格居中对齐
     cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
    
     // 设置单元格垂直居中对齐
     cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
    
     // 创建单元格内容显示不下时自动换行
     cellStyle.setWrapText(false);
    
     // 设置单元格字体样式
     XSSFFont font = (XSSFFont) wb.createFont();
     // font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗
     font.setFontName("宋体");// 设置字体的样式
     font.setFontHeight(14);// 设置字体的大小
     cellStyle.setFont(font);// 将字体填充到表格中去
    
     // 设置单元格边框为细线条(上下左右)
     cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
    
     return cellStyle;
    

    }

    // 设置表体的单元格样式
    public CellStyle getBodyStyle() {
    // 创建单元格样式
    CellStyle cellStyle = wb.createCellStyle();
    // 设置单元格居中对齐
    cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
    // 设置单元格居中对齐
    cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
    // 创建单元格内容不显示自动换行
    cellStyle.setWrapText(false);
    // 设置单元格字体样式
    XSSFFont font = (XSSFFont) wb.createFont();
    font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗
    font.setFontName(“宋体”);// 设置字体
    font.setFontHeight(12);// 设置字体的大小
    cellStyle.setFont(font);// 将字体添加到表格中去

     // 设置单元格边框为细线条
     cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
    
     return cellStyle;
    

    }
    //似乎没用到
    public Cell setHeadStyle(String[] titles) {
    Cell cell = null;

     CellStyle headStyle = getHeadStyle();
    
     Row headRow = sheet.createRow(0);
     // 构建表头
     for (int i = 0; i < titles.length; i++) {
         cell = headRow.createCell(i);
         cell.setCellStyle(headStyle);
         cell.setCellValue(titles[i]);
     }
     return cell;
    

    }

    /*

    • 导出数据
      /
      public SXSSFWorkbook export() throws Exception {
      // String nsheetName = new String(sheetName.getBytes(“UTF-8”));
      /

      * response.setCharacterEncoding(“utf-8”);
      * response.setContentType(“application/x-msdownload”);
      * response.setHeader(“Content-disposition”, “attachment; filename=” +
      * sheetName + “.xlsx”);// 组装附件名称和格式
      */
      Integer rowaccess = 1000;// 内存中缓存记录行数,以免内存溢出

      SXSSFWorkbook workbook = new SXSSFWorkbook(rowaccess);
      try {

        Sheet sheet = workbook.createSheet(sheetName);
      
        // 产生表格标题行
        Row titleRow = sheet.createRow(0);
        Cell cellTiltle = titleRow.createCell(0);
        CellStyle columnTopStyle = this.getColumnTopStyle(workbook);// 获取列头样式对象
        sheet.setDefaultColumnWidth(100);
        sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, (headers.length - 1)));
        cellTiltle.setCellStyle(columnTopStyle);
        cellTiltle.setCellValue(sheetName);
      
        Cell cell = null;
      
        CellStyle headStyle = this.getHeadStyle(workbook);
      
        // 定义所需列数
        int columnNum = headers.length;
        Row headRow = sheet.createRow(2); // 在索引2的位置创建行(最顶端的行开始的第二行)
      
        //表头
        for (int n = 0; n < columnNum; n++) {
            Cell cellRowName = headRow.createCell(n); // 创建列头对应个数的单元格
            cellRowName.setCellType(HSSFCell.CELL_TYPE_STRING); // 设置列头单元格的数据类型
            HSSFRichTextString text = new HSSFRichTextString(headers[n]);
            cellRowName.setCellValue(headers[n]); // 设置列头单元格的值
            cellRowName.setCellStyle(headStyle); // 设置列头单元格样式
            sheet.setColumnWidth(n,256*20);
        }
      
        CellStyle bodyStyle = this.getBodyStyle(workbook);
      
        // 表体数据
        for (int i = 0; i < dataList.size(); i++) {
      
            Object[] obj = dataList.get(i);
            Row row = sheet.createRow(i + 3);// 创建所需的行数
      
            for (int j = 0; j < obj.length; j++) {
      
                cell = row.createCell(j);
                String str = String.valueOf(StringUtils.isEmpty(obj[j]) ? "" : obj[j]);
                cell.setCellValue(str); // 单元格的值
                cell.setCellStyle(bodyStyle); // 单元格的样式
            }
        }
      

      } catch (Exception e) {
      e.printStackTrace();
      }

      return workbook;
      }

    // 设置表头的单元格样式
    public CellStyle getHeadStyle(SXSSFWorkbook workbook) {
    // 创建单元格样式
    CellStyle cellStyle = workbook.createCellStyle();

     // 设置单元格的背景颜色为淡蓝色
     cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
     // 设置填充字体的样式
     cellStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
    
     // 设置单元格居中对齐
     cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
    
     // 设置单元格垂直居中对齐
     cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
     // cellStyle.setShrinkToFit(true);
     // 创建单元格内容显示不下时自动换行
     //cellStyle.setWrapText(true);
    
     // 设置单元格字体样式
     XSSFFont font = (XSSFFont) workbook.createFont();
     //  font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗
     font.setFontName("宋体");// 设置字体的样式
     font.setFontHeight(12);// 设置字体的大小
     cellStyle.setFont(font);// 将字体填充到表格中去
    
     // 设置单元格边框为细线条(上下左右)
     cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
    
     return cellStyle;
    

    }

    // 设置表体的单元格样式
    public CellStyle getBodyStyle(SXSSFWorkbook workbook) {
    // 创建单元格样式
    CellStyle cellStyle = workbook.createCellStyle();
    // 设置单元格居中对齐
    cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
    // 设置单元格居中对齐
    cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
    // 创建单元格内容不显示自动换行
    //cellStyle.setWrapText(true);
    // 设置单元格字体样式
    XSSFFont font = (XSSFFont) workbook.createFont();
    // font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);// 这是字体加粗
    font.setFontName(“宋体”);// 设置字体
    font.setFontHeight(10);// 设置字体的大小
    cellStyle.setFont(font);// 将字体添加到表格中去

     // 设置单元格边框为细线条
     cellStyle.setBorderLeft(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderBottom(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderRight(XSSFCellStyle.BORDER_THIN);
     cellStyle.setBorderTop(XSSFCellStyle.BORDER_THIN);
    
     return cellStyle;
    

    }

    public Cell setHeadStyle(String[] titles, SXSSFWorkbook workbook) {
    Cell cell = null;

     CellStyle headStyle = getHeadStyle(workbook);
    
     Row headRow = sheet.createRow(0);
     // 构建表头
     for (int i = 0; i < titles.length; i++) {
         cell = headRow.createCell(i);
         cell.setCellStyle(headStyle);
         cell.setCellValue(titles[i]);
     }
     return cell;
    

    }

    /*

    • 列头单元格样式
      */
      public CellStyle getColumnTopStyle(SXSSFWorkbook workbook) {

      // 设置字体
      Font font = workbook.createFont();
      // 设置字体大小
      font.setFontHeightInPoints((short) 18);
      // 字体加粗
      font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
      // 设置字体名字
      font.setFontName(“Courier New”);
      // 设置样式;
      CellStyle style = workbook.createCellStyle();
      // 设置底边框;
      style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
      // 设置底边框颜色;
      style.setBottomBorderColor(HSSFColor.BLACK.index);
      // 设置左边框;
      style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
      // 设置左边框颜色;
      style.setLeftBorderColor(HSSFColor.BLACK.index);
      // 设置右边框;
      style.setBorderRight(HSSFCellStyle.BORDER_THIN);
      // 设置右边框颜色;
      style.setRightBorderColor(HSSFColor.BLACK.index);
      // 设置顶边框;
      style.setBorderTop(HSSFCellStyle.BORDER_THIN);
      // 设置顶边框颜色;
      style.setTopBorderColor(HSSFColor.BLACK.index);
      // 在样式用应用设置的字体;
      style.setFont(font);
      // 设置自动换行;
      style.setWrapText(false);
      // 设置水平对齐的样式为居中对齐;
      style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
      // 设置垂直对齐的样式为居中对齐;
      style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

      return style;

    }
    }

三 csv/*

  • 导出委外催收中EXCEL 大数据量csv导出

  • @return
    */
    @RequestMapping("/excel")
    public Object exportExcel111(Page page, HttpServletResponse response ) {
    PageData pd = new PageData();
    pd = this.getPageData();
    try {
    //检索条件===========
    PageData pageData = service.setPdWithTrim(this.getPageData());
    page.setPd(pageData);
    //检索条件===========
    Map dataMap = service.AssignMiddleExcel(page);
    String sheetName = “逾期客户表”;
    List headlist = (List)dataMap.get(“titles”);
    List dataList = new ArrayList<>();
    List varList = new ArrayList();
    varList = (List)dataMap.get(“varList”);

      varList.forEach(e ->{
          List ObjectList =  new ArrayList<>();
          for(int i=0;i 

    }catch (Exception e){
    e.printStackTrace();
    }
    return new Object();
    }package com.fh.controller.assign_out;

    import javax.servlet.http.HttpServletRequest;
    import java.io.;
    import java.util.
    ;

    /**

    • Created by dell、 on 2017/10/12.
      /
      public class CSVUtils {
      /
      *

      • CSV文件生成方法

      • @param head

      • @param dataList

      • @param filename

      • @return
        */
        public static File createCSVFile(List head, List dataList,
        String filename) {

        File csvFile = null;
        BufferedWriter csvWtriter = null;
        try {
        csvFile = new File( “temp123/”+ File.separator + filename + “.csv”);
        File parent = csvFile.getParentFile();
        if (parent != null && !parent.exists()) {
        parent.mkdirs();
        }
        csvFile.createNewFile();

         // GB2312使正确读取分隔符","
         csvWtriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(
                 csvFile), "GB2312"), 1024);
         // 写入文件头部
         writeRow(head, csvWtriter);
        
         // 写入文件内容
         for (List row : dataList) {
             writeRow(row, csvWtriter);
         }
         csvWtriter.flush();
         

        } catch (Exception e) {
        e.printStackTrace();
        } finally {
        try {
        csvWtriter.close();
        } catch (IOException e) {
        e.printStackTrace();
        }
        }
        return csvFile;
        }

        /**

        • 写一行数据方法

        • @param row

        • @param csvWriter

        • @throws IOException
          /
          private static void writeRow(List row, BufferedWriter csvWriter) throws IOException {
          // 写入文件头部
          for (Object data : row) {
          StringBuffer sb = new StringBuffer();
          String rowStr = sb.append(""").append(data).append("",").toString();
          csvWriter.write(rowStr);
          }
          csvWriter.newLine();
          }
          public static File createCSVFile(HttpServletRequest request){
          List< Map> list = new ArrayList<>();
          for(int i =0;i<10;i++){
          Map mao = new HashMap<>();
          mao.put(“cutomerName”,“zhangsan”+i);
          mao.put(“cutomerNam1”,“zhangsan”+i);
          mao.put(“cutomerNam2”,“zhangsan”+i);
          mao.put(“cutomerNam3”,“zhangsan”+i);
          mao.put(“cutomerNam4”,“zhangsan”+i);
          mao.put(“cutomerNam5”,“zhangsan”+i);
          mao.put(“cutomerNam6”,“zhangsan”+i);
          mao.put(“cutomerNam7”,“zhangsan”+i);
          mao.put(“cutomerNam8”,“zhangsan”+i);
          mao.put(“cutomerNam9”, “2017-10-17 22:33:33 12.00”);
          mao.put(“cutomerNam10”,555555556);
          /
          mao.put(“cutomerNam11”,“zhangsan”+i);
          mao.put(“cutomerNam12”,“zhangsan”+i);
          mao.put(“cutomerNam13”,“zhangsan”+i);
          mao.put(“cutomerNam14”,“zhangsan”+i);
          mao.put(“cutomerNam15”,“zhangsan”+i);
          mao.put(“cutomerNam16”,“zhangsan”+i);
          mao.put(“cutomerNam17”,“zhangsan”+i);
          mao.put(“cutomerNam18”,“zhangsan”+i);
          mao.put(“cutomerNam19”,“zhangsan”+i);
          mao.put(“cutomerNam20”,“zhangsan”+i);
          mao.put(“cutomerNam21”,“zhangsan”+i);
          mao.put(“cutomerNam22”,“zhangsan”+i);
          mao.put(“cutomerNam23”,“zhangsan”+i);
          mao.put(“cutomerNam24”,“zhangsan”+i);
          mao.put(“cutomerNam25”,“zhangsan”+i);
          mao.put(“cutomerNam26”,“zhangsan”+i);
          mao.put(“cutomerNam27”,“zhangsan”+i);
          mao.put(“cutomerNam28”,“zhangsan”+i);
          mao.put(“cutomerNam29”,“zhangsan”+i);
          mao.put(“cutomerNam30”,“zhangsan”+i);
          mao.put(“cutomerNam31”,“zhangsan”+i);
          mao.put(“cutomerNam32”,“zhangsan”+i);
          mao.put(“cutomerNam33”,“zhangsan”+i);
          mao.put(“cutomerNam34”,“zhangsan”+i);
          mao.put(“cutomerNam35”,“zhangsan”+i);
          mao.put(“cutomerNam36”,“zhangsan”+i);
          mao.put(“cutomerNam37”,“zhangsan”+i);
          mao.put(“cutomerNam38”,“zhangsan”+i);
          mao.put(“cutomerNam39”,“zhangsan”+i);
          mao.put(“cutomerNam40”,“zhangsan”+i);
          mao.put(“cutomerNam41”,“zhangsan”+i);
          mao.put(“cutomerNam42”,“zhangsan”+i);
          mao.put(“cutomerNam43”,“zhangsan”+i);
          mao.put(“cutomerNam44”,“zhangsan”+i);
          mao.put(“cutomerNam45”,“zhangsan”+i);*/
          list.add(mao);
          }

          // 设置表格头
          Object[] head = {“客户姓名”, “证件类型”, “证件号码”, “银行账号”, “理财账号”, “客户类型”, “风险等级”, “归属状况”, “归属机构”, “客户经理”, “营销比例(%)” };
          List headList = Arrays.asList(head);
          // 设置数据
          List dataList = new ArrayList();
          List rowList = null;
          for (int i = 0; i < list.size(); i++) {
          rowList = new ArrayList();
          Map maovo = list.get(i);
          rowList.add(maovo.get(“cutomerName”));
          rowList.add(maovo.get(“cutomerNam1”));
          rowList.add(maovo.get(“cutomerNam2”));
          rowList.add(maovo.get(“cutomerNam3”));
          rowList.add(maovo.get(“cutomerNam4”));
          rowList.add(maovo.get(“cutomerNam5”));
          rowList.add(maovo.get(“cutomerNam6”));
          rowList.add(maovo.get(“cutomerNam7”));
          rowList.add(maovo.get(“cutomerNam8”));
          rowList.add(maovo.get(“cutomerNam9”));
          rowList.add(maovo.get(“cutomerNam10”));
          dataList.add(rowList);
          }
          // 导出文件路径
          // String downloadFilePath = request.getContextPath();
          // 导出文件名称
          String fileName = “客户列表_”;
          // 导出CSV文件
          File csvFile = CSVUtils.createCSVFile(headList, dataList, fileName);
          return csvFile;
          }
          }

        你可能感兴趣的:(关于poi导出excel三种方式HSSFWorkbook)