package com.numa.util;

import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.util.HSSFColor;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.net.InetAddress;import java.util.List;import java.util.Map;

/** * @Company:wftdlx * @Author: wjf * @Description: 一次性插入  SXSSFWorkbook  存在溢出 * @Date: Created in 14:47 2018/12/13 */public class SXSSExcelUtil {

    public static SXSSFWorkbook createWb() {        SXSSFWorkbook wb = new SXSSFWorkbook();        return wb;    }

    public static void createSheet(SXSSFWorkbook wb, String sheetx, String[] listTitle, List<Map<Integer, String>> list)            throws Exception {        //整体        CellStyle cellStyle = wb.createCellStyle();       // cellStyle.setAlignment(SXSSFCellStyle.ALIGN_CENTER); // 水平居中        cellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中        cellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); // 垂直居中

        //第一行        CellStyle titleCellStyle = wb.createCellStyle();        Font font = wb.createFont();        font.setColor(HSSFColor.GREEN.index);        titleCellStyle.setFont(font);        titleCellStyle.setAlignment(CellStyle.ALIGN_CENTER); // 水平居中        titleCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER); // 垂直居中

        Sheet sheet = wb.createSheet(sheetx);

        //冻结首行        sheet.createFreezePane(0, 1, 0, 1);        //sheet.createFreezePane(1, 1, 1, 1);//

        Row     row0 = sheet.createRow(0);

        //listSize 总列数  标题列=正文列        int listSize = listTitle.length;        //输入标题栏        for (int j = 0; j < listSize; j++) {// 5列            Cell cell = row0.createCell((short) j);            cell.setCellValue(listTitle[j].toString());            cell.setCellStyle(titleCellStyle);        }        CellRangeAddress region = new CellRangeAddress(0, 0, 10, 13);        sheet.addMergedRegion(region);        //rowSize总行数 不加标题        int rowSize = list.size();        // 从第二行输入  或者说输入数据的第一行 先创建再放值        for (int i = 0; i < rowSize; i++) { // 几行  总体大循环            //String[] listRow = list.get(i);  //一行数据            Map<Integer, String> map = list.get(i);            Row row = sheet.createRow(i + 1);//创建同一个序列号的第一行            for (int p = 0; p < map.size(); p++) {                Cell cell = row.createCell(p);                cell.setCellValue(map.get(p));//填充数值 包含合并列  后面在合并                cell.setCellStyle(cellStyle);            }            //=========================前 前17列合并            int j = 0;//相同行            String serial = map.get(0);            for (int k = i + 1; k < rowSize; k++) {//查前17列重                Map<Integer, String> _map = list.get(k);                String _serial = _map.get(0);                if (serial.equals(_serial)) {                    j++;                } else {                    break;                }            }            if (j > 0) {                for (int p = 0; p < 17; p++) {                    CellRangeAddress cra = new CellRangeAddress(i + 1, i + j + 1, p, p);                    sheet.addMergedRegion(cra);//合并                }

            }            //===========================中 创建中间段 17--到倒数1列            for (int k = 0; k < j; k++) {                Map<Integer, String> _map1 = list.get(i + 1 + k);                Row _row = sheet.createRow(i + 1 + k + 1);//创建行

                for (int p = 17; p < _map1.size() - 1; p++) {                    Cell cell = _row.createCell(p);

                    cell.setCellValue(_map1.get(p));                    cell.setCellStyle(cellStyle);                }            }            //===========================后 最后一行的合并            if (j > 0) {                CellRangeAddress cra = new CellRangeAddress(i + 1, i + j + 1, map.size() - 1, map.size() - 1);                sheet.addMergedRegion(cra);//合并            }            i += j;        }        setSheet(sheet, listSize);    }

    // 自适应宽度(中文支持)  注意输入完成输入内容后起作用  size单元格总列数    private static void setSheet(Sheet sheet, int size) {        for (int columnNum = 0; columnNum < size; columnNum++) {            int columnWidth = sheet.getColumnWidth(columnNum) / 256;            for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {                Row currentRow;                //当前行未被使用过                if (sheet.getRow(rowNum) == null) {                     currentRow = sheet.createRow(rowNum);                } else {                    currentRow = sheet.getRow(rowNum);                }

                if (currentRow.getCell(columnNum) != null) {                   Cell currentCell = currentRow.getCell(columnNum);                    if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {                        int length = currentCell.getStringCellValue().getBytes().length;                        if (columnWidth < length) {                            columnWidth = length;                        }                    }                }            }            sheet.setColumnWidth(columnNum, columnWidth * 256);        }    }

    //主动设置单元格宽度  /*  public static void setSheet(SXSSFSheet sheet) {

       sheet.setColumnWidth(0, 256 * 34 + 184);//列宽        sheet.setColumnWidth(2, 256 * 19 + 184);//列宽        sheet.setColumnWidth(5, 256 * 25 + 184);//列宽        sheet.setColumnWidth(6, 256 * 19 + 184);//列宽        sheet.setColumnWidth(7, 256 * 16 + 184);//列宽        sheet.setColumnWidth(13, 256 * 40 + 184);//列宽        sheet.setColumnWidth(17, 256 * 12 + 184);//列宽        sheet.setColumnWidth(18, 256 * 18 + 184);//列宽*//*    }*/

    //1.输出流到客户端    public static void outExcel(HttpServletResponse response, SXSSFWorkbook wb, String excelName) throws IOException {        ByteArrayOutputStream os = new ByteArrayOutputStream();        wb.write(os);        byte[] content = os.toByteArray();        InputStream is = new ByteArrayInputStream(content);        // 设置response参数,可以打开下载页面        response.reset();        response.setContentType("application/force-download;charset=utf-8");        response.setHeader("Content-Disposition",                "attachment;filename=" + new String((excelName + ".xls").getBytes(), "iso-8859-1"));        ServletOutputStream out = response.getOutputStream();        BufferedInputStream bis = null;        BufferedOutputStream bos = null;        try {            bis = new BufferedInputStream(is);            bos = new BufferedOutputStream(out);            byte[] buff = new byte[2048];            int bytesRead;            // Simple read/write loop.            while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {                bos.write(buff, 0, bytesRead);            }        } catch (Exception e) {            // TODO: handle exception            Log.error("输出到客户端异常" + e.getMessage());        } finally {            if (bis != null)                bis.close();            if (bos != null)                bos.close();        }    }

    public static String outExcel4(SXSSFWorkbook wb) throws Exception {        String pathx = Url.getPath();        long l = System.currentTimeMillis();        String path = pathx + "\\files\\" + l + ".xlsx";

        File file = new File(path);        if (!file.exists()) {// 判断文件是否存在            if (file.createNewFile()) {// 创建目标文件                FileOutputStream fos = new FileOutputStream(file);                wb.write(fos);                fos.close();            }        }

        InetAddress localHostLANAddress = LocalIp.getLocalHostLANAddress();        String address=localHostLANAddress.getHostAddress();        String url = "http://"+address+":" + 9091 + "/files/" + l + ".xlsx";//本地运行项目        return url;    }

}

SXSSExcelUtil的更多相关文章

  1. excel 数据量较大边查询边输入到excel表格中

    public Resultmodel getexpenseMessagx(HttpServletResponse response, String date1, String date2) { lon ...

随机推荐

  1. 通俗理解caller和callee

    caller 返回一个调用当前函数的引用: callee 返回一个正在被执行函数的引用: 举个例子: 当前有函数 a() 直接使用了caller 方法: b() 直接使用了callee方法: ca() ...

  2. Maven更新后本地仓库jar后缀带有 lastUpdated

    Maven在下载仓库中找不到相应资源时,会生成一个.lastUpdated为后缀的文件 1.需要通过mvn compile -U查明下载失败的原因,一般就是setting.xml中的配置问题 2.注意 ...

  3. 《GPU高性能编程CUDA实战》第五章 线程并行

    ▶ 本章介绍了线程并行,并给出四个例子.长向量加法.波纹效果.点积和显示位图. ● 长向量加法(线程块并行 + 线程并行) #include <stdio.h> #include &quo ...

  4. linux 考试2

  5. Flex学习笔记--多层菜单按钮

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  6. LinkedHashMap结构get和put源码流程简析及LRU应用

    原理这篇讲得比较透彻Java集合之LinkedHashMap. 本文属于源码阅读笔记,因put,get调用逻辑及链表维护逻辑复杂(至少网上其它文章的逻辑描述及配图,我都没看明白LinkedHashMa ...

  7. Mysql 预查询处理 事务机制

    预处理 PDO支持sql预处理功能,可以有效的防止sql注入的问题 例如: 以下操作会导致数据表中所有数据删除 $host = 'localhost'; $port = 3306; $dbname = ...

  8. 为什么我希望用C而不是C++来实现ZeroMQ

    原文在这里 开始前我要先做个澄清:这篇文章同Linus Torvalds这种死忠C程序员吐槽C++的观点是不同的.在我的整个职业生涯里我都在使用C++,而且现在C++依然是我做大多数项目时的首选编程语 ...

  9. Netbeans使用技巧

    Html代码中的图片.JS.CSS等的引用,不再需要手动输入,非常好用! 直接将你要引用的文件用鼠标拖拽到当中.即使图片.JS.CSS与自己的Html不在同一目录下,Netbeans也会自动为你添加引 ...

  10. html _ 提取html片段内的纯文本

    var html = “html字符串”;var textstr =html.replace(/<[^>]*>|/g,"");//纯文本