zoukankan      html  css  js  c++  java
  • 下载EXCEL文件Utils

    下载EXCEL文件Utils

    import jxl.*;
    import jxl.biff.DisplayFormat;
    import jxl.format.Alignment;
    import jxl.format.BoldStyle;
    import jxl.format.Border;
    import jxl.format.BorderLineStyle;
    import jxl.format.*;
    import jxl.format.VerticalAlignment;
    import jxl.write.*;
    import jxl.write.biff.RowsExceededException;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.log4j.LogManager;
    import org.apache.log4j.Logger;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.File;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Pattern;
    import java.lang.Boolean;
    
    /**
     * 下载EXCEL文件
     * 
     */
    @SuppressWarnings("deprecation")
    public class DownloadExcelUtil {
        private static final Logger log        = LogManager.getLogger(DownloadExcelUtil.class);
    
        private Integer            icol       = 0;                                       // 记录列
        private Integer            irow       = -1;                                      // 记录行
        private OutputStream       os;                                                   // 获得输出流
        private WritableWorkbook   wbook;                                                // 创建excel文件
        private WritableSheet      wsheet;                                               // 工作表
        private WritableCellFormat wcfFC;                                                // 单元格样式
        private WritableFont       wfont;                                                // 字体样式
    
        private Integer            trow       = -1;
        private Integer            titleCols  = 0;
        private long               startTime;
        private int                sheetIndex = 0;
        private String             sheetName;
    
        /**
         * 设置文件名和工作表名(Excel)
         * 
         * @param response
         *            为NULL时,写入磁盘
         * @param fileName
         *            文件名
         * @param sheetName
         *            工作表名
         * @throws IOException
         */
        public DownloadExcelUtil(HttpServletResponse response, String fileName, String sheetName)
                                                                                               throws IOException {
            startTime = System.currentTimeMillis();
            if (fileName.indexOf(".xls") < 0) {
                fileName += ".xls";
            }
            if (response != null && response instanceof HttpServletResponse) {
                log.warn("Write Excel To Memory.Please wait...");
                response.reset();
                response.setContentType("application/vnd.ms-excel;charset=UTF-8");
                response.setHeader("Content-Disposition",
                    "attachment;filename=" + new String(fileName.getBytes("GB2312"), "ISO8859-1"));
    
                os = response.getOutputStream();// 获得输出流
                os.flush();
                wbook = Workbook.createWorkbook(os); // 创建excel文件
            } else {
                log.warn("Write Excel To Disk.Please wait...");
                wbook = Workbook.createWorkbook(new File(fileName)); // 创建excel文件
            }
            this.sheetName = sheetName;
            wsheet = wbook.createSheet(sheetName, sheetIndex++); // sheet名称
        }
    
        public void addSheet(String sheetName) {
            irow = -1;
            this.sheetName = sheetName;
            wsheet = wbook.createSheet(sheetName, sheetIndex++);
        }
    
        /**
         * 设置报表标题
         * 
         * @param reportTitle
         *            报表标题
         * @throws IOException
         * @throws WriteException
         * @throws WriteException
         */
        public void setReportTitle(String reportTitle) throws WriteException, IOException {
            try {
                irow++;
                wfont = new WritableFont(WritableFont.createFont("宋体"), 12, WritableFont.BOLD, false,
                    UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
                wcfFC = new WritableCellFormat(wfont);
                wcfFC.setAlignment(Alignment.CENTRE);// 对齐方式
                // wcfFC.setBackground(jxl.format.Colour.VERY_LIGHT_YELLOW);// 背景色
                wcfFC.setVerticalAlignment(VerticalAlignment.CENTRE);// 对齐方式
                // wcfFC.setBorder(Border.ALL, BorderLineStyle.MEDIUM,
                // Colour.BLACK);//
                // 边框
                wsheet.addCell(new Label(icol, irow, reportTitle, wcfFC));
                trow = irow;
            } catch (Exception e) {
                this.close();
            }
        }
    
        /**
         * 设置报表内容头
         * 
         * @param listTitle
         *            报表头
         * @throws IOException
         * @throws WriteException
         */
        @Deprecated
        public void setExcelListTitle(String[] listTitle) throws WriteException, IOException {
            try {
                irow++;
                long start = System.currentTimeMillis();
                wfont = new WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.BOLD, false,
                    UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
                wcfFC = new WritableCellFormat(wfont);
                wcfFC.setBorder(Border.ALL, BorderLineStyle.MEDIUM);
                wcfFC.setAlignment(Alignment.CENTRE);// 对齐方式
                wcfFC.setVerticalAlignment(VerticalAlignment.CENTRE);// 对齐方式
                for (int i = icol; i < listTitle.length; i++) {
                    wsheet.addCell(new Label(i, irow, listTitle[i], wcfFC));
                }
                trow = irow;
                log.info("title use time:" + (System.currentTimeMillis() - start));
            } catch (Exception e) {
                this.close();
            }
        }
    
        /**
         * 添加一行
         * 
         * @param strings
         *            该行数据
         * @throws IOException
         * @throws WriteException
         */
        public void addRow(Object[] strings, BorderLineStyle borderLineStyle, Alignment alignment,
                           String bold) throws WriteException, IOException {
            try {
                irow++;
                bold = StringUtils.isEmpty(bold) ? "" : bold;
                for (int i = 0; i < strings.length; i++) {
                    if ("bold".equals(bold.toLowerCase()))
                        wfont = new WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.BOLD,
                            false);
                    else
                        wfont = new WritableFont(WritableFont.createFont("宋体"), 10,
                            WritableFont.NO_BOLD, false);
                    wcfFC = new WritableCellFormat(wfont);
                    wcfFC.setAlignment(alignment);// 对齐方式
                    wcfFC.setVerticalAlignment(VerticalAlignment.CENTRE);// 对齐方式
                    if (borderLineStyle == BorderLineStyle.THIN && i == strings.length - 1) {
                        wcfFC.setBorder(Border.ALL, borderLineStyle);
                        wcfFC.setBorder(Border.RIGHT, BorderLineStyle.MEDIUM);
                    } else
                        wcfFC.setBorder(Border.ALL, borderLineStyle);
                    wsheet.addCell(new Label(i, irow, strings[i] == null ? "" : strings[i].toString(),
                        wcfFC));
                }
            } catch (Exception e) {
                log.error(e);
                this.close();
            }
        }
    
        /**
         * 添加一行
         * 
         * @param strings
         *            该行数据
         * @throws IOException
         * @throws WriteException
         */
        public void addRow(Object[] strings, CellType[] cellTypes, DisplayFormat... dFormat)
                                                                                            throws WriteException,
                                                                                            IOException {
            try {
                irow++;
                DisplayFormat format = null;
                for (int i = 0; i < strings.length; i++) {
                    if (dFormat != null) {
                        if (dFormat.length > i) {
                            format = dFormat[i];
                        } else if (dFormat.length > 0) {
                            format = dFormat[0];
                        }
                    }
                    addCell(i, irow, strings[i] == null ? "" : strings[i].toString(), cellTypes[i],
                        format, false, i + 1 == strings.length);
                }
            } catch (Exception e) {
                log.error(e);
                this.close();
            }
        }
    
        /**
         * 添加多行
         * 
         * @param infoList
         *            报表内容
         * @param cellTypes
         *            单元格样式
         * @throws IOException
         * @throws WriteException
         * @throws Exception
         */
        public void addRows(List<?> infoList, CellType[] cellTypes, DisplayFormat... dFormat)
                                                                                             throws WriteException,
                                                                                             IOException {
            if (infoList != null && !infoList.isEmpty()) {
                // 内容
                CellType cellType = CellType.EMPTY;
                DisplayFormat format = null;
                for (; 0 < infoList.size();) {
                    if (irow == 50000) {
                        this.write();
                        this.addSheet(sheetName);
                    }
                    irow++;
                    Object[] rowInfo = (Object[]) infoList.get(0);
                    if (rowInfo.length > titleCols) {
                        titleCols = rowInfo.length;
                    }
                    for (int j = icol; j < rowInfo.length; j++) {
                        rowInfo[j] = rowInfo[j] == null ? "" : rowInfo[j];
                        if (cellTypes != null && j < cellTypes.length) {
                            cellType = cellTypes[j] == null ? CellType.EMPTY : cellTypes[j];
                        } else {
                            cellType = CellType.EMPTY;
                        }
                        if (dFormat != null) {
                            if (dFormat.length > j) {
                                format = dFormat[j];
                            } else if (dFormat.length > 0) {
                                format = dFormat[0];
                            }
                        }
                        this.addCell(j, irow, rowInfo[j], cellType, format, 1 == infoList.size(),
                            j == rowInfo.length - 1);// 添加单元格并判断是否为最后一列最后一行
                    }
                    infoList.remove(0);
                }
                try {
                    if (os != null)
                        os.flush();
                    if (trow >= 0)
                        wsheet.mergeCells(icol, trow, titleCols + icol - 1, trow);// 设置报表标题
                } catch (Exception e) {
                    log.error(e);
                    this.close();
                }
            }
        }
    
        /**
         * 下载Excel
         * 
         * @throws IOException
         * @throws WriteException
         * @throws Exception
         */
        public void reportExcel() throws WriteException, IOException {
            log.info("Use time:" + MathUtil.divide(System.currentTimeMillis() - startTime, 1000) + "s");
            this.flush();
            log.info("ReportExcel Successful!!!");
        }
    
        /**
         * 合并单元格
         * 
         * @param col
         *            起始列
         * @param row
         *            起始行
         * @param toCol
         *            结束列
         * @param toRow
         *            结束行
         * @throws IOException
         * @throws WriteException
         * @throws Exception
         */
        public void setMergeCells(int col, int row, int toCol, int toRow) throws WriteException,
                                                                         IOException {
            try {
                wsheet.mergeCells(col, row, toCol, toRow);
            } catch (Exception e) {
                this.close();
            }
        }
    
        /**
         * 关闭资源
         * 
         * @throws WriteException
         * @throws IOException
         */
        public void close() throws WriteException, IOException {
            if (wbook != null) {
                wbook.write();
                wbook.close();
            }
            if (os != null) {
                os.flush();
                os.close();
            }
        }
    
        /**
         * 关闭资源
         * 
         * @throws WriteException
         * @throws IOException
         */
        public void write() throws WriteException, IOException {
            this.setRowView();
            this.setColumnView();
            if (os != null) {
                os.flush();
            }
        }
    
        /**
         * 释放资源
         * 
         * @throws WriteException
         * @throws IOException
         */
        private void flush() throws WriteException, IOException {
            this.setRowView();
            this.setColumnView();
            this.close();
        }
    
        /**
         * 释放资源
         * 
         * @throws IOException
         * @throws WriteException
         */
        public void osFlush() throws IOException, WriteException {
            if (os != null) {
                os.flush();
            }
        }
    
        /**
         * 添加单元格
         * 
         * @return
         * @throws IOException
         * @throws WriteException
         */
        public void addCell(Integer col, Integer row, Object o, CellType type, DisplayFormat format,
                            Boolean isLastRow, Boolean isLastCols) throws WriteException, IOException {
            WritableFont wfont = new WritableFont(WritableFont.createFont("宋体"), 10,
                WritableFont.NO_BOLD, false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
            try {
                if (o instanceof ArrayList<?>) {
                    Label Label = new Label(col, row, "", wcfFC);
                    WritableCellFeatures wcf = new WritableCellFeatures();
                    if (!((List<?>) o).isEmpty())
                        wcf.setDataValidationList((List<?>) o);
                    Label.setCellFeatures(wcf);
                    wsheet.addCell(Label);
                } else {
                    // 字体样式
                    if (type == CellType.LABEL) {
                        wfont = new WritableFont(WritableFont.createFont("宋体"), 10, WritableFont.BOLD,
                            false, UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
                        wcfFC = new WritableCellFormat(wfont);
                        wcfFC.setAlignment(Alignment.CENTRE);// 对齐方式
                    } else if (type == CellType.STRING_FORMULA) {
                        wcfFC = new WritableCellFormat(wfont);
                        wcfFC.setAlignment(Alignment.LEFT);// 对齐方式
                    } else if (type == CellType.NUMBER) {// 数字
                        wcfFC = new WritableCellFormat(wfont, format);
                        wcfFC.setAlignment(Alignment.RIGHT);// 对齐方式
                    } else if (type == CellType.DATE || type == CellType.DATE_FORMULA) {// 日期
                        wcfFC = new WritableCellFormat(wfont, format);
                        wcfFC.setAlignment(Alignment.CENTRE);// 对齐方式
                    } else {
                        wcfFC = new WritableCellFormat(wfont);
                        wcfFC.setAlignment(Alignment.CENTRE);// 对齐方式
                    }
                    wcfFC.setVerticalAlignment(VerticalAlignment.CENTRE);// 对齐方式
                    wcfFC.setBorder(Border.ALL, BorderLineStyle.THIN);// 边框
                    if (isLastCols) {
                        wcfFC.setBorder(Border.RIGHT, BorderLineStyle.MEDIUM);
                    }
                    if (isLastRow) {
                        wcfFC.setBorder(Border.BOTTOM, BorderLineStyle.MEDIUM);
                    }
                    if (o == null) {
                        wsheet.addCell(new Label(col, row, ""));
                    } else if (StringUtils.isEmpty(String.valueOf(o))) {
                        wsheet.addCell(new Label(col, row, o.toString(), wcfFC));
                    } else if (type == CellType.NUMBER) {
                        wsheet.addCell(new jxl.write.Number(col, row,
                            Double.valueOf(String.valueOf(o)), wcfFC));
                    } else if (type == CellType.DATE || type == CellType.DATE_FORMULA) {
                        wsheet.addCell(new jxl.write.DateTime(col, row, DateUtil.stringToDate(o
                            .toString()), wcfFC));
                    } else {
                        wsheet.addCell(new Label(col, row, o.toString(), wcfFC));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
                this.close();
            }
        }
    
        /**
         * 设置行高
         * 
         * @throws IOException
         * @throws WriteException
         * @throws RowsExceededException
         */
        private void setRowView() throws WriteException, IOException {
            try {
                for (int i = 0; i < wsheet.getRows(); i++) {
                    wsheet.setRowView(i, (int) (wsheet.getRowView(i).getDimension() * 1.3));
                }
            } catch (Exception e) {
                this.close();
            }
        }
    
        /**
         * 设置列宽
         * 
         * @param cellInfo
         * @param col
         */
        private void setColumnView() {
            int infoWidth, cellWidth;
            String value;
            Pattern pattern = Pattern.compile("\d+(.\d+)?$");
            Cell cell;
            for (int i = 0; i < wsheet.getRows(); i++) {
                lablea: for (int j = 0; j < wsheet.getColumns(); j++) {
                    // 过滤合并单元格
                    Range[] range = wsheet.getMergedCells();
                    for (int k = 0; k < range.length; k++) {
                        if (range[k].getTopLeft().getRow() == i
                            && range[k].getTopLeft().getColumn() == j
                            && range[k].getBottomRight().getColumn() != j)
                            continue lablea;
                    }
                    cell = wsheet.getCell(j, i);
                    value = cell.getContents();
                    if (cell.getType() == CellType.DATE) {// 日期
                        infoWidth = (int) Math.round(value.length() * 0.5);
                    } else if (cell.getType() == CellType.NUMBER) {// 数字
                        int p = 0;
                        for (int k = 0; k < value.split("\.")[0].length(); k++) {
                            if (value.charAt(k) == '0') {
                                p++;
                            }
                        }
                        infoWidth = (int) Math.round(value.length() * 2 + p * 0.2);
                    } else if (pattern.matcher(value).matches()) {// 数字
                        infoWidth = (int) Math.round(value.length() * 1.2);
                    } else if (cell.getCellFormat() != null
                               && cell.getCellFormat().getFont().getBoldWeight() == BoldStyle.BOLD
                                   .getValue()) {// 粗体
                        infoWidth = (int) Math.round(value.getBytes().length * 1.13);
                    } else if (value.getBytes().length != value.length()) {
                        infoWidth = (int) Math.round(value.length() * 1.9);
                    } else {
                        infoWidth = (int) Math.round(value.length() * 1.05);
                    }
                    cellWidth = wsheet.getColumnView(j).getDimension();
                    if (cellWidth < infoWidth) {
                        wsheet.setColumnView(j, infoWidth);
                    }
                }
            }
        }
    
        /** 隐藏列 */
        public void setHideCol(int rols) {
            CellView view = new CellView();
            view.setHidden(true);
            wsheet.setColumnView(rols, view);
        }
    
        /** 隐藏行 */
        public void setHideRow(int row) throws RowsExceededException {
            CellView view = new CellView();
            view.setHidden(true);
            wsheet.setRowView(row, view);
        }
    
        /** 删除列 */
        public void deleteCol(int rols) {
            wsheet.removeColumn(rols);
        }
    
        /** 删除行 */
        public void deleteRow(int row) {
            wsheet.removeRow(row);
        }
    
        public void setIrow(Integer row) {
            this.irow = row;
        }
    
        public int getIrow() {
            return this.irow;
        }
    
        public void setIcol(Integer col) {
            icol = col;
        }
    
        public Integer getIcol() {
            return icol;
        }
    
        public Integer getTitleCols() {
            return titleCols;
        }
    
        public int getSheetIndex() {
            return sheetIndex;
        }
    }
  • 相关阅读:
    LD_DEBUG
    kernel相关前沿技术了解
    awk一次性分别赋值多个value给多个变量,速度对比
    google spanner
    python指定日期后加几天判断
    awk手册
    2017.12.28 现货黄金止盈复盘
    数据库和struts2的拦截器
    类和数据库的扫盲
    深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接(经典)
  • 原文地址:https://www.cnblogs.com/wangquanyi/p/12106596.html
Copyright © 2011-2022 走看看