精华内容
下载资源
问答
  • 主要介绍了Java FineReport报表工具导出EXCEL的四种方式的相关资料,需要的朋友可以参考下
  • 本文主要介绍了Java根据模板导出Excel报表并复制模板生成多个Sheet页的方法,具有很好的参考价值。下面跟着小编一起来看下吧
  • java报表导出Excel的一个简单的类就几行代码。
  • 利用开源组件POI3.0.2,用java语言实现了动态导出Excel文档,并且也实现了Excel文档的导入。有完整的例子,可直接使用。ExportExcel类为导出Excel报表通用类。 1.将源代码导入eclipse中 2.部署项目,启动tomcat...
  • 能够实现「导入/导出 Excel」的第三方常用类库有 Apache poi、Java Excel(JXL)和阿里巴巴开源的 Easyexcel 等。这么多类库该怎么选呢?在这里小编给大家推荐阿里巴巴开源的「Easyexcel」。 性能对比 poi 和 jxl ...
  • 用于前端传递table值到Java后台,进行导出Excel表格操作
  • java生成excel报表

    2015-01-19 18:19:56
    java ,apache poi生成excel报表
  • 在实际的应用中会经常需要将数据导出excel导出的方式除原样导出还有分页导出、分页分sheet导出和大数据量导出,这些导出方式在JAVA程序中分别有不同的接口来实现。
  • java程序导出Excel

    2016-05-06 09:33:12
    main函数测试的java导出Excel,导入工程可运行,支持标题居中,字体大小,带边框线
  • Java利用poi导出excel表格
  • java导出Excel 时候 相同行合并(可合并多列); 已测试通过;
  • java Excel工具类,导入导出Excel数据,导入数据对合并表格有判断获取数据,导出数据到Excel,Excel文件不存在会创建。 博客:https://blog.csdn.net/qq_37902949/article/details/81230640
  • Java POI 导入导出Excel简单实例源代码

    千次下载 热门讨论 2014-08-28 16:25:39
    Java POI 导入导出Excel简单实例源代码 该源代码的jar包,参见以下博文附录截图 Java POI导出EXCEL经典实现 Java导出Excel弹出下载框 http://blog.csdn.net/evangel_z/article/details/7332535 web页面导出Excel...
  • 一个Maven项目,下载直接使用,直接找到 JxlsTest运行demo即可,功能强大,基本能满足所有报表导出需求,支持多个Sheet导出,支持复杂的导出组合,可以自己写模板试玩下。
  • NULL 博文链接:https://183615215-qq-com.iteye.com/blog/1858208
  • java统计报表导出excle,自定义存储目录 做一个将查询出来的数据写入excel,并且点击导出按钮是,可以选择导出路径 **直接上完整代码 1.utils工具类,里面可以自己设置样式,详细看注释 import java.io.File; ...

    java统计报表,导出excle,自定义存储目录

    做一个将查询出来的数据写入excel,并且点击导出按钮是,可以选择导出路径
    **直接上完整代码

    1.utils工具类,里面可以自己设置样式,详细看注释

    import java.io.File;
    import java.io.FileOutputStream;
    import org.apache.commons.io.FileUtils;
    import org.apache.poi.hssf.usermodel.*;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpStatus;
    import org.springframework.http.MediaType;
    import org.springframework.http.ResponseEntity;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class ExcelUtil {
    	/*sheet Name表名, titleName标题名, file Name文件名,
        columnNumber列号, columnWidth列宽, columnName列名
        *
        */
        public static ResponseEntity<byte[]> ExportNoResponse(String sheetName, String titleName,String fileName, int columnNumber, int[] columnWidth,String[] columnName, String[][] dataList, HttpServletRequest request,HttpServletResponse response) throws Exception {
    
            if (columnNumber == columnWidth.length && columnWidth.length == columnName.length) {
                // 第一步,创建一个webbook,对应一个Excel文件
                HSSFWorkbook wb = new HSSFWorkbook();
                // 第二步,在webbook中添加一个sheet,对应Excel文件中的sheet
                HSSFSheet sheet = wb.createSheet(sheetName);
                // sheet.setDefaultColumnWidth(15); //统一设置列宽
                for (int i = 0; i < columnNumber; i++) {
                    for (int j = 0; j <= i; j++) {
                        if (i == j) {
                            sheet.setColumnWidth(i, columnWidth[j] * 256); // 单独设置每列的宽
                        }
                    }
                }
                // 创建第0行 也就是标题
                HSSFRow row1 = sheet.createRow((int) 0);
                row1.setHeightInPoints(20);// 设备标题的高度
                // 第三步创建标题的单元格样式style2以及字体样式headerFont1
                HSSFCellStyle style2 = wb.createCellStyle();
                style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
                style2.setFillForegroundColor(HSSFColor.LIGHT_TURQUOISE.index);
                style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
                HSSFFont headerFont1 = (HSSFFont) wb.createFont(); // 创建字体样式
                headerFont1.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 字体加粗
                headerFont1.setFontName("黑体"); // 设置字体类型
                headerFont1.setFontHeightInPoints((short) 15); // 设置字体大小
                style2.setFont(headerFont1); // 为标题样式设置字体样式
    
                HSSFCell cell1 = row1.createCell(0);// 创建标题第一列
                sheet.addMergedRegion(new CellRangeAddress(0, 0, 0,
                        columnNumber - 1)); // 合并第0到第17列
                cell1.setCellValue(titleName); // 设置值标题
                cell1.setCellStyle(style2); // 设置标题样式
    
                // 创建第1行 也就是表头
                HSSFRow row = sheet.createRow((int) 1);
                row.setHeightInPoints(37);// 设置表头高度
    
                // 第四步,创建表头单元格样式 以及表头的字体样式
                HSSFCellStyle style = wb.createCellStyle();
                style.setWrapText(true);// 设置自动换行
                style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
                style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 创建一个居中格式
    
                style.setBottomBorderColor(HSSFColor.BLACK.index);
                style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                style.setBorderRight(HSSFCellStyle.BORDER_THIN);
                style.setBorderTop(HSSFCellStyle.BORDER_THIN);
    
                HSSFFont headerFont = (HSSFFont) wb.createFont(); // 创建字体样式
                headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 字体加粗
                headerFont.setFontName("黑体"); // 设置字体类型
                headerFont.setFontHeightInPoints((short) 10); // 设置字体大小
                style.setFont(headerFont); // 为标题样式设置字体样式
    
                // 第四.一步,创建表头的列
                for (int i = 0; i < columnNumber; i++) {
                    HSSFCell cell = row.createCell(i);
                    cell.setCellValue(columnName[i]);
                    cell.setCellStyle(style);
                }
    
                String code = createID2();
                // 第五步,创建单元格,并设置值
                for (int i = 0; i < dataList.length; i++) {
                    row = sheet.createRow((int) i + 2);
                    // 为数据内容设置特点新单元格样式1 自动换行 上下居中
                    HSSFCellStyle zidonghuanhang = wb.createCellStyle();
                    zidonghuanhang.setWrapText(true);// 设置自动换行
                    zidonghuanhang
                            .setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 创建一个居中格式
    
                    // 设置边框
                    zidonghuanhang.setBottomBorderColor(HSSFColor.BLACK.index);
                    zidonghuanhang.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                    zidonghuanhang.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                    zidonghuanhang.setBorderRight(HSSFCellStyle.BORDER_THIN);
                    zidonghuanhang.setBorderTop(HSSFCellStyle.BORDER_THIN);
    
                    // 为数据内容设置特点新单元格样式2 自动换行 上下居中左右也居中
                    HSSFCellStyle zidonghuanhang2 = wb.createCellStyle();
                    zidonghuanhang2.setWrapText(true);// 设置自动换行
                    zidonghuanhang2
                            .setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 创建一个上下居中格式
                    zidonghuanhang2.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
    
                    // 设置边框
                    zidonghuanhang2.setBottomBorderColor(HSSFColor.BLACK.index);
                    zidonghuanhang2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
                    zidonghuanhang2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
                    zidonghuanhang2.setBorderRight(HSSFCellStyle.BORDER_THIN);
                    zidonghuanhang2.setBorderTop(HSSFCellStyle.BORDER_THIN);
                    HSSFCell datacell = null;
                    for (int j = 0; j < columnNumber; j++) {
                        datacell = row.createCell(j);
                        datacell.setCellValue(dataList[i][j]);
                        datacell.setCellStyle(zidonghuanhang2);
                    }
                }
                // 第六步,将文件存到指定位置
                try {
    
                    String path =  request.getServletContext().getRealPath("/upload/" + "测试报表" +code+ ".xls");
    
                    File file = new File(path);
                    if(!file.exists()){
                        //先得到文件的上级目录,并创建上级目录,在创建文件
                        file.getParentFile().mkdir();
                        try {
                            //创建文件
                            file.createNewFile();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
    
                    FileOutputStream fout = new FileOutputStream(file);//  new FileOutputStream("\\upload\\" + "测试报表" +code+ ".xls");
                    wb.write(fout);
                    fout.close();
    
    
    
                    String fileName1 = "测试报表" +code+ ".xls";
                    //fileName1 = fileName1.substring(1, fileName1.length());
                    String dfileName = new String(fileName1.getBytes("gb2312"), "iso8859-1");
                    HttpHeaders headers = new HttpHeaders();
                    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
                    headers.setContentDispositionFormData("attachment", dfileName);
    
                    String str = "导出" + "测试报表" + "成功!";
                    System.out.println(str);
                    //HttpStatus.OK兼容ie
                    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),
                            headers, HttpStatus.OK);
    //					fout.close();
                } catch (Exception e) {
                    e.printStackTrace();
                    String str1 = "导出" + "测试报表" + "失败!";
                    System.out.println(str1);
                }
    
            } else {
                System.out.println("失败,Game over");
            }
            return null;
        }
        
    	public static String createID2(){
    			      
    		        //将Date类型转成String类型
    		        Date now=new Date();
    		        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
    		        String dateStr=dateFormat.format(now);
    		        
    		        byte[] lock = new byte[0];
    				// 位数,默认是8位
    				final long w = 100000000;
    				
    				long r = 0;
    				synchronized (lock) {
    					r = (long) ((Math.random() + 1) * w);
    				}
    		        
    				return dateStr+String.valueOf(r).substring(1);
    		       
    		}
    }
    

    3.请求方法

    @RequestMapping(value = "/toFile")
        public ResponseEntity<byte[]> uploadFile(
                                                 HttpServletRequest request,
                                                 HttpServletResponse response) throws Exception {
            
            List<IsOrRe> list = isOrReService.slectByParam();
    
            String sheetName = "测试统计表单";
            String titleName =  "清城测试订单报表";
            String fileName = "测试报表XXX";
            //columnWidth columnName 长度等于columnNumber
            int columnNumber = 8;
            int[] columnWidth = {6, 12,10, 15, 15, 12, 10,, 15};
            String[] columnName = {"序号", "XX公司", "产品名称", "方案XX", "订单号", "XX号", "XX1", "XX2"};
            //将List转换为二维数组String[][]
            String[][] ss = new String[list.size()][columnNumber];
            for (int i = 0; i < list.size(); i++) {
                ss[i] = new String[]{String.valueOf(i+1),list.get(i).getInCony(),
                        list.get(i).getPrName(), list.get(i).getPlName(),
                        list.get(i).getOrNo(), list.get(i).getPoNo(),
                        list.get(i).getAppName(),list.get(i).getAppMobile() };
            }
            ResponseEntity<byte[]> res = ExportNoResponse(sheetName, titleName, fileName,
                    columnNumber, columnWidth, columnName, ss, request, response);
            return res;
        }
    

    浏览器点击导出按钮导出效果:这就可以选择导出路径了
    在这里插入图片描述

    xls内容样式
    在这里插入图片描述

    展开全文
  • Java导出Excel表格

    2020-12-22 20:49:37
     Web开发是,我们经常会遇见客户要求,把某些数据导出Excel,有利于客户分析和打印等等。下面是导出Excel下载的对应是JSP.  1.点击“导出”按钮时,触发exportExcel()的JS方法,JS方法跳到对应的JSP,实现导出...
  • 自己写的导出excel报表的公共方法,该公共方法主要用于非横向流动性报表导出 ExcelUtil.java 1.创立excel基本初始步骤 XSSFWorkbook wb = new XSSFWorkbook(); XSSFCellStyle cellStyle = excelUtil....

    自己写的导出excel报表的公共方法,该公共方法主要用于非横向流动性报表导出

    1.创立excel基本初始步骤

    		XSSFWorkbook wb = new XSSFWorkbook();
    		XSSFCellStyle cellStyle = excelUtil.setHeaderStyle(wb);//表头格式
    		XSSFCellStyle cellStyle2 = excelUtil.setContentStyle(wb);//表体
    
    		XSSFSheet sheet = wb.createSheet("newsheet");
    		XSSFRow head = sheet.createRow(0);

    2.创建表头格式方法

    	public XSSFCellStyle setHeaderStyle(XSSFWorkbook wb) {
    		XSSFCellStyle cellStyle = wb.createCellStyle();
    		cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 左右居中
    		cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 垂直居中
    		XSSFFont font = wb.createFont();
    		font.setFontName("宋体");
    		font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); // 粗体显示
    		font.setFontHeightInPoints((short) 14);// 设置字体大小
    		cellStyle.setFont(font);// 选择需要用到的字体格式
    		return cellStyle;
    	}

    3.创立表体格式公共方法

    	public XSSFCellStyle setContentStyle(XSSFWorkbook wb) {
    		XSSFCellStyle cellStyle2 = wb.createCellStyle();
    		cellStyle2.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 左右居中
    		cellStyle2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 垂直居中
    		XSSFFont font2 = wb.createFont();
    		font2.setFontName("宋体");
    		font2.setFontHeightInPoints((short) 12);
    		cellStyle2.setFont(font2);// 选择需要用到的字体格式
    		return cellStyle2;
    	}

    4.在复合excel表中创立子表头样式公共方法

    public XSSFCellStyle setSubHeaderStyle(XSSFWorkbook wb) {
    		XSSFCellStyle cellStyle = wb.createCellStyle();
    		cellStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 左右居中
    		cellStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 垂直居中
    		XSSFFont font = wb.createFont();
    		font.setFontName("仿宋_GB2312");
    		font.setColor(HSSFColor.GREY_50_PERCENT.index);
    		font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD); // 粗体显示
    		font.setFontHeightInPoints((short) 13);// 设置字体大小
    		cellStyle.setFont(font);// 选择需要用到的字体格式
    		return cellStyle;
    	}

    5.在复合excel表中创立子表体样式公共方法

    public XSSFCellStyle setSubContentStyle(XSSFWorkbook wb) {
    		XSSFCellStyle cellStyle2 = wb.createCellStyle();
    		cellStyle2.setAlignment(XSSFCellStyle.ALIGN_CENTER); // 左右居中
    		cellStyle2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 垂直居中
    		XSSFFont font2 = wb.createFont();
    		font2.setFontName("仿宋_GB2312");
    		font2.setColor(HSSFColor.GREY_50_PERCENT.index);
    		font2.setFontHeightInPoints((short) 11);
    		cellStyle2.setFont(font2);// 选择需要用到的字体格式
    		return cellStyle2;
    	}

    6.创立表头内容公共方法

    	private String [] headers = {"姓名","学号","性别","班级","语文","数学","英语",
    			"物理","化学","生物","总分","排名"};

        将初始步骤中创建的参数和表头传入此公共方法中

    	public  void createHeadCell(String[] headArray,XSSFCellStyle cellStyle,XSSFRow row){
    		int count = 0;
    		for(int i=0;i<headArray.length;i++){
    			XSSFCell headcell = row.createCell(count);
    			headcell.setCellStyle(cellStyle);
    			headcell.setCellValue(headArray[i]);
    			count++;
    		}
    	}	

    7.创立表体内容公共方法

    将每一行的表体插入一个list里,然后每创建一行掉一次该方法,list的内容要按表头顺序添加

    //创立表体
    	public  void createValueCell(List cellList, XSSFCellStyle cellStyle, XSSFRow row){
    		int count = 0;
    		for(int i=0;i<cellList.size();i++){
    			XSSFCell headcell = row.createCell(count);
    			headcell.setCellStyle(cellStyle);
    			if(cellList.get(i) == null){
    				headcell.setCellValue("");
    				count++;
    				continue;
    			}
    			headcell.setCellValue(cellList.get(i).toString());
    			count++;
    		}
    	}
    

    展开全文
  • 通过条件查询数据库list,根据list去导出多列的excel表格,亲测有效工具类和代码js controller都放在一起
  • java导出excel文档通用工具类

    热门讨论 2012-05-08 23:21:35
    java导出excel文档通用工具类,使用方便。 可选择性的生成报表表头。
  • 工作中肯定会有的报表导出的功能,咱先来理下思路 先定义好模板文件,存放到一个有权限访问的目录内 根据模板路径,获取模板文件 /** * 根据模板的路径获取模板文件对象 * classpath根目录下:/template/report...

    工作中肯定会有的报表导出的功能,咱先来理下思路

    1. 先定义好模板文件,存放到一个有权限访问的目录内
    2. 根据模板路径,获取模板文件
    	/**
    	* 根据模板的路径获取模板文件对象
    	* classpath根目录下:/template/report.xlsx
    	*/
    	private File getTemplateFile(String template) throws URISyntaxException {
            URL resource = Thread.currentThread().getContextClassLoader().getResource("/");
            Path classpath = Paths.get(resource.toURI());
            Path path = Paths.get(classpath.toString(), template);
            return path.toFile();
        }
    
    1. 读取报表需要的数据
    	private List<Report> getReport(Long reportId, String day) {
            Map<String,Object> key=new HashMap<>(2);
            key.put("day",day);
            key.put("reportId",reportId);
            return dao.select("xxx.xxx",key);
        }
    
    1. 处理数据,使其符合模板的数据格式,方便渲染数据(也可以直接单元格逐个填充,则可省略该步骤)

    2. 填充数据

     	// 读取excel模板文件
       	File reportFile = getTemplateFile(report.getTemplatePath());
       	// 拼装excel报表文件
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(reportFile));
        if (Objects.nonNull(workbook)) {
            if (CollectionUtils.isNotEmpty(modelList)) {
               // 逐个sheet填充数据
               sheetProcessorHolder.process(modelList,workbook);
            }
        }
        // 设置第一个sheet为活动sheet
        workbook.setActiveSheet(0);
        return workbook;
    
    1. 关键的下载步骤:
     /**
       * 导出并下载excel报表文件
       *
       * @param reportId
       * @param day
       * @param response Http的响应对象,用于向用户输出excel文件流下载使用
       */
      public void exportExcel(String day, HttpServletResponse response) throws Exception {
          XSSFWorkbook workbook = getProcessor(report).process(report, day);
          String fileName = buildFileName(day);
          response.setHeader("Content-disposition", String.format("attachment; filename=%s.xlsx", URLEncoder.encode(fileName, "UTF-8")));
          response.setContentType("application/msexcel");
          try (ServletOutputStream outputStream = response.getOutputStream()) {
              workbook.write(outputStream);
              outputStream.flush();
          }
      }
    
    1. 涉及的关键代码
    /**
     * 根据坐标获取单元格A2,B4...
     *
     * @param sheet
     * @param cell   单元格列坐标A,B,C...
     * @param rowNum 单元格行坐标1,2,3...
     * @return
     */
    private XSSFCell getXssfCell(XSSFSheet sheet, String cell, int rowNum) {
        CellReference reference = new CellReference(String.format("%s%d", cell, rowNum));
        XSSFRow row = sheet.getRow(reference.getRow());
        if (Objects.nonNull(row)) {
            return row.getCell(reference.getCol());
        }
        return null;
    }
    
    
    XSSFCell cell = getXssfCell(sheet, column, row);
    // 单元格内赋值
    cell.setCellValue(value); 
    // 设置单元格的公式:SUM(B2:B6)
    cell.setCellFormula(formula);
    
     //强制执行该sheet中所有公式
     sheet.setForceFormulaRecalculation(true);
    
    /**
     * 插入一行
     *
     * @param sheet
     * @param starRow
     * @param rows
     * @return
     */
    protected XSSFRow insertRow(XSSFSheet sheet, int starRow, int rows) {
    
        //参数:
        // startRow-要开始移位的行
        // endRow-要结束移位的行
        // n-要移位的行数
        // copyRowHeight-是否在移位期间复制行高
        // resetOriginalRowHeight-是否将原始行的高度设置为默认值
        sheet.shiftRows(starRow, sheet.getLastRowNum(), rows, true, false);
        // 所有行下移,并复制上一行的所有列的样式、公式
        for (int i = 0; i < rows; i++) {
            XSSFRow sourceRow = sheet.getRow(starRow - 1 - i);
            XSSFRow targetRow = sheet.createRow(starRow + i);
            targetRow.setHeight(sourceRow.getHeight());
    
            for (int cn = sourceRow.getFirstCellNum(); cn < sourceRow.getLastCellNum(); cn++) {
                XSSFCell sourceCell = sourceRow.getCell(cn);
                XSSFCell targetCell = targetRow.createCell(cn);
    
                targetCell.setCellStyle(sourceCell.getCellStyle());
            }
        }
        return sheet.getRow(starRow);
    }
    

    调用上面的插入1行的代码

    List list = ....
    for (int i = 0; i < list.size(); i++) {
         int rowNum = i + 2; 	//行号,1开始
         int rowIndex = i + 1; 	// 行的索引,0开始
         XSSFRow row;
         if (rowIndex == 1) {	//第一行都是表头,所以从第二行开始插入数据
             row = sheet.getRow(rowIndex);
         } else {
             // 当插入的行号大于第二行,则创建新行并复制上一行所有列的样式,公式等
             row = insertRow(sheet, rowIndex, 1);
         }
         后面的处理....
    }
    
     // 获取行的有效使用的总列数
     int cellCount = row.getPhysicalNumberOfCells();
    
    展开全文
  • Java POI 导出Excel 表格

    千次阅读 2018-11-14 11:46:38
    最近给客户做了一个绩效计提的功能,需要能够在后台预览Excel表格数据,并添加导出功能,本身个人对Excel表的一些操作并不是特别熟练,所以统计表的结构对我个人来说算是比较复杂的了,涉及到多次的跨行处理,跨列...

           最近给客户做了一个绩效计提的功能,需要能够在后台预览Excel表格数据,并添加导出功能,本身个人对Excel表的一些操作并不是特别熟练,所以统计表的结构对我个人来说算是比较复杂的了,涉及到多次的跨行处理,跨列处理,并动态设置单元格对应的公式,以及一些特定的行或列设置不同的一个样式。先来给大家看一下几个绩效表中结果最简单的一个。下图是导出的Excel表格

             虽然之前也做过导出Excel表类似的功能,但是之前所做的都是动态生成没一行的数据,并没有涉及到跨行,跨列,动态设置单元格这些操作,在做的过程中,也百度很多poi 导出Excel表的一些案例,但是都是比较简单,或者比较片面的一些例子。所以就想着写一篇博客记录一下自己的感受,把自己碰到的一些问题给记录一下,也希望能给有同样业务需求的朋友一个参考。

            如何使用poi去导出Excel表格,网上有很多案例,相信大部分人看了以后都能够理解和引用的,那么如何使用poi及poi的一些常用方法,简单介绍一下,主要着重写一下碰到的问题,以及我个人的解决方法。

    首先给大家看一下,读取Excel表模板及导出Excel表格的io流文件处理方法

    @RequestMapping({ "exportExcel" })
    	@Action( description = "导出excel方法",platformModelCode=LoanformUtil.riskManage,platformCode=LoanformUtil.platformCode, detail = "" , execOrder = ActionExecOrder.BEFORE , exectype = "" , ownermodel = SysAuditModelType.NULL )
    	public void exportExcelTest(HttpServletRequest request, HttpServletResponse response) {
    		try {
    			// 月份
    			String monthNumber = RequestUtil.getString(request, "monthNumber");
    			String excelName = monthNumber+"提前结清表";
    			//模板文件路径
    			//String path = this.getClass().getClassLoader().getResource("/").getPath();
                String fileName  = SystemProperties.getValue("advanceModel");
    			//String fileName  = "E://advanceModel.xlsx";
                FileInputStream inputStream = new FileInputStream(fileName);
    
    			String curdateStr = DateFunc.getDefDateFormat(new Date());
    
    			// 设置response参数,可以打开下载页面
    			response.reset();
    			response.setContentType("application/vnd.ms-excel;charset=utf-8");
    			response.setHeader("Content-Disposition", "attachment;filename="+ new String(excelName.getBytes("GBK"), "iso-8859-1") + ".xlsx");
    			
    			QueryFilter filter = new QueryFilter();
    			filter.addFilter("monthNumber", monthNumber);			
    			
    			//顺序要和Excel模板表的字段顺序一致
    			String keys[] = { "departmentName", "managerName", "serialNumber", "customerName", "sx","loanMoney", "loanTerm"
    					, "loanDays", "loanMonthRate", "loanYearRate", "loanFormalityRate", "loanYearFormalityRate", "loanYearComprehensiveRate"
    					, "repayType", "yearLoanBalance", "loanSettleDate", "personCalCoeStandard","personCalRatio"
    					, "personComprehensiveCalRatio"
    					, "personEndCalMoney", "personEndCalBonus", "personEndCalMarketingCost", "remark"};
    			
    			//获取部门合计数据
    			List<LoanPerformanceTotal> total = this.loanPerformanceTotalService.getBySqlKeyAll(filter, "getAdvanceDepartTotal");
    			
        		//获取输出流
                ServletOutputStream os = response.getOutputStream();
    			
                this.loanPerformanceAdvanceService.createXSSFWorkBook(total, keys, new XSSFWorkbook(inputStream), 6, "提前结清", monthNumber).write(os);
    
                os.flush();  
                os.close(); 
    		} catch (Exception e) {
    			logger.error("导出提前结清Excel表出错"+e.getMessage());
    			e.printStackTrace();
    		}
    	}

    因为表头比较复杂,懒得自己去画,所以我的处理方法是,直接使用客户给的模板的表头,通过读取模板的方法,然后再指定行开始插入数据,再进行导出,当然,也可以不用读取模板的方法。这个主要看个人。

    一 、如何使用Jakarta POI,及简介

           Jakarta POI 是一套用于访问微软格式文档的Java API。Jakarta POI有很多组件组成,其中有用于操作Excel格式文件的HSSF和用于操作Word的HWPF,在各种组件中目前只有用于操作Excel的HSSF相对成熟。官方主页http://poi.apache.org/index.html,API文档http://poi.apache.org/apidocs/index.html

    HSSF开头的针对于03版本的,XSSF开头的针对07版本

    jar包下载及引用

    1、官方下载:http://poi.apache.org/download.html这里可以下载到它的最新版本和文档,目前最新版本是3.7,这里使用比较稳定的3.6版

    2、将根目录下的poi-3.6-20091214.jar和Lib目录下三个通用包 commons-logging-1.1.jar junit-3.8.1.jar log4j-1.2.13.jar拷贝到项目的Lib下

    3、使用思路  以03版本的为例,07版本一样(类以XSSF开头)

    HSSF(用于操作Excel的组件)提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象,样式和格式,有以下几种常用的对象:

    常用组件:

    HSSFWorkbook     excel的文档对象

    HSSFSheet            excel的表单

    HSSFRow               excel的行

    HSSFCell                excel的格子单元

    HSSFFont               excel字体

    样式:

    HSSFCellStyle         cell样式

     

    基本操作步骤:

    首先,我们应该要知道的是,一个Excel文件对应一个workbook,一个workbook中有多个sheet组成,一个sheet是由多个行(row)和列(cell)组成。那么我们用poi要导出一个Excel表格

    的正确顺序应该是:

    a、用HSSFWorkbook打开或者创建“Excel文件对象”

    b、用HSSFWorkbook对象返回或者创建Sheet对象

    c、用Sheet对象返回行对象,用行对象得到Cell对象

    d、对Cell对象读写。

    e、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面

     

    二、常用方法,我的模板使用的是07版本的,所以我以XSSF*为例。

    //根据名称读取工作簿 
    XSSFSheet sheet = workbook.getSheet(modelName);  因为我是通过读取模板的方式所以会根据表的名称来读取对应的表格

    workbook.getSheetAt(index);当然大家也可以使用索引来获取对应的sheet对象

     row1 = sheet.createRow(rowNum);  创建行

     cell1 = row1.createCell(j); 创建单元格

     cell1.setCellStyle(style); 设置单元格样式,参数为XSSFCellStyle 对象,以下的方法返回。

     sheet.addMergedRegion(new CellRangeAddress(mstartRow, rowNum-1, 1, 1));  跨行处理,四个参数方别为,开始行,结束行,开始列,结束列(下标都是从0 开始

    cell3.setCellValue(advance.getPersonEndCalBonusThree().doubleValue());  设置单元格的值
                             
     cell1.setCellFormula("T" + (rowNum+1) +"*0.7");   设置公式(因为我是读取模板的,所以字段对应的列是固定的,行是动态获取

    /**
     	 * 定义单元格内容样式
     	 * @param workbook
     	 * @return
     	 */
        public static XSSFCellStyle getXSSFStyle(XSSFWorkbook workbook) {  
            //设置字体;  
            XSSFFont font = workbook.createFont();  
            //设置字体大小;  
            font.setFontHeightInPoints((short) 10);  
            //设置字体名字;  
            font.setFontName("Courier New");  
            //font.setItalic(true);  
            //font.setStrikeout(true);  
            //设置样式;  
            XSSFCellStyle style = workbook.createCellStyle();  
            //设置底边框;  
            style.setBorderBottom(XSSFCellStyle.BORDER_THIN);  
            //设置底边框颜色;  
            style.setBottomBorderColor( new XSSFColor(Color.BLACK));  
            //设置左边框;  
            style.setBorderLeft(XSSFCellStyle.BORDER_THIN);  
            //设置左边框颜色;  
            style.setLeftBorderColor(new XSSFColor(Color.BLACK));  
            //设置右边框;  
            style.setBorderRight(XSSFCellStyle.BORDER_THIN);  
            //设置右边框颜色;  
            style.setRightBorderColor(new XSSFColor(Color.BLACK));  
            //设置顶边框;  
            style.setBorderTop(XSSFCellStyle.BORDER_THIN);  
            //设置顶边框颜色;  
            style.setTopBorderColor(new XSSFColor(Color.BLACK));  
            //在样式用应用设置的字体;  
            style.setFont(font);  
            //设置自动换行;  
            style.setWrapText(true);  
            //设置水平对齐的样式为居中对齐;  
            style.setAlignment(XSSFCellStyle.ALIGN_CENTER);  
            //设置垂直对齐的样式为居中对齐;  
            style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
            
            //设置背景颜色
            style.setFillForegroundColor(IndexedColors.WHITE.getIndex());
    		style.setFillPattern(CellStyle.SOLID_FOREGROUND);
    		
    		//小数点保留两位
    		style.setDataFormat(HSSFDataFormat.getBuiltinFormat("0.00"));
            return style;  
        }  

    操作Excel对象思路,由大到小,也就是说,先有 new XSSFWorkbook(inputStream)对象,再有XSSFSheet对象,类推(先遍历行,再遍历单元格)。

    三、碰到的问题

    1、版本问题,07版本对应XSSF开头,03版本对应HSSF开头。

    org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
        at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:133)

    解决方法:使用对应的工具类就可以了。

    2、合并单元格问题

    在这里想说的是,只要有这些提示,代码处理肯定有问题(为什么说这句话,有时候,提示了,但是导出来的效果是正常的),因为这个问题,废了一点功夫才找到原因,原来是在做跨行处理的时候,没处理好,对其中的某个单元格进行了重复跨行处理,也就是冲突造成的,一个单元格对象只能处理一次

    需要注意的问题,单元格跨行处理,比如说一个单元格需要跨3行,这种情况,不能是我就只sheet.createRow(rowNum) 一个 row对象,得创建相应的3个row对象,和cell对象。

    因为任何处理跨行跨列问题,没有一个好的思路来处理是一个很炒蛋的问题,要么格式乱了,要么冲突了。

    我个人解决这个问题的方法是,先简单的把每一行,每一个单元格遍历创建并设置对应的值,因为我知道特殊的行和单元格是需要做处理的,比如最开始的效果图 部门和客户经理的跨行处理,在遍历的时候我可以获取到开始行,结束行,开始列,结束列的,然后我把这些信息先放到一个list中,最后在遍历list来处理跨行跨列问题。当然这只是我个人的逻辑,因为我也没有想到更好的了,如果大家有更好的方法也可以分享。

    3、获取不到sheet对象,或者是明明获取到sheet对象了,打了断点的时候,代码也能拿到数据,就是在导出后,没有数据显示。

    XSSFSheet sheet = workbook.getSheet(modelName);  如何是读取模板的话,建议大家根据表名称来获取表对象,

    如果是更加实用来获取workbook.getSheetAt(index);得确保索引是对的,查看一下有没有隐藏表这些情况。

    (但是得确保索引的对的,比如上图中有个正常结清的表,正常来说,索引是0,但是如果我之前有建其他表,那么正常结清表对应的索引就不是0了,也就是说,一般第一个表sheet1,第二个表sheet2,。。。。,对应的下标就是 0、1 、。。。。,但是如果你把sheet1给删除了,sheet2的下标还是1,所以如果你使用0来查找,是获取不对表对象的(这个点不太确定有没有这个问题,但是在做的过程确实碰到过这个问题,仅供参考))

    4、设置公式的时候,代码错误

    同样在设置公式的,也要防止冲突,也就是不能重复设置公式。

    这种情况,可能直接把数据给搞丢了

    以上就是个人在使用poi导出Excel表的一些感受了,其实除了重复跨行处理,重复设置单元格问题,其他都是一些比较细节的问题,那两个问题在百度找了挺长时间,都没有找到合适的方法,只能按着思路一遍一遍去捋,才找到问题的原因是因为冲突,最恶心的是这种情况,代码不会报错。

    个人觉得做这个类似功能最重要还是一个正确的逻辑吧,比如说我都是先设置每行,每个单元格数据后,先定位需要特殊处理的行和单元格的下标,然后保存到一个list,最后再做统一的处理。

    希望能给看到这边博客的同学一定的参考价值。

     

     

     

     

     

     

    展开全文
  • java导出excel数据报表

    2018-08-20 18:15:39
    1、大数据导出POI之SXSSFWorkbook ...2、JAVA笔记-如何将百万级数据高效的导出Excel表单 https://www.cnblogs.com/zou90512/p/3989450.html 3、使用maven引入Apache poi jar包 https:/...
  • 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组件(用于...
  • java 高级报表导出Excel

    2016-03-15 22:59:28
    java 做的高级报表导出Excel
  • java后台导出Excel表格

    2020-10-23 17:27:59
    java后台导出表格一般分两种:注解配置(@Excel)导出和自定义导出 注解配置(@Excel导出 添加poi依赖 <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</...
  • java 导出excel表格1.前言2.项目环境3.maven依赖4. 代码演示3.1.创建表头3.2 绘制数据5.整体代码6. 导出到本地配置6.1nginx配置6.2前端代码 1.前言 前几周,划水划的正嗨,客户突然说要加个数据批量导出成excel表格...
  • Java报表工具FineReport导出EXCEL的四种方式

    万次阅读 多人点赞 2016-03-15 13:24:34
    在实际的应用中会经常需要将数据导出excel导出的方式除原样导出还有分页导出、分页分sheet导出和大数据量导出,这些导出方式在JAVA程序中分别有不同的接口来实现。
  • Apache POI是一种流行的API,允许程序员使用Java程序创建,修改和显示MS Office文件。 它是由Apache Software Foundation开发和分发的开源库,用于使用Java程序设计或...HSSF - 用于读取和写入MS-Excel文件的xls格式
  • Java使用POI实现数据导出excel报表

    千次阅读 2018-09-17 11:20:40
    在上篇文章中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式。不仅仅简单的读取office中的数据.尤其是在生产管理或者财务系统中用的非常...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,819
精华内容 3,927
关键字:

java报表导出excel

java 订阅