精华内容
下载资源
问答
  • java导出excel复杂表头

    2019-02-20 16:09:50
    java工程,源代码,可直接运行,需自己改造成web下载方式。
  • java导出Excel 时候 相同行合并(可合并多列); 已测试通过;
  • Java导入Excel文件返回数据对应属性类字段,Java导出Excel文件如何让数据对应指定的标题字段-附件资源
  • 主要介绍了Java导出excel时合并同一列中相同内容的行,需要的朋友可以参考下
  • 前言 自学做一个小demo,有个功能涉及到excel的导入导出,在网上到处查找了一番,发先也并不难,这里整理记录一下,给有相同想法的朋友们做个参考。 正文

    前言

    最近在做一个小项目,有个模块的功能涉及到excel的导入导出,并且要求对导出的excel文件部分列和单元格设置为只读不可更改,在网上到处查找了一番资料,结合自己的想法,发现也并不难,这里整理记录一下,给有相同想法和有这个需求的朋友们做个参考。

    正文

    java导出excel文件用的最多的就用poi的方式,这里也一样。POI 提供了对2003版本的Excel的支持 ---- HSSFWorkbook,可用于生成.xls。POI 提供了对2007版本以及更高版本的支持 ---- XSSFWorkbook ,可生成.xlsx后缀的excel文件。

    导出的大致的思路,先从数据库查询出要导出的数据,这些数据可以放入一个List<bean>集合中,然后把数据按一定顺序写入excel的文件中,再对写入的数据到excel单元格进行样式设置,再以流的形式传给前端。大概流程就是上面描述的这样,细节还是在于对创建单元格写入数据后的格式进行设置为只读 (其目的就是为了规范化用户的操作,防止误改)

    我的处理方式是这样的:为方便和规范用户的使用,在项目里就先创建一个excel的模板,设置两行标题,第一行标题用中文,第二行标题用英文(设置英文的目的是可以用java反射来按字段的方式以便导入导出功能的编写),并将这两行标题设置为锁定,和保护,出这两行外的单元格不锁定,等在写入数据后再根据需要进行是否锁定,在获取数据库的数据后,先对模板文件进行复制,再把数据写入模板的复制文件中,最后再把复制文件以输出流的形式传给前端,再删除复制文件。excel模板文件的手动锁定保护在文章结尾给出。

    1.先添加poi的依赖

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.2</version>
            </dependency>

    2.service层,调用自己写的ExcelUtil类的exportExcel静态方法

     /**
         * excel导出,导出当天最新的项目信息,这里提供给controller层调用
         * @param request
         * @param response
         * @return
         */
        @Override
        @RequestMapping(method = RequestMethod.GET)
        @ResponseBody
        public String exportExcelMethod(HttpServletRequest request, HttpServletResponse response) {
            //这里的List<bean>就是你的数据库取出对应的数据,这里有些不方便展示就以此代指了
            List<Bean> ucmList = getBeanList();
            try {
                ExcelUtil.exportExcel(ucmList, response);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "导出成功!";
        }

    3.ExcelUtil类的exportExcel静态方法:功能先复制模板一份(不对模板进行操作),然后操作复制体的模板文件,对其进行数据写入,单元格的锁定和解锁设置,再通过流发送给前端,发送完后删除复制体模板文件。

     public static void exportExcel(List<Bean> ucmBoList, HttpServletResponse response) {
            String templatePath = System.getProperty("user.dir") + File.separator + "report/exceltemplate/";
            String templateName = "template.xlsx";
            String templatePathAndName = templatePath + templateName;
            File templateFile = new File(templatePathAndName);
            File copyFile = null;
            if (templateFile != null && templateFile.exists()) {
                copyFile = copyExcelTemplateByXSSF(templatePath, templateName);
            } else {
                return;
            }
    
            if (copyFile != null && copyFile.exists()) {
                //创建一个工作簿
                XSSFWorkbook xssfWorkbook = null;
                //创建工作表
                XSSFSheet xssfSheet = null;
                XSSFCellStyle lockCellStyle = null;
                XSSFCellStyle unLockCellStyle = null;
                try {
                    xssfWorkbook = new XSSFWorkbook(copyFile);
                    // xssfSheet = xssfWorkbook.createSheet();
                    //这里是用自己已创建好的模板,所以就是getSheet(index)
                    xssfSheet = xssfWorkbook.getSheetAt(0);
                    //创建单元格
                    XSSFCell xssfCell;
                    //创建单元格样式,这里设置是否锁定
                    lockCellStyle = xssfWorkbook.createCellStyle();
                    lockCellStyle.setLocked(true);
                    //创建单元格样式,这里设置不锁定
                    unLockCellStyle = xssfWorkbook.createCellStyle();
                    unLockCellStyle.setLocked(false);
    
                    if (ucmBoList != null && ucmBoList.size() > 0) {
    
                        for (int i = 0; i < ucmBoList.size(); i++) {
                            UcmBean ucm = ucmBoList.get(i);
                            //细节,前两行为标题
                            XSSFRow xssfRow = xssfSheet.createRow(i + 2);
    
                            //录入日期
                            XSSFCell cell0 = xssfRow.createCell(0);
                            cell0.setCellValue(ucm.getOcDate());
    
                            //业务部门
                            XSSFCell cell1 = xssfRow.createCell(1);
                            cell1.setCellValue(ucm.getBusinessUnit());
    
                            //项目类别编号
                            XSSFCell cell2 = xssfRow.createCell(2);
                            cell2.setCellValue(ucm.getProjectTypeCode());
    
                            //项目类别名称
                            XSSFCell cell3 = xssfRow.createCell(3);
                            cell3.setCellValue(ucm.getProjectTypeName());
    
                            //项目编号
                            XSSFCell cell4 = xssfRow.createCell(4);
                            cell4.setCellValue(ucm.getProjectNo());
    
                            //项目名称
                            XSSFCell cell5 = xssfRow.createCell(5);
                            cell5.setCellValue(ucm.getProjectName());
    
                            //项目评级
                            XSSFCell cell6 = xssfRow.createCell(6);
                            cell6.setCellValue(ucm.getProjectRating());
    
                            //融资主体
                            List<FinancierBO> financierBOList = ucm.getFinancierInfo();
                            String finName = "", finCode = "", finRating = "";
                            if (financierBOList != null && financierBOList.size() > 0) {
                                for (FinancierBO financierBO : financierBOList) {
                                    if (financierBO != null) {
                                        if (financierBO.getName() != null) {
                                            finName = finName + financierBO.getName() + "\n";
                                        } else {
                                            finName = finName + "" + "\n";
                                        }
                                        if (financierBO.getUniformCreditCode() != null) {
                                            finCode = finCode + financierBO.getUniformCreditCode() + "\n";
                                        } else {
                                            finCode = finCode + "" + "\n";
                                        }
                                        if (financierBO.getRating() != null) {
                                            finRating = finRating + financierBO.getRating() + "\n";
                                        } else {
                                            finRating = finRating + "" + "\n";
                                        }
                                    }
                                }
                            }
                    }
                    //是否体系内业务
                            XSSFCell cell7 = xssfRow.createCell(7);
                            cell7.setCellStyle(unLockCellStyle);
                            if (ucm.getSystemBusinessFlag() != null) {
                                if (ucm.getSystemBusinessFlag()) {
                                    cell7.setCellValue("是");
                                } else {
                                    cell7.setCellValue("否");
                                }
                            } else {
                                cell7.setCellValue("");
                            }
    
                            //行业分类
                            XSSFCell cell8 = xssfRow.createCell(8);
                            cell8.setCellStyle(unLockCellStyle);
                            cell8.setCellValue(ucm.getIndtNum());
    
                            //担保机构评级
                            XSSFCell cell9 = xssfRow.createCell(9);
                            cell9.setCellStyle(unLockCellStyle);
                            cell9.setCellValue(ucm.getGuarantorInstitutionRating());
    
                    setResponseHeader(response, copyFile.getName());
    
                    //锁定不锁定只有加了这个才有用(默认都是锁定后就不可以对单元格内容进行更改)
                    xssfSheet.protectSheet("123*456");
                    OutputStream out = response.getOutputStream();
                    xssfWorkbook.write(out);
                    out.flush();
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (InvalidFormatException e) {
                    e.printStackTrace();
                } finally {
                    if (copyFile.exists()) {
                        copyFile.delete();
                    }
                    System.out.println("成功之后需要,删除复制的模板源文件,以免占用服务器的内存!");
                }
            } else {
                return;
            }
        }

    4. ExcelUtil类的copyExcelTemplateByXSS静态方法,复制模板文件,并以日期的形式作为文件名

    /**
         * 复制excel的模板
         *
         * @param excelFilePath 模板路径
         * @param fileName      模板名称
         * @return 复制后的模板副本文件,或null
         */
        public static File copyExcelTemplateByXSSF(String excelFilePath, String fileName) {
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
            String now = dateFormat.format(new Date());
            String templateFilePathAndName = excelFilePath + fileName;
            String copyFilePathAndName = excelFilePath + "/XXX模板" + now + ".xlsx";
    
            File templateFile = new File(templateFilePathAndName);
            File copyFile = null;
            XSSFWorkbook xssfWorkbook = null;
            if (templateFile.exists()) {
                copyFile = new File(copyFilePathAndName);
                try {
                    xssfWorkbook = new XSSFWorkbook(templateFile);
                } catch (InvalidFormatException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                return copyFile;
            }
            try {
                OutputStream out = new FileOutputStream(copyFile);
                xssfWorkbook.write(out);
                out.flush();
                out.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //file.delete();
            }
            return copyFile;
        }

    5. ExcelUtil类的setResponseHeader方法,用来设置respond的响应体形象,包括编码格式和以附件的形式进行下载

    // 发送响应流方法
        public static void setResponseHeader(HttpServletResponse response, String fileName) {
    
            try {
                try {
                    fileName = new String(fileName.getBytes("gbk"), "ISO8859-1");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                //response.setCharacterEncoding("utf-8");
                response.reset();// 清空输出流
    
            //告诉浏览器这个文件的名字和类型,attachment:作为附件下载;inline:直接打开
                response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
    
            // response.setContentType("application/vnd.ms-excel");如果设置为这种就是生成.xls文件
                response.setContentType("application/msexcel");
                response.addHeader("Pargam", "no-cache");
                response.addHeader("Cache-Control", "no-cache");
                response.setCharacterEncoding("ISO8859-1");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }

    6.control层调用service层

    @Controller("/file")
    public class ExcelController {
    
        @Autowired
        UcmService ucmService;
    
        @RequestMapping("/downLoad")
        //@ResponseBody
        public void excletest(HttpServletRequest request, HttpServletResponse response){
              ucmService.exportExcelMethod(request, response);
        }

    以上就是整个处理过程的的大致代码。下面给出excel模板的标题设置为不可修改。选中标题行右键单元格设置-->保护->锁定

    -->确定

          

    再到审阅,点击保护工作表-->购上下面的钩子,输入密码,再次确认密码即可。然后你想修改就必须输入密码才能更改了。

        

    看到这里的,就麻烦点个赞吧!O(∩_∩)O

    展开全文
  • * 导出excel(利用反射机制) * String[] title = {"订单号","商品名称","商品价格","创建时间"}; * String[] field = {"orderNum","productName","productPrice","createTime"}; * ExportTools.export("sellJoin...
  • java实现导出Excel多行表头复杂模板 一般我们都会选择poi来导出,选择一个比较好的ExcelUtils 但是对于初学者而言不了解poi的,还需从poi API文档去学习,如果是自学的话更好,如果是公司安排的任务,没有接触过有...
  • POI导出Excel工具类,自动设置标题 列名 文件名,可插入图片,合并单元格
  • 源码案例: 1.需要实体类型加上列名注解 ...import cn.afterturn.easypoi.excel.annotation.Excel; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.hibernate.valid...

    方法一:

    依赖

    
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-base</artifactId>
                <version>3.0.3</version>
            </dependency>
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-web</artifactId>
                <version>3.0.3</version>
            </dependency>
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-annotation</artifactId>
                <version>3.0.3</version>
            </dependency>
            <dependency>
                <groupId>cn.afterturn</groupId>
                <artifactId>easypoi-spring-boot-starter</artifactId>
                <version>4.0.0</version>
            </dependency>
    

    dome

    
    
    import java.io.File;
    import java.io.IOException;
    import java.net.URLEncoder;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    import java.util.NoSuchElementException;
    import javax.servlet.http.HttpServletResponse;
    
    import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.StringUtils;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.springframework.web.multipart.MultipartFile;
    import cn.afterturn.easypoi.excel.ExcelExportUtil;
    import cn.afterturn.easypoi.excel.ExcelImportUtil;
    import cn.afterturn.easypoi.excel.entity.ExportParams;
    import cn.afterturn.easypoi.excel.entity.ImportParams;
    /**
     *
     * @ClassName: ExcelUtils
     * @Description: excle工具类
     * @author 
     * @date
     *
     */
    @Slf4j
    public class ExcelUtils {
        /**
         *
         * @Title: importData
         * @Description: 导入excle 数据
         * @param file  文件
         * @param headerRows  忽略头行数
         * @param pojoClass   转换的实体
         * @return List<User>  返回的集合
         */
        public static <T> List<T> importData(MultipartFile file, Integer headerRows,
                                             Class<T> pojoClass){
            if (file == null) {
                return null;
            }
            ImportParams params = new ImportParams();
            params.setHeadRows(headerRows);
            List<T> list = null;
            try {
                list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return list;
        }
    
        /**
         *
         * @Title: exportExcel
         * @Description: 导出excel
         * @param list  导出的数据
         * @param title  文件标题
         * @param sheetName  sheet名称
         * @param pojoClass  集合的类
         * @param fileName   文件名
         * @param response
         * @return void
         */
        public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName,HttpServletResponse response) {
            Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(title, sheetName), pojoClass, list);
            if (workbook != null) {
                try {
    //                response.setContentType("application/download");
                    response.setCharacterEncoding("UTF-8");
                    response.setHeader("content-Type", "application/vnd.ms-excel");
                    response.setContentType("application/vnd.ms-excel;charset=UTF-8");
                    response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "ISO-8859-1"));
                    response.setHeader("Pragma", "no-cache");
                    response.setHeader("Cache-Control", "no-cache");
                    response.setDateHeader("Expires", 0);
                    workbook.write(response.getOutputStream());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    
    
    
    }
    
     List<UserInviteInfo> rst = channelService.searchInviteUser(search, new PageRequest(0, Integer.MAX_VALUE)).getContent();
            ExcelUtils.exportExcel( rst,null,"登录用户列表", UserInviteInfo.class,"登录用户列表.xls", response);
       

     

     

     

    方法二(最简单):

    依赖

    dome:

    
    import com.chenyou.admin.projection.wx.BaseEntity;
    import lombok.Data;
    
    @Data
    public class ExcleDome extends BaseEntity {
    
          private  Integer id;
          private  String  name;
          private  String  gender;
    }

     

    
    
    import com.chenyou.admin.models.ExcleDome;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    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.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    @Controller
    @RequestMapping("/excelDome")
    public class ExcelDomeController {
    
        /**
         * 导出excel表格
         *  在excel表中,无论是行还是列都是从0开始
         * @param response
         * @return
         */
        @GetMapping("/exportExcel")
        public void exportExcel(HttpServletResponse response) throws IOException {
            /**
             *  实际工作中,要导出的数据都是从数据库中取出来的,
             *  肯定是根据前端传过来的某个查询条件去查出一个集合,然后导出
             */
            List<ExcleDome> sList = new ArrayList<>();
            for (int i = 0; i < 6; i++) {
                // 创建一个类,用于模拟数据
                ExcleDome s = new ExcleDome();
                s.setName("666==="+i);
                s.setGender("男");
                s.setId(i);
                sList.add(s);
            }
            //创建HSSFWorkbook对象(excel的文档对象)
            HSSFWorkbook wb = new HSSFWorkbook();
            //建立新的sheet对象(excel的表单)
            HSSFSheet sheet = wb.createSheet("测试表");
    
            // 1、获取样式
            CellStyle cellStyle = wb.createCellStyle();
            //2、 给样式设置对齐方式(水平对齐)
            //cellStyle.setAlignment(HorizontalAlignment.CENTER);
    
            //在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
            HSSFRow row1 = sheet.createRow(0);
            //创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
            HSSFCell cell = row1.createCell(0);
            //设置单元格内容
            cell.setCellValue("学生中考考试信息表");
            //3.设置单元格样式居中
            cell.setCellStyle(cellStyle);
            //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));
            //在sheet里创建第二行
            HSSFRow row2 = sheet.createRow(1);
            //创建单元格并设置单元格内容
            row2.createCell(0).setCellValue("姓名");
            row2.createCell(1).setCellValue("班级");
            row2.createCell(2).setCellValue("地址");
            row2.createCell(3).setCellValue("手机号");
            // 判断要导出的数据是否为空,不为空遍历集合
            if(null!=sList){
                int j = 2;
                for (int i = 0; i <sList.size() ; i++) {
                    //在sheet里创建第三行,按照表头,添加数据
                    HSSFRow row3 = sheet.createRow(j);
                    //创建第三行,第一个单元格、
                    row3.createCell(0).setCellValue(sList.get(i).getName());
                    //第二个单元格
                    row3.createCell(1).setCellValue(sList.get(i).getGender());
                    j++;
                }
            }
            //输出Excel文件
            OutputStream output = response.getOutputStream();
            //response.reset();
            response.setHeader("Content-disposition", "attachment; filename=details.xls");
            response.setContentType("application/msexcel");
            wb.write(output);
            output.close();
            //@TODO
        }
    }
    

     

     

     

    展开全文
  • 关于java导出Excel设置密码权限

    千次阅读 2019-11-12 15:38:36
    最近工作不是特别忙,...如果您正在苦苦寻找同时兼容 2003版 2007 版excel, 如果这是您要的效果: 好了直接上代码: package com.util; import java.io.ByteArrayInputStream; import java.io.ByteArra...

    最近工作不是特别忙,本来是想写一写高大尚点的技术分享,没想好,就随便分享点东西出来吧,第一次写技术分享,欢迎指正。

    如果您正在苦苦寻找同时兼容 2003版 2007 版excel,

    如果这是您要的效果:

     

    好了直接上代码:

    package com.util;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.poifs.crypt.EncryptionInfo;
    import org.apache.poi.poifs.crypt.EncryptionMode;
    import org.apache.poi.poifs.crypt.Encryptor;
    import org.apache.poi.poifs.filesystem.POIFSFileSystem;
    import org.apache.poi.ss.usermodel.IndexedColors;
    import org.apache.poi.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFCellStyle;
    import org.apache.poi.xssf.usermodel.XSSFFont;
    import org.apache.poi.xssf.usermodel.XSSFRichTextString;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    
    /**
     * Excel导出工具类 兼容版
     * 
     * @author 改进优化版
     */
    
    public class ExportExcelUtil {
        private static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(ExportExcelUtil.class);
    
        // 显示的导出表的标题
        private String title;
        // 导出表的列名
        private String[] rowName;
    
        private List<Object[]> dataList = new ArrayList<Object[]>();
    
        // 构造方法,传入要导出的数据
        public ExportExcelUtil(String title, String[] rowName, List<Object[]> dataList) {
            this.dataList = dataList;
            this.rowName = rowName;
            this.title = title;
        }
    
        /*
         * 导出数据
         */
        public void export(HttpServletRequest request, HttpServletResponse response) throws Exception {
            try {
                XSSFWorkbook workbook = new XSSFWorkbook(); // 创建工作簿对象
                XSSFSheet sheet = workbook.createSheet(title); // 创建工作表
                XSSFCellStyle columnTopStyle = this.getColumnTopStyle(workbook); // 获取列头样式对象
                XSSFCellStyle style = this.getStyle(workbook); // 单元格样式对象
                // 定义所需列数
                int columnNum = rowName.length;
                XSSFRow rowRowName = sheet.createRow(0); // 在索引2的位置创建行(最顶端的行开始的第二行)
                rowRowName.setHeightInPoints(25); // 将列头设置默认行高
                // 将列头设置到sheet的单元格中
                for (int n = 0; n < columnNum; n++) {
                    XSSFCell cellRowName = rowRowName.createCell(n); // 创建列头对应个数的单元格
                    cellRowName.setCellType(XSSFCell.CELL_TYPE_STRING); // 设置列头单元格的数据类型
                    XSSFRichTextString text = new XSSFRichTextString(rowName[n]);
                    cellRowName.setCellValue(text); // 设置列头单元格的值
                    cellRowName.setCellStyle(columnTopStyle); // 设置列头单元格样式
                }
                // 将查询出的数据设置到sheet对应的单元格中
                for (int i = 0; i < dataList.size(); i++) {
                    Object[] obj = dataList.get(i);// 遍历每个对象
                    XSSFRow row = sheet.createRow(i + 1);// 创建所需的行数
                    row.setHeightInPoints(20); // 将创建出的行设置默认行高
                    for (int j = 0; j < obj.length; j++) {
                        XSSFCell cell = null; // 设置单元格的数据类型
                        cell = row.createCell(j, XSSFCell.CELL_TYPE_STRING);
                        if (!"".equals(obj[j]) && obj[j] != null) {
                            cell.setCellValue(obj[j].toString()); // 设置单元格的值
                        }
                        cell.setCellStyle(style); // 设置单元格样式
                    }
                }
                // 让列宽随着导出的列长自动适应
                for (int colNum = 0; colNum < columnNum; colNum++) {
                    int columnWidth = sheet.getColumnWidth(colNum) / 256;
                    for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
                        XSSFRow currentRow;
                        // 当前行未被使用过
                        if (sheet.getRow(rowNum) == null) {
                            currentRow = sheet.createRow(rowNum);
                        } else {
                            currentRow = sheet.getRow(rowNum);
                        }
                        if (currentRow.getCell(colNum) != null) {
                            XSSFCell currentCell = currentRow.getCell(colNum);
                            if (currentCell.getCellType() == XSSFCell.CELL_TYPE_STRING) {
                                int length = currentCell.getStringCellValue().getBytes().length;
                                if (columnWidth < length) {
                                    columnWidth = length;
                                }
                            }
                        }
                    }
                    if (colNum == 0) {
                        sheet.setColumnWidth(colNum, (columnWidth - 2) * 256);
    
                    } else {
                        sheet.setColumnWidth(colNum, (columnWidth + 4) * 256);
                    }
                }
                if (workbook != null) {
                    ByteArrayOutputStream bout = null;
                    ByteArrayInputStream workbookinput = null;
                    OutputStream outstream = null;
                    OPCPackage opc = null;
                    OutputStream os = null;
                    try {
                        // 把工作薄输出到字节里面
                        bout = new ByteArrayOutputStream();
                        workbook.write(bout);
                        bout.flush();
                        workbookinput = new ByteArrayInputStream(bout.toByteArray());
                        // 读取临时文件进行加密
                        POIFSFileSystem fs = new POIFSFileSystem();
                        EncryptionInfo info = new EncryptionInfo(fs, EncryptionMode.agile);
                        Encryptor enc = info.getEncryptor();
                        enc.confirmPassword("123456");//打开excel 密码
                        // 然后把字节输入到输入流,然后输入到OPC包里面
                        opc = OPCPackage.open(workbookinput);
                        os = enc.getDataStream(fs);
                        opc.save(os);
                        opc.close();
                        // 返回给浏览器
                        outstream = response.getOutputStream();
                        response.reset();
                        response.setHeader("Content-disposition",
                                "attachment; filename=" + new String(title.getBytes(), "UTF-8") + ".xlsx");
                        response.setContentType("application/x-download");
                        fs.writeFilesystem(outstream);
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        if (workbook != null) {
                            workbook.close();
                        }
                        if (bout != null) {
                            bout.close();
                        }
                        if (workbookinput != null) {
                            workbookinput.close();
                        }
                        if (outstream != null) {
                            outstream.close();
                        }
                        if (opc != null) {
                            opc.close();
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        /*
         * 设置标题样式
         */
        public XSSFCellStyle getTitleTopStyle(XSSFWorkbook workbook) {
    
            // 设置字体
            XSSFFont font = workbook.createFont();
            // 设置字体大小
            font.setFontHeightInPoints((short) 24);
            // 字体加粗
            font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
            // 设置字体名字
            font.setFontName("宋体");
            // 设置样式;
            XSSFCellStyle style = workbook.createCellStyle();
            // 设置底边框;
            style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
            // 设置底边框颜色;
            style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
            // 设置左边框;
            style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
            // 设置左边框颜色;
            style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
            // 设置右边框;
            style.setBorderRight(XSSFCellStyle.BORDER_THIN);
            // 设置右边框颜色;
            style.setRightBorderColor(IndexedColors.BLACK.getIndex());
            // 设置顶边框;
            style.setBorderTop(XSSFCellStyle.BORDER_THIN);
            // 设置顶边框颜色;
            style.setTopBorderColor(IndexedColors.BLACK.getIndex());
            // 在样式用应用设置的字体;
            style.setFont(font);
            // 设置自动换行;
            style.setWrapText(false);
            // 设置水平对齐的样式为居中对齐;
            style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
            // 设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
    
            return style;
    
        }
    
        /*
         * 列头单元格样式
         */
        public XSSFCellStyle getColumnTopStyle(XSSFWorkbook workbook) {
    
            // 设置字体
            XSSFFont font = workbook.createFont();
            // 设置字体大小
            font.setFontHeightInPoints((short) 11);
            // 字体加粗
            font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
            // 设置字体名字
            font.setFontName("宋体");
            // 设置样式;
            XSSFCellStyle style = workbook.createCellStyle();
            // 设置底边框;
            style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
            // 设置底边框颜色;
            style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
            // 设置左边框;
            style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
            // 设置左边框颜色;
            style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
            // 设置右边框;
            style.setBorderRight(XSSFCellStyle.BORDER_THIN);
            // 设置右边框颜色;
            style.setRightBorderColor(IndexedColors.BLACK.getIndex());
            // 设置顶边框;
            style.setBorderTop(XSSFCellStyle.BORDER_THIN);
            // 设置顶边框颜色;
            style.setTopBorderColor(IndexedColors.BLACK.getIndex());
            // 在样式用应用设置的字体;
            style.setFont(font);
            // 设置自动换行;
            style.setWrapText(false);
            // 设置水平对齐的样式为居中对齐;
            style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
            // 设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
    
            return style;
    
        }
    
        /*
         * 列数据信息单元格样式
         */
        public XSSFCellStyle getStyle(XSSFWorkbook workbook) {
            // 设置字体
            XSSFFont font = workbook.createFont();
            // 设置字体大小
            // font.setFontHeightInPoints((short)10);
            // 字体加粗
            // font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
            // 设置字体名字
            font.setFontName("宋体");
            // 设置样式;
            XSSFCellStyle style = workbook.createCellStyle();
            // 设置底边框;
            style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
            // 设置底边框颜色;
            style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
            // 设置左边框;
            style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
            // 设置左边框颜色;
            style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
            // 设置右边框;
            style.setBorderRight(XSSFCellStyle.BORDER_THIN);
            // 设置右边框颜色;
            style.setRightBorderColor(IndexedColors.BLACK.getIndex());
            // 设置顶边框;
            style.setBorderTop(XSSFCellStyle.BORDER_THIN);
            // 设置顶边框颜色;
            style.setTopBorderColor(IndexedColors.BLACK.getIndex());
            // 在样式用应用设置的字体;
            style.setFont(font);
            // 设置自动换行;
            style.setWrapText(false);
            // 设置水平对齐的样式为居中对齐;
    //            style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
            // 设置垂直对齐的样式为居中对齐;
    //            style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
    
            return style;
    
        }
    
        /*
         * 实现方法
         */
    
        public static void main(String[] args) throws Exception {
    
            String title = "测试";
            String[] rowsName = new String[] { "序号", "列头1", "列头2", "列头3", "列头4", "列头5" };
            List<Object[]> dataList = new ArrayList<Object[]>();
            Object[] objs = null;
            for (int i = 0; i < 10; i++) {
                objs = new Object[rowsName.length];
                objs[0] = i;
                objs[1] = "测试1";
                objs[2] = "测试2";
                objs[3] = "测试3";
                objs[4] = "测试4";
                objs[5] = "测试5";
                dataList.add(objs);
            }
            
            ExportExcelUtil ex = new ExportExcelUtil(title, rowsName, dataList);
            ex.export(request,response);
        }
    
    }

    大家注意main是无法执行的:因为这里并没有 request,response 两个对象,这个demo 主要是方便理解,大家将main内的代码写在您项目Controller内,然后用前端js window.location.href='您的Controller'; 

    即可看到效果,response 会响应给浏览器一个文件流,浏览器会自动下载这个文件

     

    展开全文
  • Java导出要在action层(controller层)中操作 需要到的jar包: 、 后端代码: /** * 导出房产信息 * @param fcHouseProMain * @param request * @param response * @param redirectAttributes ...

    简单Java实现Excel文件导出

    Java导出要在action层(controller层)中操作
    需要到的jar包:
    导入导出Excel文件毕业jar包

    后端代码:
    后面两个函数都是设置Excel文件里的标题样式,专注第一个方法就可以了

    /**
    	 * 导出房产信息
    	 * @param fcHouseProMain
    	 * @param request
    	 * @param response
    	 * @param redirectAttributes
    	 * @return
    	 */
    	@RequiresPermissions("housepro:fcHouseProMain:view")
        @RequestMapping(value = "export", method=RequestMethod.POST)
        public String exportFile(FcHouseProMain fcHouseProMain, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
    		try {
                String fileName = "房产信息"+DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
                /*List<FcHouseProMain> list = fcHouseProMainService.findList(fcHouseProMain);
        		new ExportExcel("房产信息", FcHouseProMain.class).setDataList(list).write(response, fileName).dispose();*/
    			SXSSFWorkbook wb = new SXSSFWorkbook(500);
    			Sheet sheet = wb.createSheet("Export");
    			Map<String, CellStyle> styles = createStyles(wb);
    			String str[] = {"ID","名称"};
    			initialize("房产信息",Arrays.asList(str),wb,sheet,styles);
    			for (int i = 0; i <2; i++) {
    				Row row = sheet.createRow(rownum++);
    				Cell ce1 = row.createCell(0);
    				ce1.setCellValue("100"+(i+1));
    				Cell ce2 = row.createCell(1);
    				ce2.setCellValue("张三"+(i+1));
    			}
    			
    			OutputStream out = response.getOutputStream();
    			response.reset();
    	        response.setContentType("application/octet-stream; charset=utf-8");
    	        response.setHeader("Content-Disposition", "attachment; filename="+Encodes.urlEncode(fileName));
    			wb.write(out);
    			wb.dispose();
    			out.flush();
    			out.close();
        		return null;
    		} catch (Exception e) {
    			addMessage(redirectAttributes, "导出房产信息失败!失败信息:"+e.getMessage());
    		}
    		return "redirect:"+Global.getAdminPath()+"/housepro/fcHouseProMain/?repage";
        }
    	/**
    	 * 当前行号
    	 */
    	private int rownum;
    	private void initialize(String title, List<String> headerList,SXSSFWorkbook wb,Sheet sheet,Map<String, CellStyle> styles) {
    		// Create title
    		if (StringUtils.isNotBlank(title)){
    			Row titleRow = sheet.createRow(rownum++);
    			titleRow.setHeightInPoints(30);
    			Cell titleCell = titleRow.createCell(0);
    			titleCell.setCellStyle(styles.get("title"));
    			titleCell.setCellValue(title);
    			sheet.addMergedRegion(new CellRangeAddress(titleRow.getRowNum(),
    					titleRow.getRowNum(), titleRow.getRowNum(), headerList.size()-1));
    		}
    		// Create header
    		if (headerList == null){
    			throw new RuntimeException("headerList not null!");
    		}
    		Row headerRow = sheet.createRow(rownum++);
    		headerRow.setHeightInPoints(16);
    		for (int i = 0; i < headerList.size(); i++) {
    			Cell cell = headerRow.createCell(i);
    			cell.setCellStyle(styles.get("header"));
    			String[] ss = StringUtils.split(headerList.get(i), "**", 2);
    			if (ss.length==2){
    				cell.setCellValue(ss[0]);
    				Comment comment = sheet.createDrawingPatriarch().createCellComment(
    						new XSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6));
    				comment.setString(new XSSFRichTextString(ss[1]));
    				cell.setCellComment(comment);
    			}else{
    				cell.setCellValue(headerList.get(i));
    			}
    			sheet.autoSizeColumn(i);
    		}
    		for (int i = 0; i < headerList.size(); i++) {  
    			int colWidth = sheet.getColumnWidth(i)*2;
    	        sheet.setColumnWidth(i, colWidth < 3000 ? 3000 : colWidth);  
    		}
    	}
    	
    	/**
    	 * 创建表格样式
    	 * @param wb 工作薄对象
    	 * @return 样式列表
    	 */
    	private Map<String, CellStyle> createStyles(Workbook wb) {
    		Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
    		
    		CellStyle style = wb.createCellStyle();
    		style.setAlignment(CellStyle.ALIGN_CENTER);
    		style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
    		Font titleFont = wb.createFont();
    		titleFont.setFontName("Arial");
    		titleFont.setFontHeightInPoints((short) 16);
    		titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
    		style.setFont(titleFont);
    		styles.put("title", style);
    
    		style = wb.createCellStyle();
    		style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
    		style.setBorderRight(CellStyle.BORDER_THIN);
    		style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
    		style.setBorderLeft(CellStyle.BORDER_THIN);
    		style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
    		style.setBorderTop(CellStyle.BORDER_THIN);
    		style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
    		style.setBorderBottom(CellStyle.BORDER_THIN);
    		style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());
    		Font dataFont = wb.createFont();
    		dataFont.setFontName("Arial");
    		dataFont.setFontHeightInPoints((short) 10);
    		style.setFont(dataFont);
    		styles.put("data", style);
    		
    		style = wb.createCellStyle();
    		style.cloneStyleFrom(styles.get("data"));
    		style.setAlignment(CellStyle.ALIGN_LEFT);
    		styles.put("data1", style);
    
    		style = wb.createCellStyle();
    		style.cloneStyleFrom(styles.get("data"));
    		style.setAlignment(CellStyle.ALIGN_CENTER);
    		styles.put("data2", style);
    
    		style = wb.createCellStyle();
    		style.cloneStyleFrom(styles.get("data"));
    		style.setAlignment(CellStyle.ALIGN_RIGHT);
    		styles.put("data3", style);
    		
    		style = wb.createCellStyle();
    		style.cloneStyleFrom(styles.get("data"));
    //		style.setWrapText(true);
    		style.setAlignment(CellStyle.ALIGN_CENTER);
    		style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
    		style.setFillPattern(CellStyle.SOLID_FOREGROUND);
    		Font headerFont = wb.createFont();
    		headerFont.setFontName("Arial");
    		headerFont.setFontHeightInPoints((short) 10);
    		headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
    		headerFont.setColor(IndexedColors.WHITE.getIndex());
    		style.setFont(headerFont);
    		styles.put("header", style);
    		
    		return styles;
    	}
    
    展开全文
  • HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setWrapText(true); //文本内容自动换行
  • 注解反射导出Excel自定义中文表头,数据库查出数据,亲测可用
  • 1.首先需要一个实体类 import lombok.Data; @Data public class PoiModel { //内容 private String content; //上一行同一位置内容 private String oldContent;...2.导出表格工具类 package com.ccb.financial
  • package ... import java.lang.annotation.*; /** * * @ClassName: ProtocolAnnotation * @Description: 自定义注解的使用 * @date 2018年1月9日 下午5:44:08 * */ public class ProtocolAnn...
  • java导出excel合并单元格及设置

    千次阅读 2019-04-23 15:16:12
    功能是导出表格 package checkout_excel; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; public class MainOut { public static void main(String args[]){ //...
  • java程序导出Excel

    2016-05-06 09:33:12
    main函数测试的java导出Excel,导入工程可运行,支持标题居中,字体大小,带边框线
  • 1 Java导出Excel文件 function excelOut(){  window.location.href="../getFileToExcel/"+taskId; } String taskId = getPara(0);  // 获取数据  List list = ts.getTaskDetailByTaskId(taskId);  //...
  • * 创建excel,并插入数据 * @param titleList * @param rowsList */ public AjaxResult createExcelView(List<String> titleList, List<Map<String, Object>> rowsList, String sheetName) {...
  • 一个导出excel,内容包括大标题,列标题和数据,现在这个大标题不会弄。用的是HSSFWorkbook。我是新手,希望能说的详细一点,多谢!我这样写的 HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet =...
  • JAVA导出EXCEL实现

    万次阅读 多人点赞 2019-07-31 18:39:28
    JAVA导出EXCEL实现
  • java导出excel复合表头简单实例

    热门讨论 2014-05-10 13:11:32
    本资源实现了Excel的简单导出实例,同时也实现了导出Excel复合表头的简单实例,适合一些需要用到导出Excel技术的初学者。
  • Java导出Excel(自定义格式,非纯导出表格) 最近业务有个需求需要用到导出Excel表,按模板格式导出报关单(比较复杂,需要一格一格画),这里记录一下Excel导出怎么用 如果只是导出纯表列数据,可以不用我这种方法 ...
  • java导出excel的两种方式

    万次阅读 多人点赞 2019-04-05 10:24:31
    一、在后台实现,利用java的poi 1、导入jar包,需要导入lib文件夹下如下包: poi-3.11-20141221.jar poi-ooxml.jar poi-ooxml-schemas.jar 2、在util下写一个公共类,该类主要利用Jakarta POI HSSF API组件(用于...
  • 目录背景POI版本自定义注解逻辑代码实现测试 背景 最近项目需要导出数据到Excel 表格中,在包装好获取表格方法...我用的是POI导出Excel,版本如下: <!-- https://mvnrepository.com/artifact/org.apache.poi/poi
  • 最近做项目太多的导出excel,每个业务层的代码都几乎一样,对与像我这样有代码洁癖的人是不可忍受的,于是就动手自己封装了一个基于POI3.17的简单的小框架。 在gitee上我有附上word使用教程,在这里简单展示一下测试...
  • Java poi导出excel合并标题单元格

    万次阅读 2015-12-11 11:12:52
    Java poi导出excel合并标题单元格
  • java导出excel包含图片

    千次阅读 2021-01-13 16:50:11
    最近有需要导出用户留言的数据,包含用户留言的上传的照片 在网上找了很多教程,最后实现了业务,导出来有点丑,后续再做优化,代码功能有局限性,看到的小伙伴如果有好的想法可以说说,让我学习学习 最后实现的...
  • java poi导出excel设置手动换行

    千次阅读 2019-08-13 14:38:40
    所以在设置的时候,就需要设置下换行,感觉就比较直观美观. 但是在text中直接使用了\r\n没有达到换行的效果....最后发现需要将属性设置为允许自动换行... //设置自动换行 sellStyle.setWrapTest(true); \r\n ...
  • JAVA 导出Excel设置名称为中文 核心:URLEncoder.encode(名称, “UTF-8”); 设置编码 String exportFileName =“测试中文名称.xlsx” String fileNameURL = URLEncoder.encode(exportFileName, “UTF-8”);

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,239
精华内容 4,495
关键字:

java导出excel设置标题

java 订阅