POI报表导出步骤和常用设置

POI开发的步骤(固定,记住开发的步骤)
    创建一个工作簿workbook
    创建一个工作表sheet
    创建一个行row(下标起始位置为0)
    创建一个单元格cell(下标起始位置为0)
    给单元格设置内容
    给单元格设置样式(例如:设置单元格的字体和大小)
    保存,关闭流对象

    下载

POI支持微软的OLE2格式文件Office 2003及以下版本;同时支持微软的OOXML(Office Open XML)标准,也就是Office 2007以上版本。JXL只能实现对Excel 2003以下版本的支持。

POI使用HSSF对象操作OLE2格式Excel,文件后缀为.xls的;使用XSSF、SXSSF对象操作OOXML格式Excel,文件后缀为.xlsx的。

对于OLE2版本的Excel,一个Sheet工作表它的行最多支持到65536行,列支持到256列;

对于OOXML版本的Excel,一个Sheet工作表它的行支持到1048576行,列支持到16384列。

核心API:

// 创建excel(工作簿) 使用接口的方式来创建
Workbook wb = new HSSFWorkbook();

新建工作簿:
HSSFWorkbook wb = new HSSFWorkbook();    

打开工作簿:
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(xlsFile));


建立新的sheet对象:
HSSFSheet sheet = wb.createSheet("我的第一个工作簿");

选择第一个工作簿:
HSSFSheet sheet = wb.getSheetAt(0);

设置工作簿的名称:
wb.setSheetName(0, "我的第一个工作簿");    


创建行对象:
HSSFRow nRow = null;
nRow = sheet.createRow(1);            //第2行

指定列 创建单元格对象:
HSSFCell nCell = null;
nCell = nRow.createCell((short)(2));        //第3列


指定列 创建单元格对象:
nCell.setCellValue("我是单元格");

// 获取到样式的对象
CellStyle style = wb.createCellStyle();

// 创建字体对象
Font font = wb.createFont();
// 设置字体大小
font.setFontHeightInPoints((short) 16);
// 设置字体的名称
font.setFontName("楷体");
// 设置字体
style.setFont(font);


设置样式    注意:样式不能重复设置
nCell.setCellStyle(leftStyle(wb));


文件下载方法1:

先在服务器产生临时文件,再下载临时文件。

    关闭保存excel文件
    FileOutputStream fOut = new FileOutputStream(xlsFile);        //创建xls文件,无内容 0字节
    wb.write(fOut);                            //写内容,xls文件已经可以打开
    fOut.flush();                            //刷新缓冲区
    fOut.close();                            //关闭


文件下载方法2:

        
        //7.生成excel文件
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();            //生成流对象
        wb.write(byteArrayOutputStream);                                //将excel写入流

        //工具类,封装弹出下载框:        
        String outFile = "生产厂家通讯录.xls";
        DownloadBaseAction down = new DownloadBaseAction();

        down.download(byteArrayOutputStream, response, outFile);

 

    public void download(ByteArrayOutputStream byteArrayOutputStream, HttpServletResponse response, String returnName) throws IOException{
        response.setContentType("application/octet-stream;charset=utf-8");
        returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1"));            //保存的文件名,必须和页面编码一致,否则乱码
        response.addHeader("Content-Disposition",   "attachment;filename=" + returnName);  
        response.setContentLength(byteArrayOutputStream.size());
        
        ServletOutputStream outputstream = response.getOutputStream();    //取得输出流
        byteArrayOutputStream.writeTo(outputstream);                    //写到输出流
        byteArrayOutputStream.close();                                    //关闭
        outputstream.flush();                                            //刷数据
    }

文件下载方法3:(适用于struts2)


        ServletActionContext.getResponse().setContentType("application/octet-stream");
        String returnName = ServletActionContext.getResponse().encodeURL( new String("购销合同.xls".getBytes(), "ISO-8859-1"));
        ServletActionContext.getResponse().addHeader("Content-Disposition", "attachment;filename=" + returnName);

        wb.write(ServletActionContext.getResponse().getOutputStream());

文件下载方法4:

        //下载文件
        response.setContentType("application/octet-stream");
        String returnName = response.encodeURL( new String("生产厂家通讯录.xls".getBytes(), "ISO-8859-1"));
        response.addHeader("Content-Disposition", "attachment;filename=" + returnName);

        wb.write(response.getOutputStream());

