zoukankan      html  css  js  c++  java
  • java利用poi生成excel文件后下载本地

    1、该功能需要poi的jar包,链接: http://pan.baidu.com/s/1migAtNq 密码: 38fx。

    2、首先新建一个实体类,用以存放单个数据

    public class Test {
        private String x;
        private String y;
        private String value;
        
        public void setX(String x) {
            this.x = x;
        }
        public void setY(String y) {
            this.y = y;
        }
        public void setValue(String value) {
            this.value = value;
        }
        public String getX() {
            return x;
        }
        public String getY() {
            return y;
        }
        public String getValue() {
            return value;
        }
    }

    3、将数据合并成一个集合,例如list<Test> list;

    4、开始生成excel

    //1、创建workbook,对应一个excel
    HSSFWorkbook wb = new HSSFWorkbook();
    
    //1.5、生成excel中可能用到的单元格样式
    //首先创建字体样式
    HSSFFont font = wb.createFont();//创建字体样式
    font.setFontName("宋体");//使用宋体
    font.setFontHeightInPoints((short) 10);//字体大小
    font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
    //然后创建单元格样式style
    HSSFCellStyle style1 = wb.createCellStyle();
    style1.setFont(font);//将字体注入
    style1.setWrapText(true);// 自动换行
    style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中    
    style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
    style1.setFillForegroundColor(IndexedColors.LIGHT_YELLOW.getIndex());// 设置单元格的背景颜色
    style1.setFillPattern(CellStyle.SOLID_FOREGROUND);
    style1.setBorderTop((short) 1);// 边框的大小
    style1.setBorderBottom((short) 1);
    style1.setBorderLeft((short) 1);
    style1.setBorderRight((short) 1);
    
    //2、生成一个sheet,对应excel的sheet,参数为excel中sheet显示的名字
    HSSFSheet sheet = wb.createSheet("采集对象一致率");//3、设置sheet中每列的宽度,第一个参数为第几列,0为第一列;第二个参数为列的宽度,可以设置为0。//Test中有三个属性,因此这里设置三列,第0列设置宽度为0,第1~3列用以存放数据
    sheet.setColumnWidth(0, 0);
    sheet.setColumnWidth(1, 20*256);
    sheet.setColumnWidth(2, 20*256);
    sheet.setColumnWidth(3, 20*256);//4、生成sheet中一行,从0开始
    HSSFRow row = sheet.createRow(0);
    row.setHeight((short) 800);// 设定行的高度//5、创建row中的单元格,从0开始
    HSSFCell cell = row.createCell(0);//我们第一列设置宽度为0,不会显示,因此第0个单元格不需要设置样式
    cell = row.createCell(1);//从第1个单元格开始,设置每个单元格样式
    cell.setCellValue("x");//设置单元格中内容
    cell.setCellStyle(style1);//设置单元格样式
    cell = row.createCell(2);//第二个单元格
    cell.setCellValue("y");
    cell.setCellStyle(style1);
    cell = row.createCell(3);//第三个单元格
    cell.setCellValue("value");
    cell.setCellStyle(style1);
    //6、输入数据
    for(int i = 1; i <= list.size(); i++){
    cell = row.createCell(i);
        ……//操作同第5步,通过setCellValue(list.get(i-1).getX())注入数据
        ……
    }
    //7、如果需要单元格合并,有两种方式
    1、sheet.addMergedRegion(new Region(1,(short)1,1,(short)11));//参数为(第一行,最后一行,第一列,最后一列)
            
    2、sheet.addMergedRegion(new CellRangeAddress(2, 3, 1, 1));//参数为(第一行,最后一行,第一列,最后一列)
    //8、输入excel
    FileOutputStream os = new FileOutputStream(path+"test.xls");
    wb.write(os);
    os.close();
    5、执行完上述操作,excel已经生成在服务器的path目录下了,文件名为test。
    6、将文件发送至客户端。
    注意:在ie浏览器下,如果采用location.href='/ServletDownload.do';方式下载,不能在servlet中使用response.getWriter();输出,而应该用response.getOutputStream();
    否则存在下载后的excel直接在浏览器上打开,而不是指定文件路径后下载。其他浏览器未测试过。
    服务端代码
    1)、设置响应的头文件,会自动识别文件内容
    response.setContentType("multipart/form-data");
    2)、设置Content-Disposition
    response.setHeader("Content-Disposition", "attachment;filename=test.xls");
    3)、输出流
    OutputStream out = response.getOutputStream();
    4)、获取服务端生成的excel文件,这里的path等于4.8中的path
    InputStream in = new FileInputStream(new File(path));
    5)、输出文件
    int b;
    while((b=in.read())!=-1){
        out.write(b);
    }
    in.close();
    out.close();
    客户端代码
    location.href='/ServletDownload';

    以下记录一些poi常用功能(欢迎大家评论补充):

    合并行列:

    sheet1.addMergedRegion(new Region(sheet1CurrRow,(short)0,sheet1CurrRow,(short)4));//合并(起始行,起始列,结束行,结束列)

    sheet为HSSFSheet对象。里面四个参数依次对应合并的:起始行、起始列、结束行、结束列。

    例子:如下图中,数据4占据三列。调用上面方法,参数分别为1,0,1,2。

    冻结行列:

    sheet1.createFreezePane(0, 4, 0, 4);

    sheet1为HSSFSheet对象。里面的四个参数依次对应合并的:要冻结的列数、要冻结的行数、右边区域可见的左边列数,下面区域可见的首行。

    常用于对表格表头冻结,下列数据滚动表头仍保持在上方。

    设置编码格式:

    cell.setEncoding(HSSFCell.ENCODING_UTF_16);

    设置cell中格式为utf-16.用以应付可能存在的中文乱码问题。

    cell样式:

    HSSFCellStyle style = workbook.createCellStyle();//首先创建一个style

    style.setAlignment(align);//水平居左、居右、居中。使用HSSFCellStyle自带的参数:HSSFCellStyle.ALIGN_CENTER or ALIGN_LEFT or ALIGN_RIGHT

    style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居左、居右、居中。使用HSSFCellStyle自带的参数:HSSFCellStyle.VERTICAL_CENTER or VERTICAL_LEFT or VERTICAL_RIGHT

    style.setWrapText(true);//自动换行

    HSSFFont hssfFont = workbook.createFont();//创建字体
    hssfFont.setFontName(font);//字体样式:黑体、宋体等
    hssfFont.setFontHeightInPoints((short)size);//字体大小,short格式
    hssfFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//设置粗体,不需要可不设

    style.setBorderLeft(HSSFCellStyle.BORDER_THIN);//设置左边框
    style.setBorderBottom(HSSFCellStyle.BORDER_THIN);//设置下边框
    style.setBorderRight(HSSFCellStyle.BORDER_THIN);//设置右边框
    style.setBorderTop(HSSFCellStyle.BORDER_THIN);//设置上边框
    style.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));//设置数据格式:文本、货币、日期,百分比等
    HSSFDataFormat.getBuiltinFormat("(#,##0.00_);[Red](#,##0.00)")//创建数字格式,负数则为红色显示。传入的值必须为double等数字类型
    HSSFDataFormat.getBuiltinFormat("text")//创建文本格式
    HSSFDataFormat.getBuiltinFormat("yyyy-m-d")//创建日期格式,该方式展示的数据必须转为String类型,同时制作出来的excel表仍展示为文本类型,需要双击数据格才转为日期格式。建议采用下一种方法。
    HSSFDataFormat.getBuiltinFormat("0.00%")//创建百分比格式
    //创建日期格式数据,该方法传入的参数为Date类型,制作excel展示出去即为日期格式。
    HSSFDataFormat format= wb.createDataFormat();
    style.setDataFormat(format.getFormat("yyyy/m/d"));//括号中参数为指定的日期类型的格式。
  • 相关阅读:
    提高网站访问速度的34个方法
    ASP.NET MVC3学习笔记四(Controller)
    ASP.NET MVC3 读书笔记一(Razor视图)
    DataSet DataTable DataReader dataAdapter区别
    EF Code First(约定配置)
    asp.net中APPlication、Session和Cookie的区别
    ASP.NET MVC3 读书笔记三(数据注解Dataannotation和验证)
    一步步构建大型网站架构
    ASP.NET MVC3 读书笔记二(HtmlHelper)
    Sql 查询语句总结
  • 原文地址:https://www.cnblogs.com/yxth/p/6495244.html
Copyright © 2011-2022 走看看