zoukankan      html  css  js  c++  java
  • Execl文件导出(poi)

    import lombok.Data;
    import org.apache.commons.lang.StringUtils;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.*;
    import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;
    
    import javax.servlet.ServletOutputStream;
    import javax.servlet.http.HttpServletResponse;
    import java.io.Serializable;
    import java.lang.reflect.Field;
    import java.net.URLEncoder;
    import java.util.List;
    
    public class ExcelUtil {
    
    
        /**
         * 下载文
         *
         * @param response
         * @param fileName
         * @param data
         * @throws Exception
         */
        public static void exportExcel(HttpServletResponse response, String fileName, ExcelData data) throws Exception {
            // 告诉浏览器用什么软件可以打开此文件
            response.setHeader("content-Type", "application/vnd.ms-excel");
            // 下载文件的默认名称
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
            exportExcel(data, response.getOutputStream());
        }
    
        /**
         * 创建 表格
         *
         * @param data
         * @param out
         * @throws Exception
         */
        public static void exportExcel(ExcelData data, ServletOutputStream out) throws Exception {
            XSSFWorkbook wb = new XSSFWorkbook();
            try {
                String sheetName = data.getName();
                if (null == sheetName) {
                    sheetName = "Sheet1";
                }
                XSSFSheet sheet = wb.createSheet(sheetName);
                writeExcel(wb, sheet, data);
                wb.write(out);
            } finally {
                wb.close();
            }
        }
    
        /**
         * 将数据写入表格
         *
         * @param wb
         * @param sheet
         * @param data
         */
        private static void writeExcel(XSSFWorkbook wb, Sheet sheet, ExcelData data) {
            int rowIndex = 0;
            rowIndex = writeTitlesToExcel(wb, sheet, data.getTitles());
            writeRowsToExcel(wb, sheet, data.getRows(), rowIndex);
            autoSizeColumns(sheet, data.getTitles().size() + 1);
        }
    
        /**
         * 写入表头
         *
         * @param wb
         * @param sheet
         * @param titles
         * @return
         */
        private static int writeTitlesToExcel(XSSFWorkbook wb, Sheet sheet, List<String> titles) {
            int rowIndex = 0;
            int colIndex = 0;
            Font titleFont = wb.createFont();//获取字体
            titleFont.setFontName("simsun");//设置字体名称(宋体)
            titleFont.setBold(true);//设置字体加粗
            titleFont.setColor(IndexedColors.BLACK.index);//设置字体颜色 黑色
            XSSFCellStyle titleStyle = wb.createCellStyle();//获取单元格样式
            titleStyle.setAlignment(HorizontalAlignment.CENTER);//设置单元格的水平对齐类型(这里是水平居中)
            titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置单元格的垂直对齐类型(这里是居中)
            titleStyle.setFillForegroundColor(createXssfColor("#FFFFFF"));//设置单元格前景色(白色)
            titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);//指定图案和纯色单元格填充的单元格填充信息(实心前景)
            titleStyle.setFont(titleFont);//设置字体样式
            setBorder(titleStyle, BorderStyle.THIN, createXssfColor("#000000"));//设置边框样式(细线、黑色)
            Row titleRow = sheet.createRow(rowIndex);//在该工作簿中创建第一行.
            colIndex = 0;
            for (String field : titles) {//循环创建列
                Cell cell = titleRow.createCell(colIndex);
                cell.setCellValue(field);
                cell.setCellStyle(titleStyle);
                colIndex++;
            }
            rowIndex++;//将行数++ 返回用于下面添加数据
            return rowIndex;
        }
    
        /**
         * 将数据写入
         *
         * @param wb
         * @param sheet
         * @param rows
         * @param rowIndex
         * @return
         */
        private static int writeRowsToExcel(XSSFWorkbook wb, Sheet sheet, List<Object> rows, int rowIndex) {
            int colIndex = 0;
            Font dataFont = wb.createFont();//获取字体
            dataFont.setFontName("simsun");//设置字体名称(宋体)
            dataFont.setColor(IndexedColors.BLACK.index);//设置字体颜色 黑色
            XSSFCellStyle dataStyle = wb.createCellStyle();//获取单元格样式
            dataStyle.setAlignment(HorizontalAlignment.CENTER);//设置单元格的水平对齐类型(这里是水平居中)
            dataStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置单元格的垂直对齐类型(这里是居中)
            dataStyle.setFont(dataFont);//设置字体样式
            setBorder(dataStyle, BorderStyle.THIN, createXssfColor("#000000"));//设置边框样式(细线、黑色)
            for (Object rowData : rows) {//循环写入数据
                Row dataRow = sheet.createRow(rowIndex);
                colIndex = 0;
    
                Field[] fields = rowData.getClass().getDeclaredFields();
                for (int i = 0, len = fields.length; i < len; i++) {
                    // 对于每个属性,获取属性名
                    String varName = fields[i].getName();
                    try {
                        // 获取原来的访问控制权限
                        boolean accessFlag = fields[i].isAccessible();
                        // 修改访问控制权限
                        fields[i].setAccessible(true);
                        // 获取在对象f中属性fields[i]对应的对象中的变量
                        Object o;
                        try {
                            o = fields[i].get(rowData);
                            Cell cell = dataRow.createCell(colIndex);
                            if (o != null) {
                                cell.setCellValue(o.toString());
                            } else {
                                cell.setCellValue("");
                            }
    
                            cell.setCellStyle(dataStyle);
                            colIndex++;
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }
                        // 恢复访问控制权限
                        fields[i].setAccessible(accessFlag);
                    } catch (IllegalArgumentException ex) {
                        ex.printStackTrace();
                    }
                }
                rowIndex++;
            }
            return rowIndex;
        }
    
        /**
         * 自动调整大小
         *
         * @param sheet
         * @param columnNumber
         */
        private static void autoSizeColumns(Sheet sheet, int columnNumber) {
            for (int i = 0; i < columnNumber; i++) {
                int orgWidth = sheet.getColumnWidth(i);
                sheet.autoSizeColumn(i, true);
                int newWidth = (int) (sheet.getColumnWidth(i) + 100);
                if (newWidth > orgWidth) {
                    sheet.setColumnWidth(i, newWidth);
                } else {
                    sheet.setColumnWidth(i, orgWidth);
                }
            }
        }
    
        /**
         * 设置表格样式
         *
         * @param style
         * @param border
         * @param color
         */
        private static void setBorder(XSSFCellStyle style, BorderStyle border, XSSFColor color) {
            style.setBorderTop(border);
            style.setBorderLeft(border);
            style.setBorderRight(border);
            style.setBorderBottom(border);
            style.setBorderColor(XSSFCellBorder.BorderSide.TOP, color);
            style.setBorderColor(XSSFCellBorder.BorderSide.LEFT, color);
            style.setBorderColor(XSSFCellBorder.BorderSide.RIGHT, color);
            style.setBorderColor(XSSFCellBorder.BorderSide.BOTTOM, color);
        }
    
        /**
         * 将rgb颜色码 转换为 XSSFColor
         *
         * @param color
         * @return
         */
        private static XSSFColor createXssfColor(String color) {
            int[] rgbColor = hexToRgb(color);
            XSSFColor xssfColor = new XSSFColor(new java.awt.Color(rgbColor[0], rgbColor[1], rgbColor[2]), new DefaultIndexedColorMap());
            return xssfColor;
        }
    
        /**
         * 将颜色码 转换为 r g b
         *
         * @param hex
         * @return
         */
        public static int[] hexToRgb(String hex) {
            String colorStr = hex;
            if (hex.startsWith("#")) {
                colorStr = hex.substring(1);
            }
            if (StringUtils.length(colorStr) == 8) {
                colorStr = hex.substring(2);
            }
            int r = Integer.valueOf(colorStr.substring(0, 2), 16);
            int g = Integer.valueOf(colorStr.substring(2, 4), 16);
            int b = Integer.valueOf(colorStr.substring(4, 6), 16);
    
            return new int[]{r, g, b};
        }
    
    
        @Data
        public class ExcelData<T> implements Serializable {
    
            private static final long serialVersionUID = 4454016249210520899L;
    
            /**
             * 表头
             */
            private List<String> titles;
    
            /**
             * 数据
             */
            private List<T> rows;
    
            /**
             * 页签名称
             */
            private String name;
        }
    
    }
    
    
    
    
  • 相关阅读:
    “XXXXX” is damaged and can’t be opened. You should move it to the Trash 解决方案
    深入浅出 eBPF 安全项目 Tracee
    Unity3d开发的知名大型游戏案例
    Unity 3D 拥有强大的编辑界面
    Unity 3D物理引擎详解
    Unity 3D图形用户界面及常用控件
    Unity 3D的视图与相应的基础操作方法
    Unity Technologies 公司开发的三维游戏制作引擎——Unity 3D
    重学计算机
    windows cmd用户操作,添加,设备管理员组,允许修改密码
  • 原文地址:https://www.cnblogs.com/snail-gao/p/13403975.html
Copyright © 2011-2022 走看看