SSH入门项目-8-POI报表

本文介绍Apache POI库的基本使用方法,包括如何通过Java API创建、读取和修改Excel文件,以及解决中文乱码等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跟着一起做了一个和供销合同相关的内容,这部分内容就不粘贴了。约等于没做什么。

POI简介与准备测试:

1,简介

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI(POI for .NET)来存取POI的功能。
这里写图片描述

2,测试:

2.1POI操作excel的8个步骤
  1. 创建工作簿workbook
  2. 创建工作表sheet
  3. 创建行对象row(下表起始为0)
  4. 创建一个单元格对象cell(下标起始为0)
  5. 给单元格设置内容
  6. 设置单元格样式,设置字体大小等
  7. 保存,关闭流对象
  8. 下载
2.2测试代码
public class POI01Test {

    @Test
    public void testPoi() throws Exception{
        //1.创建工作簿
        Workbook wb = new XSSFWorkbook();

        //2.创建工作表Sheet
        Sheet sheet = wb.createSheet();

        //3.创建行对象Row
        Row row = sheet.createRow(3); //下标从0开始

        //4.创建单元格对象   从0记数
        Cell cell = row.createCell(3);

        //5.设置单元格内容 
        cell.setCellValue("刘洋");

        //6.设置单元格的样式
        CellStyle cellStyle = wb.createCellStyle();

        Font font = wb.createFont();//创建字体对象
        font.setFontName("叶根友行书繁");//设置字体名称
        font.setFontHeightInPoints((short)48);//设置字体大小

        cellStyle.setFont(font);//样式中添加一个字体样式

        cell.setCellStyle(cellStyle);

        //7.保存,关闭流
        OutputStream os = new FileOutputStream("C:/Users/liuyang19900520/Desktop/liutest.xlsx");//创建一个输出流
        wb.write(os);
        os.close();

        //8.下载
    }
}

留下2个连接地址为了以后用的时候参考
http://blog.youkuaiyun.com/houxuehan/article/details/50960259
http://blog.youkuaiyun.com/wushuang5566110/article/details/6415035

实现功能:

1,表头部分编写

注意合并单元格的编写

sheet.addMergedRegion(new CellRangeAddress(0, 0, 1, 8));// 横向合并单元格

2,标题的编写

String titles[] = { "客户", "订单号", "货号", "数量", "工厂", "工厂交期", "船期", "贸易条款" };

        // 创建小标题的行对象
        nRow = sheet.createRow(rowNo++);
        nRow.setHeightInPoints(26.25f);// 设置行高

        // 创建单元格对象,并设置内容 ,并设置样式
        for (String title : titles) {
            nCell = nRow.createCell(cellNo++);// 创建单元格对象
            nCell.setCellValue(title);// 设置内容
            nCell.setCellStyle(this.title(wb));// 设置样式
        }

3,下载的编写并说明一下工具类

DownloadUtil downUtil = new DownloadUtil();

        ByteArrayOutputStream baos = new ByteArrayOutputStream();// 流 内存中的缓存区
        wb.write(baos);// 将excel表格中的内容输出到缓存
        baos.close();// 刷新缓存

        HttpServletResponse response = ServletActionContext.getResponse();// 得到response对象

        downUtil.download(baos, response, "出货表.xlsx");// 如果是中文,下载时可能会产生乱码,如何解决?
3.1,download工具类主方法
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.2,download简单理解
  • ByteArrayOutputStream:装着写好excel workbook的流文件。在内存中的缓存区,不占用服务器位置。
  • HttpServletResponse:设置响应的Type和header,并且修正了中文乱码
  • String(name):中文的文件名,需要解决中文乱码

4,完成内容

4.1,根据选中的日期查询所有数据,得到符合要求的数据列表
4.2,遍历数据列表对象,创建行对象,设置格式
4.3,创建单元格对象,先重置cellNo=1,设置格式,确保每行都能重第一列开始添加数据。

在这个时候需要注意一下,在添加日期数据的时候,应该format一下日期格式。

4.4,中文名乱码修正
/**
     * 下载文件时,针对不同浏览器,进行附件名的编码
     * 
     * @param filename
     *            下载文件名
     * @param agent
     *            客户端浏览器
     * @return 编码后的下载附件名
     * @throws IOException
     */
    public String encodeDownloadFilename(String filename, String agent) throws IOException {
        if (agent.contains("Firefox")) { // 火狐浏览器
            filename = "=?UTF-8?B?" + new BASE64Encoder().encode(filename.getBytes("utf-8")) + "?=";
        } else { // IE及其他浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }

在工具中适配火狐浏览器的中文乱码,如果一开始导入不了这个base64的工具,需要进行一下配置
这里写图片描述
这里写图片描述

采用模板方式生成:

1,找到模板文件

/liussh_web/src/main/webapp/make/xlsprint/tOUTPRODUCT.xls

2,把创建工作簿和工作页的工作调整为读取

//1.读取工作簿
        String path = ServletActionContext.getServletContext().getRealPath("/")+"/make/xlsprint/tOUTPRODUCT.xls";
        System.out.println(path);

        InputStream is = new FileInputStream(path);
        Workbook wb = new HSSFWorkbook(is);

        //2.读取工作表
        Sheet sheet = wb.getSheetAt(0);

3,获取模板单元格的样式并保存起来

nRow = sheet.getRow(rowNo);//读取第三行
                CellStyle customCellStyle = nRow.getCell(cellNo++).getCellStyle();
                CellStyle orderNoCellStyle = nRow.getCell(cellNo++).getCellStyle();
                CellStyle productNoCellStyle = nRow.getCell(cellNo++).getCellStyle();
                CellStyle cNumberCellStyle = nRow.getCell(cellNo++).getCellStyle();
                CellStyle factoryCellStyle = nRow.getCell(cellNo++).getCellStyle();
                CellStyle deliveryPeriodCellStyle = nRow.getCell(cellNo++).getCellStyle();
                CellStyle shipTimeCellStyle = nRow.getCell(cellNo++).getCellStyle();
                CellStyle tradeTermsCellStyle = nRow.getCell(cellNo++).getCellStyle();

4,绘制表格的时候将样式替换。

这里写图片描述

这部分就先告一段落吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值