字体修饰:

    //设置单元格样式
    private HSSFCellStyle leftStyle(HSSFWorkbook wb){
        HSSFCellStyle curStyle = wb.createCellStyle();
        HSSFFont curFont = wb.createFont();                    //设置字体
        //curFont.setFontName("Times New Roman");                //设置英文字体
        curFont.setFontName("微软雅黑");                    //设置英文字体
        curFont.setCharSet(HSSFFont.DEFAULT_CHARSET);                //设置中文字体,那必须还要再对单元格进行编码设置
        curFont.setFontHeightInPoints((short)10);                //字体大小
        curFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);             //加粗

        curStyle.setFont(curFont);
        
        curStyle.setBorderTop(HSSFCellStyle.BORDER_THICK);            //粗实线
        curStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);            //实线
        curStyle.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);            //比较粗实线
        curStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);            //实线
        
        curStyle.setWrapText(true);                          //换行   
        curStyle.setAlignment(HSSFCellStyle.ALIGN_RIGHT);            //横向具右对齐
        curStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);        //单元格垂直居中
        
        return curStyle;
    }


=================== web环境 ===================

设置打印方向:默认纵向

PrintSetup ps = sheet.getPrintSetup();
ps.setLandscape(true);                            //横向打印


自适应列宽:
//bug 对中文支持不好,列宽不够宽
for(int i=0 ;i<titles.length;i++){
    sheet.autoSizeColumn((short)i);
}

设置行高:
nRow.setHeightInPoints(18);

设置列宽:
sheet.setColumnWidth((short)colNo, (short)(256*8));


设置每列默认宽度:
sheet.setDefaultColumnWidth((short) 20);


设置标题:
将第一行作为标题,即每页都打印此行 sheetN,startCol,stopCol,startRow,stopRow

wb.setRepeatingRowsAndColumns(0,1,8,0,1);

页脚:
HSSFFooter footer = sheet.getFooter();
footer.setRight("第"+HSSFFooter.page()+"页 共"+HSSFFooter.numPages()+"页     ");    //页数



工具类-单元格自适应高度:
float height = pioUtil.getCellAutoHeight(extcproducts, 12f);
nRow.setHeightInPoints(height);                            //(一行字+行之间的间隙)*行数
    // 计算行高度,实现行自动适应高度 defaultRowHeight = 12.00f; //每一行的高度指定   目前只实现根据回车多行来判断,不能根据单元格宽度自动回行来判断
    public float getCellAutoHeight(String str, float defaultRowHeight) {
        if (str == null) {
            return defaultRowHeight;
        }
        float height = 0.00f;
        int n = 0;
        if (str.endsWith("\n")) {
            n = str.split("\n").length; // 回车个数
        } else {
            n = str.split("\n").length + 1; // 回车个数
        }
        height = defaultRowHeight * n;

        return height; // 计算
    }

sheet.setRowBreak(行数);                //在第startRow行设置分页符

合并单元格:
//纵向合并单元格
Region region = null;
region = new Region(curRow-1, (short)(1), curRow-1+3, (short)1);    
sheet.addMergedRegion(region);

//横向合并单元格
CellRangeAddress
sheet.addMergedRegion(new CellRangeAddress(开始行,结束行,开始列,结束列));

// 横向居中
style.setAlignment(CellStyle.ALIGN_CENTER);
// 纵向居中
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
获取模板:

        int curRow = 0;        //当前行
        int colNo = 1;        //当前列
        
        //得到模板路径
        String rootPath = getClass().getResource("/").getPath().replace("/WEB-INF/classes/", "/").substring(1);
        String xlsFile = rootPath + "/make/xlsprint/tOUTPRODUCT.xls";
        
        //新建临时目录,存放excel        /root/web/tmpfile/yyyy-mm-dd/...
        String filePath = "/web/tmpfile/" + UtilFuns.sysDate()+"/";
        File tmpDir = new File(rootPath + filePath);
        if(!tmpDir.exists()){
            tmpDir.mkdirs();        //创建多级目录
        }
        
        FileUtil fu = new FileUtil();
        String sFile = fu.newFile(rootPath+filePath, "outproduct.xls");            //防止文件并发访问
        
        String outFile = rootPath+filePath+sFile;        //输出文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值